Git命令进阶(二)
2017-09-17 本文已影响27人
芒果味的你呀
首先,学习git命令时时刻记得git下的三种文件状态,【已修改文件】---git add ---【已暂存文件】--- git commit---【已提交文件】
$git reset --hard HEAD HEAD(泛指上一次提交)
- 适用场景:文件已经在暂存区(执行过git add 操作),但没有提交(未执行git commit操作),想要修复未提交文件的错误。
- 使用效果:文件状态变为未暂存,本地工作目录文件的内容也同时重置。
- 补充说明:如果想要撤销暂存区的修改,但是还想保留工作区(本地目录)的内容,git reset HEAD test.txt命令可以达到效果,使文件变成未暂存,工作目录还在,假如你又后悔了,想要重置本地,那就用接下来这条命令:git checkout -- test.txt
- git reset --hard HEAD~1 (回退上一次提交)
$git checkout . 清除未add的本地所有修改 同样的还有git clean -df
$git reset HEAD <file>
- 适用场景:取消已暂存的文件:也就是取消已经通过git add . 添加到了暂存的文件,撤销暂存区的某个文件。
- 使用结果:这样文件就又回到已修改未暂存的状态了。和上一个命令不同的是,这条命令本地工作目录还在,没有被重置。
$git revert HEAD
- 适用场景:已经执行git commit操作,即已经提交,但是后悔了,不想提交,
- 使用效果:撤销了最近的一次提交
- 补充:如果想要撤销上上次的提交 命令为git revert HEAD^
在这种情况下,git尝试去撤消老的提交,然后留下完整的老提交前的版本. 如果你最近的修改和要撤消的修改有重叠(overlap),那么就会被要求手工解决冲突(conflicts), 就像解决合并(merge)时出现的冲突一样.
$git checkout -- file
- 适用场景:未暂存的文件,即在本地目录,此时文件杂乱,想要恢复成上次提交的代码。
- 使用效果:本地代码重置
$git commit --amend
- 适用场景:假如刚刚做了一个commit,但是-m‘’里做的提交说明感觉不太满意,想要修改提交的说明;或是刚刚做了一个提交,但是发现本地还有文件忘记git add,你本想的是这个文件应该在刚才的提交内容里,可以现在忘记提了,此时可以git add file ,然后再执行这个命令。
- 使用效果:能让我们在代码发布前,添加一些新的文件或是修改你的提交注释(commit message).
$git rebase
- 适用场景:在origin分支外假如新建了一个分支mywork,此刻在新的分支上有两个新的提交,而主分支也有两个新的提交,这就意味着"origin"和"mywork"这两个分支各自"前进"了,它们之间"分叉"了。这个时候若想和origin分支合并有两种方式:
- 切换到origin分支git pull 拉取远程分支,然后和mywork分支合并git merge。结果看起来就像一个新的"合并的提交"。这种操作的结果如图图片1:
-
为了让"mywork"分支历史看起来像没有经过任何合并一样,可以在mywork分支上,执行git rebase origin操作这些命令会把你的"mywork"分支里的每个提交(commit)取消掉,并且把它们临时 保存为补丁(patch)(这些补丁放到".git/rebase"目录中),然后把"mywork"分支更新 到最新的"origin"分支,最后把保存的这些补丁应用到"mywork"分支上。这种操作的结果如图图片2:
图片 1.png
- 使用效果:"mywork"分支历史看起来像没有经过任何合并。
- 补充说明:遇到冲突后处理完,git add ,然后git rebase --continue
如果想让分支回到rebase开始前的状态,可以随时执行git rebase --abort
$git rebase 交互式rebase
- 适用场景:在老提交(older commit)里发现一个错误, 但是现在还没有发布到代码服务器上. 此时可以使用交互式rebase。
-
补充说明:一旦使用git rebase -i xxx(<commit id>)你所预设的编辑器会被调用,其中含有如下的内容:
图片 3.png
$git cherry-pick <commit id>
- 适用场景:把已经提交的分支从一个分支放到另一个分支
- 使用效果:可以在新分支上选择的合并之前的特点,十分常用。
说明:处理过程中也会遇到冲突,像正常处理冲突那样处理就好。