Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

git记录 #30

Open
lovecn opened this issue Jun 9, 2015 · 3 comments
Open

git记录 #30

lovecn opened this issue Jun 9, 2015 · 3 comments

Comments

@lovecn
Copy link
Owner

lovecn commented Jun 9, 2015

git status -s
功能:用来比较,当前的工作目录和缓存区的状态
??:该文件还没有被git进行追踪
A:当前工作目录同缓存文件相比,新增加的文件
M:当前目录同缓冲区相比,已经进行了改变(Modify)
D: 当前目录同缓冲区相比,删除的文件

注意:git status 是以缓冲区中的内容为标准的,所有的AMD都是以缓冲区的内容为准,经过同缓冲区的对比,发现当前工作区进行了AMD等操作

git diff
功能:如果没有其他参数,git diff 会显示自从你上次提交快照之后尚未缓存的所有更改
注意:对比的参照点仍然是缓冲区中的内容,将当期那工作目录中的文件同缓冲区做对比

git diff --cached
功能:将缓冲区的内容同快照中的内容进行对比

git diff HEAD
功能:将当前工作目录中的文件,同快照中的内容进行对比

git commit -m '对本次提交的快照的说明'
功能:将缓冲区中的内容添形成一次快照(也就是打一个版本)

git commit -am '对本次提交的说明'
功能:同git commit -m 的功能类似,但是,由于多了一个a参数。这样就有一个隐含的操作,将已经追踪的文件先进行自动提交(注意:是已经追踪到的文件)!

git log :
功能:显示从最近到最远的提交日志
个人体会是,我们最想要的就是commmitid和对本次提交的说明

git reset --hard commitid
功能:回到指定的某个版本,注意,是连通当前的工作区一起回去,很可怕的一个命令。如果你并没有对当前的工作目录进行提交,而且还执行了这个操作,那么就杯具了,你上次提交后所有的更改内容就全部丢失而来,本人在这方面就犯了很大的错误!想想都是血泪啊!

git reflog
功能:用来记录你的每一次命令,这样我们就可以看到所有的commitid了(而git log只能够用来查看当前版本的commitid以及以前提交版本的commitid)

git checkout -- file
功能:将缓冲区或者快照中的指定文件恢复到当前的工作目录
注意:--是必须要写的,如果不写的话,就成为了分支的切换。
同时,我们应该明白,恢复的先后顺序。执行完改命令后,如果缓冲区中有该文件的话,那么工作目录就会恢复到缓冲区的样子!如果缓冲区没有文件的话,那么就会恢复到最新提交的版本上面!

git reset HEAD file
功能:将缓冲区中的指定文件,回退到最新的一次commit版本。
这个命令还是很有用的,如果我们误操作了,并且进行了add,那么此时再用 git checkout --file 恢复工作区中的内容的话,就没有任何效果了!但是执行git reset HEAD file这个命令,就可以将最新一次的commit中的file文件拉回到缓冲区中,然后在通过git checkout -- file命令,恢复到工作区中!

git branch
功能:展现当前的所有分支,前面带有 "*" 是所在分支

git branch 分支名
功能:创建一个新的分支

git checkout -b 分支名
功能:创建新分支,并切换到改分支上

git branch -d 分支名
功能:删除指定的分支(不可以删除当前所在分支)

git checkout 分支名
功能:用于在不同的分支之间进行切换
注意:由于版本的不同,在操作上可能有所不同!在某些版本上必须先进行git add , commit 之后,才能进行分支的切换!(1.8.3之前的貌似都需要提交才行),而有的分支则不需要进行此操作!

git merge 分支名
功能:将指定的分支合并到当前的分支
关于分支的合并我想说一下,自己的理解,个人认为所谓合并,其实是对所有修改的合并!这里举个例子说明会更好一些:
A作家写初步完成了一篇长篇小说的初稿,但是呢仍然需要对这篇长篇小说进行修修改改!处于对质量的严格要求!此时A作家找到了B作家,希望B作家提出宝贵的意见,让他对这篇小说也进行修改!等修改的差不多了,A作家,就让B作家把他的修改内容发给A作家,A作家再将B作家的修改添加到自己既有的修改上面!(--这应该就是合并)
如果A作家的修改的内容,B作家也进行了修改,那么就有A作家去决定改要谁的修改!(--这就是解决冲突)
git记住密码
建个文件,windows命名为_netrc,linux或mac命名.netrc

machine git.abc1.com
login username
password password
machine git.abc2.com
login username
password password

username是你的用户名,password是你的密码,
machine是你的git网站域名。
可以添加多个。
然后把这个文件放在个人目录下,
windows在C:\Users\XXXXXX目录下,
linux或mac在 ~/ 下

命令:
ssh-copy-id 密钥公共id 代码服务器的地址
例如:
ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]

