git reset, git checkout, git revert 区别 (译)

博客原文地址: http://blog.mexiqq.com/index.php/archives/3/php

题记:团队中大多数成员使用 sourceTree 和 github 两款 git 工具,然而你们对于图形化工具提供的 reset,checkout,revert 功能点并非很了解,甚至于混淆,而后凭借猜想去使用。功夫不负有心人,在尝试过屡次冲突处理或分支开发的坑后,终于造成了本身的一套使用方式,可喜可贺。然而问题的解决方案的并非效率最高的,内部的执行过程咱们也不清楚,这对于一个自律的程序艺术家是没法接受的。基于这个问题,翻译这篇博客,为 git 中高级用户的 undo 操做提供参考。鼓励在熟悉命令行操做再经过图形化工具提升开发效率。水平有限,释疑为主,翻译为辅git

Reset Checkout and Revert

原文地址: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

请输入图片描述

commit 级别的操做

传递给 git resetgit checkout的参数会决定命令的做用范围。当命令并不包括含一个文件路径时,命令做用于整个 commit工具

Reset:

commit 级别上,git reset 命令移动 HEAD 到当前分支的一个 commit, 这能够用来撤销当前分支的一些 commitspa

例如,下面的命令会让 `hotfix` 分支回退两个 commits命令行

git checkout hotfix翻译

git reset HEAD~2

先前在 HEAD 以前的两次 commit 如今处在 HEAD 以后,这意味着他们在下一次 git 提交时被做为垃圾删掉,换句话说这两次提交会被抛弃。以下图所示:

请输入图片描述

git reset用于撤销未被提交到远端的改动。除了能够移动当前分支的HEAD,你能够经过不一样的标记选择修改 staged snapshot 或者 working directory

  • --softstaged snapshotworking directory 都未被改变 (建议在命令行执行后,再输入 git status 查看状态)

  • --mixedstaged snapshot 被更新, working directory 未被更改。【这是默认选项】(建议同上)

  • --hardstaged snapshotworking directory 都将回退。

--hard 很危险,它会直接回退你以前全部的修改,使用前,能够事先保存 commit id.

请输入图片描述

【这些标记常常和HEAD一块儿使用。例如,git reset --mixed HEAD可撤销全部缓存改动,可是保留他们在工做目录下。git reset --hard HEAD可完全删除没有提交的改动。】

checkout

到如今为止,你应该已经熟悉 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 的代码颇有用。然而,若是再次添加新的提交就没法返回原先的状态。所以,你应该在修改前老是建立一个新的分支。

Revert

git revert 命令经过建立一次新的 commit 来撤销一次 commit 所作出的修改。这种撤销的方式是安全的,由于它并不修改 commitm history, 好比下边的命令将会查出倒数第二次(即当前commit的往前一次)提交的修改,并建立一个新的提交,用于撤销当前提交的上一次 commit

git checkout hotfix

git revert HEAD~2

以下图所示:

请输入图片描述

File 级别的操做

git resetgit checkout 命令一样能够接受一个可选的文件路径做为参数,这样能够将操做限制在一个单独的文件中。

Reset:

当调用一个文件路径时,git reset 命令会更新 staged snapshot 去匹配某次 commit。 下面的命令将会使文件回退一个 commit

git reset HEAD~1 [文件](不建议使用)

请输入图片描述

【--soft、--mixed、--hard标记此时不起做用,会更新staged snapshot,但不更新working directory】

Checkout

git checkout 命令 和 git reset 相似,除了它会更新 working directory, 而不是 staged snapshot

以下命令将会更新 working directory 去匹配某次 commit

git checkout HEAD~1 [文件]
请输入图片描述

Summary:

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 不支持
相关文章
相关标签/搜索