撤消Git中的特定提交,该提交为';它被推到远程回购

撤消Git中的特定提交,该提交为';它被推到远程回购,git,version-control,git-reset,git-revert,Git,Version Control,Git Reset,Git Revert,撤消特定提交的最简单方法是: 不在头部或头部 已推送到远程 因为如果这不是最新的承诺 git reset HEAD 不起作用。因为它被推到了一个遥控器上 git rebase -i 及 将导致遥控器出现一些问题 更重要的是,我不想修改历史记录。如果有不好的代码,它就存在于历史中,并且可以被看到。我只希望它在工作副本中输出,我不介意反向合并提交 换句话说,以下svn命令的等效项是什么: svn merge -r 303:295 http://svn.example.com/repos/ca

撤消特定提交的最简单方法是:

  • 不在头部或头部
  • 已推送到远程
因为如果这不是最新的承诺

git reset HEAD
不起作用。因为它被推到了一个遥控器上

git rebase -i

将导致遥控器出现一些问题

更重要的是,我不想修改历史记录。如果有不好的代码,它就存在于历史中,并且可以被看到。我只希望它在工作副本中输出,我不介意反向合并提交

换句话说,以下svn命令的等效项是什么:

svn merge -r 303:295 http://svn.example.com/repos/calc/trunk
它通过将这些修订中的所有更改作为新提交进行反向合并,从而删除从295到302的所有更改

svn merge -c -302 ^/trunk
这会撤消302提交,当然是通过添加另一个提交来反向合并来自相应提交的更改

我认为它在Git中应该是一个相当简单的操作,也是一个相当常见的用例。原子提交还有什么意义


为了确保提交是完全原子化的,我们提供了暂存和所有功能,难道您不应该轻松撤消一个或多个原子提交吗?

因为它已经被推送,所以您不应该直接操纵历史记录
git revert
将使用新提交还原来自提交的特定更改,以便不操纵提交历史记录。

使用
git log
标识提交的哈希,然后使用
git revert
创建删除这些更改的新提交。在某种程度上,
git revert
git cherry pick
相反——后者将补丁应用于缺少它的分支,前者将它从拥有它的分支中删除。

我不喜欢
git revert
所做的自动提交,因此这可能对某些人有所帮助

如果只需要修改的文件而不需要自动提交,可以使用
--无提交

% git revert --no-commit <commit hash>

如果要还原的提交是合并的提交(已合并),则应选择
-m1
-m2
选项,如下所示。这将让git知道要使用合并提交的哪个父提交。可以找到更多细节

  • git revert-m1
  • git还原-m2

如果您想要返回代码,但不想再次自动提交,请使用-n开关“m”选项的作用是什么?我尝试了git revert 8213f7d,但得到了以下结果:错误:Commit 8213f7dad1ed546b434a0d8a64cb783b530a5a30是一个合并,但未提供-m选项。致命:还原失败还原合并:git revert-m 1向任何想要还原合并的人发出警告:git revert将撤消所有数据更改(即,文件更改将被还原),但合并仍保留在历史记录中。因此,如果稍后再次尝试合并同一分支,则在还原合并之前,不会包含来自合并分支的任何提交。这很可能不是你想要的。为了再次完全合并分支,您需要首先还原还原原始合并的提交。在这里了解更多信息:@etreworgy评论中的链接是404。我怀疑这是链接的最新版本:如果您已经在没有
-n
的情况下恢复了,您也可以执行
git reset HEAD~1--soft
,但是
git reset HEAD~n
无法解决任何无法从头部连续访问的提交的撤消问题。查询是回复任何特定的提交。我使用了这个解决方案,但是在回复的中间遇到了冲突。解决冲突后,我按照它的指示执行了git revert--continue。它起了作用,但不幸的是,它带来了结果。也许我需要做
git revert--no commit--continue
@sangeethkumarp如果你忘记了
-n
,Daniel的评论是在
git revert
之后你可以采取的额外步骤;因为在这一点上,最后一次提交是恢复,所以软重置将撤消该提交,但不会撤消revert@Daniel通过评论为我提供解决方案,感谢“git重置头~1--软”
% git revert --no-commit <commit hash>
% git revert -n <commit hash>