注:
前提已经生成过密钥,生成密钥的命令:
ssh-keygen -t rsa -C 邮箱地址
例如:
ssh-keygen -t rsa -C "[email protected]"


假设你有3个commit如下:

commit 3
commit 2
commit 1
其中最后一次提交commit 3是错误的,那么可以执行:

git reset --hard HEAD~1
你会发现,HEAD is now at commit 2。

然后再使用git push --force将本次变更强行推送至服务器。这样在服务器上的最后一次错误提交也彻底消失了。
值得注意的是,这类操作比较比较危险,例如:在你的commit 3之后别人又提交了新的commit 4,那在你强制推送之后,那位仁兄的commit 4也跟着一起消失了。

git_Windows_MinGW命令行如何复制粘贴?
1,选中 要 编辑 的
2,在 标题栏 -> 右键 -> 编辑 -> 复制/粘贴

还有一种方式

在标题栏 -> 右键 -> 属性 -> 快速编辑模式勾上。
然后就能够左键选中,右键复制,右键粘贴

Git Bash,有如下命令可以做到复制:

clip.exe < '待复制的文件'
例如:

clip.exe < ~/.ssh/id_rsa.pub
这样,你的ssh public key就复制到粘贴板里了

使用shift + insert应该是可以粘贴的,至于复制,应该可以配置为选中即复制。

另外在推荐一个windows下的命令神器:http://conemu.github.io/ -- tab标签,各种快捷键,还有各种配色很全很方便 -- 更重要地是,你就可以使用你熟悉的Ctrl+C/V了

分支和标签就是简单的文件(基本上是这样),包含指向该提交的SHA-1哈希值 所有的分支指针都保存在.git/refs/heads里,HEAD在.git/HEAD里,而标签保存在.git/refs/tags git checkout -b myfeature origin/myfeature 在远端服务器上删除一个分支(注意分支名前面的冒号) git push origin :twitter-experiment 查看本地分支和远端分支的差异:

$ git diff master..john/master git branch -m twitter-experiment 
$ git branch -m feature132 twitter-experiment 如果你只指定了一个分支参数,就会重命名当前分支
$ git stash
# 做点其他事情...
$ git stash pop 许多人建议使用git stash apply来代替pop,不过如果这样做的话最后会遗留一个很长的储藏列表。而“pop”会在全部加载后自动从堆栈中移除。 查看每次提交的具体改动$ git log -p  找特定提交者git log --author=Andy git log --since=2.months.ago --until=1.day.ago --author=andy -S "something" --all-match git log origin/master..new
# [old]..[new] - 所有你还没有推送的提交  轻松地取消改动:

$ git reset HEAD lib/foo.rb git commit --amend
这会取消最后一次提交git checkout --lib/foo.rb 找出来谁改动了某个文件里的某行代码会很有用 git gui blame FILE git count-objects -v 

Git 2.x 默认的是 simple,意味着执行 git push 没有指定分支时,只有当前分支会被 push 到你使用 git pull 获取的代码。  而对于 simple ,请输入:git config --global push.default simple
设置sshkey后还要用户密码
编辑项目目录下的.git/config文件
找到:
[remote "origin"]
    url =https://github.com/hit9/hit9.github.com.git
    fetch = +refs/heads/*:refs/remotes/origin/*
把url处改成ssh地址:

[remote "origin"]
    url [email protected]:hit9/hit9.github.com.git
    fetch = +refs/heads/*:refs/remotes/origin/*
url是 https的时候会采用用户名认证. 是ssh地址的时候才会采用ssh认证


多个 github 账号,怎样配置对应的 SSH key
使用 ssh config(ssh_config Recipes). 在 .ssh 目录下新建一个 config 文件,配置对应不同 Host 使用不同的 key. 例如:

Host gitcafe.xxx
HostName gitcafe.com
User git
IdentityFile ~/.ssh/id_rsa_gitcafe_xxx

Host gitcafe.yyy
HostName gitcafe.com
User git
IdentityFile ~/.ssh/id_rsa_gitcafe_yyy

Host github.xxx
HostName github.com
IdentityFile ~/.ssh/id_rsa_github_xxx
# 此行是代理配置,请无视
ProxyCommand ~/.ssh/socksproxywrapper.sh %h %p
比如 id_rsa_github_xxx 是你在 github 上 xxx 用户的 key, 就可以使用

git clone [email protected]:xxx/project.git
这样的方式来拉取 github 上的项目。
@lovecn
Copy link
Owner Author

lovecn commented Jun 15, 2015

@lovecn
Copy link
Owner Author

lovecn commented Jun 21, 2015

http://info.9iphp.com/25-git-advance-skills/ 25个 Git 进阶技巧

@lovecn
Copy link
Owner Author

lovecn commented Jul 18, 2015

Git 参考手册http://itmyhome.com/git/inspect.html

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant