“revert”、“amend”、“rollback”和“undo”提交有什么区别?

56

为了帮助我掌握 Git 的知识,以便我能够日常使用,以下是以下术语的区别:

  • revert(撤销)
  • amend(修改)
  • rollback(回滚)
  • undo(撤销)

这些术语分别表示什么,它们的作用是什么?

3个回答

50
术语“还原”和“修改”在Git中有明确定义的含义。相比之下,“回滚”和“撤销”没有这样明确定义的含义,而是可以根据个人理解进行解释。
还原一个提交意味着在当前分支上创建一个新的提交,应用另一个提交引入的相反变更。这是纠正已经与他人共享的存储库中的问题的首选方法,因为它不涉及任何破坏(即重写历史)。
要还原由标识的提交,只需运行
git revert <commit>

修改提交意味着用一个具有相同父节点的新提交替换“当前”提交;更多详细信息请参阅git commit --amend 究竟是如何工作的?

enter image description here

请注意:
修改已经推送到共享远程仓库的提交是不好的做法,因为这是一种历史重写(它“删除”了最近的提交,而你的合作者可能已经基于此进行了工作);
你只能修改给定分支上的最后一个提交;要重写较早的提交,你需要使用更强大的工具(如交互式变基)。
要修改提交,请进行所有必需的更改并将其暂存,然后运行:
git commit --amend

这里不需要指定任何提交,因为当前分支上的最后一次提交将被修改。然后,您的编辑器将弹出,让您有机会修改提交消息。

回滚操作...

通常意味着放弃(或存储)任何本地更改,并将分支重置到在问题开始出现之前的提交(或仅仅是检出一个提交,但这会使您处于分离头状态)。使用

git reset <commit-before-things-started-to-go-belly-up>

撤销一个提交可以根据上下文的不同意味着以下几种情况:
- 回滚一个提交, - 修改一个提交, - 通过交互式变基删除一个提交。

回滚(rollback)和还原(revert)的好用例是什么?我唯一能想到不需要记录还原历史的情况是当我硬重置到源时。有时候你应该使用其中之一,对吧? - BigDreamz
@BigDreamz 因为重置分支是一种历史重写形式,如果该历史记录已经被推送/共享给其他人,则不应该这样做。相反,还原在这方面是完全安全的,因为它仅将提交附加到现有历史记录中。 - jub0bs

19

撤销更改git checkoutgit revertgit resetgit clean

  • git revert:此命令撤销提交的更改,它在日志中保留跟踪记录。

  • git reset:此命令撤销提交的更改,它不在日志中保留跟踪记录,即将恢复到撤销的提交。 注意:这是一项破坏性操作。使用此命令时必须小心。

  • git reset --soft HEAD^ 撤销最后一次提交,将更改放入暂存区

  • git reset --hard HEAD^ 撤销最后一次提交和所有更改

  • git reset --hard HEAD^^ 撤销最后 2 次提交和所有更改

  • git commit --amend 其中 amend 表示添加到上一个提交。有时我们忘记将文件添加到提交中。例如,abc.txt 文件被遗忘了,我们可以按以下方式添加:git add abc.txtgit commit --amend -m "New commit message"

注意:我们没有使用“回滚”和“撤消”这些确切的名称,无论是动词还是选项。


2

git --amend 仅在提交尚未推送到另一个Git存储库的公共分支时使用git --amend命令。 git --amend命令创建一个新的提交ID,人们可能已经基于现有提交工作。在这种情况下,他们需要根据新的提交迁移他们的工作。

git revert 您可以通过git revert命令还原提交。此命令还原提交的更改。 这样的提交对于记录撤回更改非常有用。

这里是一个[链接说明][1]

[1]: 如何将Git存储库回滚(重置)到特定提交?关于回滚技术的问题


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接