Git

reset-checkout-revert

  • git
Reset, Checkout and Revert git reset、git checkout和git revert是git工具集中最常用的一些命令。它们都允许你对你的仓库undo某类改动,git reset和git checkout可作用于commits或files,revert只能作用于commits。 由于它们的功能非常的相似,在开发过程中很难区分哪个命令应该用于哪个开发场景。在这篇文章中我们将会比较这三个命令。希望你能在你的仓库中熟练地使用这些命令。 当你浏览这篇文章时,把每个命令的作用效果与git仓库的三个概念(工作目录,暂存区,提交历史)结合起来会对你很有帮助。 Commit级操作 git reset和git checkout根据传入的参数来决定其作用的范围。当参数中不含有文件路径时,它们作用于整个commits。这正是我们这个部分所要讨论的。注意,git revert不作用于files。 Reset 当作用于commit时,reset可以用于改变分支指针的指向。这可以被用来删除当前分支的commits。例如,下面的命令将hotfix分支向后移动两个commits。 git checkout hotfix git reset HEAD~2 hostfix分支尾部的两个commits现在处于悬挂状态,这意味着在下次git执行垃圾回收时这两个commits会被删除。换句话说,你在告诉git正在抛弃这两个commits。请看下面图示: git reset的这种用法常用于undo还没有被共享的改动。当你正添加一个新的feature且突然想重新开始时,这是你的goto命令。 除了在当前分支来回移动,通过命令行选项git reset也可用来改动暂存区和工作目录: * –soft – 不改动暂存区和工作目录 * –mixed – 更新暂存区到特定的commit,但是不改动工作目录。这是默认行为。 * –hard – 更新暂存区和工作目录到特定commit 请看下面图示: 这些选项常被用于HEAD commit。例如,git reset --mixed HEAD将暂存区的改动移回工作目录。另外,如果你想完全抛弃所有未提交的改动,可以使用git reset --hard HEAD。这两个场景也是最常用的。 当git reset作用于非HEAD commit时一定要格外小心,因为它变更了commit history。 Checkout 现在你应该很熟悉git commit作用于commits了。当作用于分支名时,它允许你在在分支间进行切换。 git checkout hotfix 上面的命令将HEAD指向另一个分支并更新工作目录到相应分支。由于这个命令有可能覆盖本地的变更,git会要求我们commit或stash工作目录可能会被覆盖的变更。git reset与git checkout不切换分支。