git使用总结(二)
diff操作
在没有使用git add
的时候,也就是文件还在工作目录当中的时候,查看修改了那些代码:
1 | git diff |
在git add
之后,git commit
之前,查看代码变化,也就是查看暂存区的代码变化:
1 | git diff --cached |
或者
1 | git diff --staged |
git commit
之后,查看代码变化,也就是查看git仓库的代码变化:
要用到git lg
来查找哈希码,比如77948e7
1 | git show 77948e7 |
撤销操作
撤销对文件的修改
撤销对文件名为file的文件的修改,当file仅仅存在于工作目录当中有效
1 | git checkout -- file |
提交信息写错了,尝试重新commit
比如commit之后发现需要再加上一个文件
1 | git commit -m 'initial commit' |
最终你只会有一个提交,第二次提交将代替第一次提交的结果。
撤销掉commit,回退到上一个版本
先使用git lg
来查出想要回退的哈希码,比如说是 77948e7
1 | git reset --hard 77948e7 |
就将代码回退到哈希码对应的版本了
commit的message写错了,想改动,使用git rebase -i
偷天换日
先使用git lg
查询出哈希码,比如说是 77948e7
1 | git rebase -i 77948e7 |
这就弹出了启动了git的编辑器,如果前面编辑器默认选的是vim,这里就启动vim
1 | pick e353fbc Release LevelDB 1.17 |
把pick改成edit或者e,然后退出vim,按照提示,接下来一步应该是
1 | git commit --amend |
会再次启动vim,
1 | 服务端网络编程中需要注意点 |
可以看到message就是第一行的字符串,然后只需要改第一行,保存并退出
随后在命令行执行
1 | git rebase --continue |
再次进入git lg
,可以看见message已经改变了
不小心commit了多次,但是想把commit合并,增加message的可读性
和上面一样,启动
1 | git rebase -i 77948e7 |
但是这次只需要把pick改成fixup或者f,就可以了
git分支
这个话题可太大了,官网上的git分支手册都有那么长。但是我认为最简单一句话能概括分支就是:从产生分支的那一刻开始,主干的代码和分支代码是一致的,但是往后主干和分支就是两条线了,其实可以看做两个project。和两个project不同的地方在于主干和分支可以使用命令merge简单合并,但是两个project不行。
查看分支
查看本地分支
1 | git branch |
查看远程分支
1 | git branch -r |
-r是remote的意思
查看全部分支,就是本地分支和远程分支一起展示出来
1 | git branch -a |
-a是all的意思
创建分支
1 | git branch from_author |
这样,就创建了一个名为from_author的分支
切换分支
切换到from_author的分支
1 | git checkout from_author |
创建分支和切换分支二合一:
1 | git checkout -b from_author |
-b是branch的意思。这个命令我经常使用
合并分支
如果你在master分支上,想要合并from_author分支,只需要执行
1 | git merge from_author |
合并分支,解决冲突
冲突的产生:
比如我现在在master分支上,修改了index.md这个文件,加上一行”this is master” 然后git add .
和git commit -m"a"
然后切换到from_author分支上,也修改index.md这个文件,加上一行”this is from_author”然后git add .
和git commit -m"b"
现在我再次切换回master,使用git merge from_author
来合并分支:
1 | Auto-merging index.md |
将出现CONFLICT错误。
这个时候git是没有办法帮你的,只能够手动修改index.md文件,把冲突去掉,再次commit一下。手动修改index.md是唯一解决冲突的方法。
如果不知道有哪些文件有冲突的话,使用grep来查找
1 | grep -Ir "<<<\ HEAD" ./ |
删除分支
1 | git branch -d from_author |
-d就是delete的意思
远程分支
使用git branch -r
展示所有远程分支,可以看见远程分支的命名都是(remote)/(branch) 形式命名。其实关于远程分支我也只需要记住这一点。
远程仓库名字 “origin” 与分支名字 “master” 一样,在 Git 中并没有任何特别的含义一样。 同时 “master” 是当你运行 git init 时默认的起始分支名字,原因仅仅是它的广泛使用,“origin” 是当你运行 git clone 时默认的远程仓库名字。
从远程仓库fetch代码
直接使用git pull
拉取远程master分支
1 | git pull origin master |
使用git fetch 和 git rebase origin来代替git pull
git 少用pull 多用fetch和merge这篇文章阐述了使用fetch来代替pull的原因,其实我觉得多数情况之下pull是没什么问题的。
下面是git fetch的使用方法:
首先使用git remote -v
来查看git的远端代码
1 | origin git@github.com:username/project.git (fetch) |
这个意思就是说当fetch的时候,origin代表了git@github.com:username/project.git,当pull的时候,origin代表了git@github.com:username/project.git
那么拉取代码使用
1 | git fetch origin |
把从origin拉取下来的代码合并到本地使用
1 | git rebase origin |