题记:团队中大多数成员使用 sourceTree 和 github 两款 git 工具,然而大家对于图形化工具提供的 reset,checkout,revert 功能点并不是很了解,甚至于混淆,然后凭借猜测去使用。功夫不负有心人,在尝试过多次冲突处理或分支开发的坑后,终于形成了自己的一套使用方式,可喜可 贺。然而问题的解决方案的并不是效率最高的,内部的执行过程我们也不清楚,这对于一个自律的程序艺术家是无法接受的。基于这个问题,翻译这篇博客,为 git 中高级用户的 undo 操作提供参考。鼓励在熟悉命令行操作再通过图形化工具提高开发效率。水平有限,释疑为主,翻译为辅
Reset Checkout and Revert
原文地址:https://www.atlassian.com/git/tutorials/resetting-checking-out-and-reverting
git reset, git checkout, git revert 命令是最有用的三条 git 命令。他们可以帮助你撤销 repo 的一些操作,并且前两条命令既可以用于 commit 级别,也可以用于 file 级别。
因为他们很相似,所以很容易混淆。这片文章,我们将比较他们的相同和不同之处。
阅读本文前需要了解 git repo 的三大 components,分别是 working directory
(代码仓库) staged snapshot
(快照:add的缓存库) commit history
(commit历史) ,这将更好的帮助你理解这三条命令。
commit 级别的操作
传递给 git reset
和 git checkout
的参数会决定命令的作用范围。当命令并不包括含一个文件路径时,命令作用于整个 commit
。
Reset:
在 commit
级别上,git reset
命令移动 HEAD
到当前分支的一个 commit
, 这可以用来撤销当前分支的一些 commit
。
例如,下面的命令会让 `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
可彻底删除没有提交的改动。】
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 reset
和 git 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
Summary:
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 | 不支持 |
相关推荐
Git的`git revert`和`git reset`命令可撤销更改,但前者创建新的提交,后者直接修改历史。遇到冲突时,开发者需要手动编辑冲突文件,然后使用`git add`和`git commit`完成解决。 **8. Git钩子** Git钩子是一系列...
git视频教程.3.5.Git 命令 - git reset.mp4 git视频教程.4.1.Git 命令 - git branch.mp4 git视频教程.4.2.Git 命令 - git branch.mp4 git视频教程.4.3.Git 命令 - git branch.mp4 git视频教程.4.4.Git 命令 - git ...
9. **版本回溯**:Git的版本历史查询功能强大,`git log`显示提交历史,`git revert`或`git reset`可以回滚到特定版本。 10. **标签管理**:`git tag`命令用于创建和管理标签,常用于标记重要的里程碑或版本。 ...
6. **回溯与撤销**:`git reset`、`git revert`和`git checkout`命令的用法,如何恢复错误的提交或者回到历史状态。 7. **标签管理**:使用`git tag`为特定版本打标签,方便回溯和发布。 8. **Git的高级功能**:子...
例如,了解如何创建和切换分支(`git checkout -b`),如何解决合并冲突(`git diff`、`git merge --abort`或`git mergetool`),以及如何回退到之前的版本(`git reset`或`git revert`)。此外,学习使用GitHub或...
3. 撤销操作:讲解`git revert`、`git reset`和`git checkout`在撤销更改时的区别和应用场景。 4. .gitignore文件:如何设置和使用,避免不必要的文件被追踪。 5. Git钩子:了解`pre-commit`、`post-receive`等钩子...
在标签“git”相关的其他知识点中,包括但不限于分支管理(如`git branch`, `git checkout`, `git merge`, `git rebase`)、提交历史查看(`git log`)、回退版本(`git reset`, `git revert`)、标签管理(`git tag...
6. **撤销操作**:Git允许你在历史记录中移动,撤销错误的操作,如`git reset`和`git revert`。 7. **合并与衍合**:`git rebase`是另一种合并策略,它将你的分支修改应用到最新的上游分支上,保持提交历史的线性。...
6. **撤销操作**:Git提供了一些强大的撤销操作,如`git reset`和`git revert`,可以在不影响历史记录的情况下回退到之前的版本。 7. **标签管理**:`git tag`命令用于标记特定的提交,通常用于发布版本或者重要...
- 撤销版本库修改(已经`commit`, 尚未推送到远程):使用`git revert`命令或`git reset`命令。 3. **远程仓库操作**: - `git clone [url]`:从远程仓库克隆一个项目到本地。 - `git remote -v`:查看远程仓库...
- 已提交的更改:`git revert <commit-hash>`或`git reset --hard <commit-hash>`,后者会抹去历史记录,谨慎使用。 10. **标签管理** `git tag <tag-name>`创建标签,`git tag`列出所有标签,`git show ...
`git revert <commit>`用于撤销某个特定的提交,并创建一个新的提交来表示这一更改。 在查看提交历史方面,`git log`显示所有提交,从最新到最旧。`git log -p <file>`展示了特定文件的提交历史。`git blame <file>...
- **撤销更改**:`git reset`和`git checkout`可以撤销工作目录或暂存区的更改。 5. **分支管理** - **创建分支**:`git branch`创建新的开发分支。 - **切换分支**:`git checkout`在分支间切换。 - **合并...
3. **重置与回溯**:`git reset --hard`、`git revert`和`git checkout`等命令可用于撤销更改或恢复到特定状态。 **六、Git图形界面工具** 对于不熟悉命令行的用户,Git还支持多种图形化界面工具,如SourceTree、...
`git reset`和`git revert`命令可以帮助你撤销错误的修改或回退到特定版本。 5. 冲突解决: 当两个开发者修改了同一部分代码时,Git会报告冲突。通过编辑器手动解决冲突后,再用`git add`和`git commit`提交解决...
对于版本回溯,`git log` 显示提交历史,`git reset` 和 `git revert` 分别用于撤销提交和创建新提交以恢复之前的状态。而`git reflog` 可以帮助找回丢失的分支或提交。 总之,Git 2.32.0.2的64位版本提供了稳定且...
5. 撤销与重做:Git提供了一系列工具,如`git reset`、`git revert`和`git checkout`,用于撤销错误操作或恢复到之前的版本状态。这些内容在书中都有详细的介绍和实例。 6. 版本回溯与解决冲突:通过`git log`、`...
如果误改了某个文件,可以使用`git checkout -- <file>`来恢复到最新提交的状态,或者`git reset HEAD <file>`配合`git checkout .`来还原所有未被追踪的更改。 7. **git clone拉取代码.txt**: `git clone`命令...