`
天梯梦
  • 浏览: 13741554 次
  • 性别: Icon_minigender_2
  • 来自: 洛杉矶
社区版块
存档分类
最新评论

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

 
阅读更多

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

 

Reset Checkout and Revert

 

原文地址:https://www.atlassian.com/git/tutorials/resetting-checking-out-and-reverting

hero

git reset, git checkout, git revert 命令是最有用的三条 git 命令。他们可以帮助你撤销 repo 的一些操作,并且前两条命令既可以用于 commit 级别,也可以用于 file 级别。

因为他们很相似,所以很容易混淆。这片文章,我们将比较他们的相同和不同之处。

阅读本文前需要了解 git repo 的三大 components,分别是 working directory(代码仓库) staged snapshot(快照:add的缓存库) commit history(commit历史) ,这将更好的帮助你理解这三条命令。

01

 

commit 级别的操作

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

 

Reset:

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

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

git checkout hotfix

git reset HEAD~2

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

02

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

  • --softstaged snapshotworking directory 都未被改变 (建议在命令行执行后,再输入 git status 查看状态)
  • --mixedstaged snapshot 被更新, working directory 未被更改。【这是默认选项】(建议同上)
  • --hardstaged snapshotworking directory 都将回退。

--hard 很危险,它会直接回退你之前所有的修改,使用前,可以事先保存 commit id.

03

【这些标记经常和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 不会废弃任何分支或提交。

04

你也可以 checkout 到任何一次 commit,通过提供 commit Id 作为参数.

比如下面的命令。

git checkout HEAD~2/[commit id]

05

这对于 review repo 的某个 version 的代码很有用。然而,如果再次添加新的提交就无法返回原先的状态。因此,你应该在修改前总是创建一个新的分支。

 

Revert

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

git checkout hotfix

git revert HEAD~2

如下图所示:

06

 

File 级别的操作

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

 

Reset:

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

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

07

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

 

Checkout

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

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

git checkout HEAD~1 [文件]
08

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 不支持

 

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

转自: git reset, git checkout, git revert 区别 (译)

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    完全学会GIT+GITHUB+GIT+SERVER的24堂课

    Git的`git revert`和`git reset`命令可撤销更改,但前者创建新的提交,后者直接修改历史。遇到冲突时,开发者需要手动编辑冲突文件,然后使用`git add`和`git commit`完成解决。 **8. Git钩子** 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 ...

    git安装包git-2.34.0-64-bit.rar

    9. **版本回溯**:Git的版本历史查询功能强大,`git log`显示提交历史,`git revert`或`git reset`可以回滚到特定版本。 10. **标签管理**:`git tag`命令用于创建和管理标签,常用于标记重要的里程碑或版本。 ...

    Git版本控制管理 第2版.pdf.zip

    6. **回溯与撤销**:`git reset`、`git revert`和`git checkout`命令的用法,如何恢复错误的提交或者回到历史状态。 7. **标签管理**:使用`git tag`为特定版本打标签,方便回溯和发布。 8. **Git的高级功能**:子...

    Git-1.9.0 git

    例如,了解如何创建和切换分支(`git checkout -b`),如何解决合并冲突(`git diff`、`git merge --abort`或`git mergetool`),以及如何回退到之前的版本(`git reset`或`git revert`)。此外,学习使用GitHub或...

    猴子都能懂的Git入门-整站

    3. 撤销操作:讲解`git revert`、`git reset`和`git checkout`在撤销更改时的区别和应用场景。 4. .gitignore文件:如何设置和使用,避免不必要的文件被追踪。 5. Git钩子:了解`pre-commit`、`post-receive`等钩子...

    git批量拉取项目的脚本,简便快捷

    在标签“git”相关的其他知识点中,包括但不限于分支管理(如`git branch`, `git checkout`, `git merge`, `git rebase`)、提交历史查看(`git log`)、回退版本(`git reset`, `git revert`)、标签管理(`git tag...

    pro_git_中文版本(Git使用教程)

    6. **撤销操作**:Git允许你在历史记录中移动,撤销错误的操作,如`git reset`和`git revert`。 7. **合并与衍合**:`git rebase`是另一种合并策略,它将你的分支修改应用到最新的上游分支上,保持提交历史的线性。...

    git 教材 progit

    6. **撤销操作**:Git提供了一些强大的撤销操作,如`git reset`和`git revert`,可以在不影响历史记录的情况下回退到之前的版本。 7. **标签管理**:`git tag`命令用于标记特定的提交,通常用于发布版本或者重要...

    git的详细使用教程.pdf

    - 撤销版本库修改(已经`commit`, 尚未推送到远程):使用`git revert`命令或`git reset`命令。 3. **远程仓库操作**: - `git clone [url]`:从远程仓库克隆一个项目到本地。 - `git remote -v`:查看远程仓库...

    git-cheatsheet——Git常见操作可打印版

    - 已提交的更改:`git revert <commit-hash>`或`git reset --hard <commit-hash>`,后者会抹去历史记录,谨慎使用。 10. **标签管理** `git tag <tag-name>`创建标签,`git tag`列出所有标签,`git show ...

    git常见操作指令速记卡《git-cheatsheet》

    `git revert <commit>`用于撤销某个特定的提交,并创建一个新的提交来表示这一更改。 在查看提交历史方面,`git log`显示所有提交,从最新到最旧。`git log -p <file>`展示了特定文件的提交历史。`git blame <file>...

    git电子书(Git权威指南&Pro Git简体中文版)

    - **撤销更改**:`git reset`和`git checkout`可以撤销工作目录或暂存区的更改。 5. **分支管理** - **创建分支**:`git branch`创建新的开发分支。 - **切换分支**:`git checkout`在分支间切换。 - **合并...

    Git安装包,2.35.1.2版本,windows64位

    3. **重置与回溯**:`git reset --hard`、`git revert`和`git checkout`等命令可用于撤销更改或恢复到特定状态。 **六、Git图形界面工具** 对于不熟悉命令行的用户,Git还支持多种图形化界面工具,如SourceTree、...

    crossin-Git基础系列

    `git reset`和`git revert`命令可以帮助你撤销错误的修改或回退到特定版本。 5. 冲突解决: 当两个开发者修改了同一部分代码时,Git会报告冲突。通过编辑器手动解决冲突后,再用`git add`和`git commit`提交解决...

    Git安装文件.zip

    对于版本回溯,`git log` 显示提交历史,`git reset` 和 `git revert` 分别用于撤销提交和创建新提交以恢复之前的状态。而`git reflog` 可以帮助找回丢失的分支或提交。 总之,Git 2.32.0.2的64位版本提供了稳定且...

    Pro Git 第二版 v2.1.17 中文版 非扫描 EPUB 和 PDF

    5. 撤销与重做:Git提供了一系列工具,如`git reset`、`git revert`和`git checkout`,用于撤销错误操作或恢复到之前的版本状态。这些内容在书中都有详细的介绍和实例。 6. 版本回溯与解决冲突:通过`git log`、`...

    git 使用相关.zip

    如果误改了某个文件,可以使用`git checkout -- <file>`来恢复到最新提交的状态,或者`git reset HEAD <file>`配合`git checkout .`来还原所有未被追踪的更改。 7. **git clone拉取代码.txt**: `git clone`命令...

Global site tag (gtag.js) - Google Analytics