撤消已被推送到远程仓库的Git中的特定提交

Lak*_*sad 743 git version-control git-revert git-reset

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

  • 不在脑袋或头部
  • 已被推到遥控器.

因为如果它不是最新的提交,

git reset HEAD
Run Code Online (Sandbox Code Playgroud)

不起作用.而且因为它被推到了遥远的地方,

git rebase -i
Run Code Online (Sandbox Code Playgroud)

git rebase --onto
Run Code Online (Sandbox Code Playgroud)

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

更重要的是,我不想真正修改历史.如果有错误的代码,它就在历史中可以看到.我只想在工作副本中使用它,我不介意反向合并提交.

换句话说,以下svn命令的Git等价物是什么:

svn merge -r 303:295 http://svn.example.com/repos/calc/trunk
Run Code Online (Sandbox Code Playgroud)

通过反向合并这些修订中的所有更改,将所有更改从295移除到302,作为新提交.

svn merge -c -302 ^/trunk
Run Code Online (Sandbox Code Playgroud)

当然,通过添加另一个反向合并来自相应提交的更改的提交来撤消302提交.

我认为它应该是一个相当简单的Git操作和一个相当常见的用例.原子提交还有什么意义?

我们已经举办藏起来,并要保证的提交是完全原子,你不应该能够很容易地撤销这些原子提交的一个或多个?

And*_*ett 1142

确定提交的哈希值git log,然后使用git revert <commit>创建一个删除这些更改的新提交.在某种程度上,git revert是相反的git cherry-pick- 后者将补丁应用于缺少它的分支,前者将其从具有它的分支中移除.

  • 如果您想要返回代码,请使用-n开关,但不能再次自动提交 (232认同)
  • 向任何想要恢复合并的人发出警告:git revert将撤消所有数据更改(即文件更改将被恢复),但合并仍保留在历史记录中.因此,如果您尝试稍后再次合并同一个分支,则在恢复合并之前不会包含来自合并分支的任何提交.这很可能不是你想要的.为了再次完全合并分支,您需要首先恢复您还原原始合并的提交.在此处了解更多信息:http://kernel.mirrors.pair.com/pub/software/scm/git/docs/howto/revert-a-faulty-merge.txt (28认同)
  • "m"选项有什么作用?我尝试了git revert 8213f7d,但得到了这个:错误:提交8213f7dad1ed546b434a0d8a64cb783b530a5a30是合并但没有给出-m选项.致命:恢复失败 (15认同)
  • 要还原合并:git revert -m 1 <hash> (8认同)
  • @etreworgy评论中的链接是404.我怀疑这是链接的最新版本:https://www.kernel.org/pub/software/scm/git/docs/howto/revert-a-故障-merge.txt (3认同)
  • 使用[此答案](http://stackoverflow.com/a/7100005/4623317)恢复合并提交(如果您收到错误"提交xxx是合并但没有给出-m选项).它解释了` -m`标志以及如何选择父母 (2认同)

Tha*_*you 354

我不喜欢自动提交git revert,所以这可能对某些人有帮助.

如果您只想要修改的文件而不是自动提交,则可以使用--no-commit

% git revert --no-commit <commit hash>
Run Code Online (Sandbox Code Playgroud)

这是和 -n

% git revert -n <commit hash>
Run Code Online (Sandbox Code Playgroud)

  • 你也可以做`git reset HEAD~1 --soft`如果你已经没有`-n`就恢复了 (6认同)
  • 但是 `git reset HEAD~n` 不会解决任何无法从头部连续到达的提交的撤消问题。查询是还原任何特定提交。 (3认同)
  • @sangeethkumarp Daniel 的评论是您可以在 `git revert` 之后执行的附加步骤,如果您忘记了 `-n`;因为此时最后一次提交是还原,因此软重置将撤消该提交,但不会撤消还原的相关代码更改 (2认同)

moa*_*lon 39

因为它已被推送,所以你不应该直接操纵历史.git revert将使用新提交从提交中还原特定更改,以便不操作提交历史记录.


Mey*_*ghi 5

如果您要还原的提交是合并提交(已经合并),那么您应该选择-m 1-m 2选项,如下所示。这将使 git 知道要使用合并提交的哪个父提交。更多细节可以在这里找到。

  • git revert <commit> -m 1
  • git revert <commit> -m 2