【问题标题】:Delete a pushed old git commit删除推送的旧 git commit
【发布时间】:2016-01-07 16:58:57
【问题描述】:

我们正在与大约 20 名开发人员一起开发一个分支。昨天有人不小心搞砸了自动合并提交。

他在提交前 24 小时(span-1)进行了一次拉动。在提交并拉取之后,他不小心恢复了自动合并提交中显示的所有文件,因为他认为不应该提交这些文件,因为他没有更改这些文件。之后,他提交了自动合并并推送了它。经过 24 小时 (span-2) 的推送,我们发现了这个问题。

现在的问题是,在 span-1 中,我们有 10 位开发人员的大约 25 次提交,在 span-2 中类似。更改是由相同/不同的开发人员对相同/不同的文件进行的。

我们尝试了樱桃采摘,但它要求解决冲突,这在我们的案例中肯定是不可能的,因为涉及到许多开发人员。

有没有办法轻松解决这个问题。基本上我想删除那个合并提交。如果需要,我们甚至可以删除该开发人员在 span-1 和 span-2 之间完成的实际提交。在历史上发生这些变化将不是问题。我们只想要一个干净的存储库。

注意:问题here 没有解决我的具体问题。这是删除 git 提交的一般问题。我也对删除/重写历史不感兴趣。我们只希望由于合并错误而回滚的更改在远程存储库上可用,而无需解决合并冲突

【问题讨论】:

标签: git version-control merge


【解决方案1】:

有没有办法轻松解决这个问题。
基本上我想删除那个合并提交


reset

  # reset the branch to any given commit
  git reset HEAD <sha-1>

  # push the branch with the -f flag = rebase
  # 
  # THIS IS VERY DANGEROUS, ITS REBASE. 
  # all the developers will have to re-clone the project
  git push -f origin <branch>
  

revert(使用反向补丁创建提交)

这样您就不会重写任何历史记录。

另一方面,如果您已经发表了作品,您可能不想reset 分支,因为这实际上是在改写历史。

在这种情况下,您确实可以还原提交。

# This will create X separate revert commits 
# (undo the original commit changes)
# if the revert is merge you will have to supply the parent number as well `-m`
git revert <sha1> <sha1> <sha1> ...

# It also takes ranges. This will revert the last two commits:
git revert HEAD~X..HEAD~Y

# Reverting a merge commit
git revert -m 1 <merge_commit_sha>

git-revert manpage 实际上在其描述中涵盖了很多内容。
另一个有用的链接是this git-scm.com blog post discussing git-revert。

如果您最终决定不想恢复,您可以恢复恢复(如此处所述)或重置回恢复之前(请参阅上一节)。


git filter-branch

允许您通过重写 中提到的分支来重写 Git 修订历史记录,并在每个修订上应用自定义过滤器。

这些过滤器可以修改每棵树(例如删除文件或对所有文件运行 perl 重写)或有关每次提交的信息。否则,所有信息(包括原始提交时间或合并信息)都将被保留。

【讨论】:

  • 哪些步骤适合我的用例?我觉得这些信息不太相关
  • 重置/恢复其中任何一个
  • 变基不是一种选择,因为它会破坏整个历史。尝试恢复没有帮助,因为我无法恢复合并中丢失的更改。我按照上述 git 博客中的步骤操作,但无法在合并中恢复丢失的更改
猜你喜欢
  • 2011-07-16
  • 1970-01-01
  • 2010-12-09
  • 2019-08-10
  • 2015-09-04
  • 1970-01-01
  • 1970-01-01
  • 2019-04-09
  • 2016-08-01
相关资源
最近更新 更多