博客原文地址: http://blog.mexiqq.com/index.php/archives/3/php
题记:团队中大多数成员使用 sourceTree 和 github 两款 git 工具,然而你们对于图形化工具提供的 reset,checkout,revert 功能点并非很了解,甚至于混淆,而后凭借猜想去使用。功夫不负有心人,在尝试过屡次冲突处理或分支开发的坑后,终于造成了本身的一套使用方式,可喜可贺。然而问题的解决方案的并非效率最高的,内部的执行过程咱们也不清楚,这对于一个自律的程序艺术家是没法接受的。基于这个问题,翻译这篇博客,为 git 中高级用户的 undo 操做提供参考。鼓励在熟悉命令行操做再经过图形化工具提升开发效率。水平有限,释疑为主,翻译为辅
git
原文地址:https://www.atlassian.com/git/tutorials/resetting-checking-out-and-revertinggithub
git reset, git checkout, git revert 命令是最有用的三条 git 命令。他们能够帮助你撤销 repo 的一些操做,而且前两条命令既能够用于 commit 级别,也能够用于 file 级别。缓存
由于他们很类似,因此很容易混淆。这片文章,咱们将比较他们的相同和不一样之处。安全
阅读本文前须要了解 git repo 的三大 components,分别是 working directory
(代码仓库) staged snapshot
(快照:add的缓存库) commit history
(commit历史) ,这将更好的帮助你理解这三条命令。svg
传递给 git reset
和 git checkout
的参数会决定命令的做用范围。当命令并不包括含一个文件路径时,命令做用于整个 commit
。工具
在 commit
级别上,git reset
命令移动 HEAD
到当前分支的一个 commit
, 这能够用来撤销当前分支的一些 commit
。 spa
例如,下面的命令会让 `hotfix` 分支回退两个 commits命令行
git checkout hotfix翻译
git reset HEAD~2
先前在 HEAD 以前的两次 commit 如今处在 HEAD 以后,这意味着他们在下一次 git 提交时被做为垃圾删掉,换句话说这两次提交会被抛弃。以下图所示:
git reset用于撤销未被提交到远端的改动。除了能够移动当前分支的HEAD,你能够经过不一样的标记选择修改 staged snapshot 或者 working directory
--soft
: staged snapshot
和 working directory
都未被改变 (建议在命令行执行后,再输入 git status 查看状态)
--mixed
: staged snapshot
被更新, working directory
未被更改。【这是默认选项】(建议同上)
--hard
: staged snapshot
和 working directory
都将回退。
--hard 很危险,它会直接回退你以前全部的修改,使用前,能够事先保存 commit id.
【这些标记常常和HEAD
一块儿使用。例如,git reset --mixed HEAD
可撤销全部缓存改动,可是保留他们在工做目录下。git reset --hard HEAD
可完全删除没有提交的改动。】
到如今为止,你应该已经熟悉 commit
级别的 git checkout
了。当你传送一个 branch name
名字时,你将更换当前的分支.
git checkout hotfix
上面的命令会切换 HEAD 到不一样的分支,而且更新当前的 working directory
去匹配。由于会覆盖当前的本地更改,因此更换分支前git
强制你完全放弃或者提交存储当前的更改。不一样于 git reset
, git checkout
不会废弃任何分支或提交。
你也能够 checkout
到任何一次 commit
,经过提供 commit Id
做为参数.
好比下面的命令。
git checkout HEAD~2/[commit id]
这对于 review
repo 的某个 version 的代码颇有用。然而,若是再次添加新的提交就没法返回原先的状态。所以,你应该在修改前老是建立一个新的分支。
git revert
命令经过建立一次新的 commit
来撤销一次 commit
所作出的修改。这种撤销的方式是安全的,由于它并不修改 commitm history
, 好比下边的命令将会查出倒数第二次(即当前commit的往前一次)提交的修改,并建立一个新的提交,用于撤销当前提交的上一次 commit
。
git checkout hotfix
git revert HEAD~2
以下图所示:
git reset
和 git checkout
命令一样能够接受一个可选的文件路径做为参数,这样能够将操做限制在一个单独的文件中。
当调用一个文件路径时,git reset
命令会更新 staged snapshot
去匹配某次 commit
。 下面的命令将会使文件回退一个 commit
。
git reset HEAD~1 [文件](不建议使用)
【--soft、--mixed、--hard标记此时不起做用,会更新staged snapshot,但不更新working directory】
git checkout
命令 和 git reset
相似,除了它会更新 working directory
, 而不是 staged snapshot
以下命令将会更新 working directory
去匹配某次 commit
git checkout HEAD~1 [文件]
commands | scope | common user cases | |
---|---|---|---|
git reset | Commit | Discard commits in a private branch or throw away uncommited changes | |
git reset | File | Unstage a file | |
git checkot | Commit | switch between branches or inspect old snapshot | |
git checkout | File | Discard changes in the working directory | |
git revert | commit | Undo commits in a public branch | |
git revert | File | 不支持 |