删除推送的旧git提交

时间:2016-01-07 16:58:57

标签: git version-control merge

我们正在与一个拥有约20名开发人员的单一分支机构合作。昨天有人不小心弄乱了自动合并提交。

他在提交前24小时(跨度-1)进行了拉动。提交并拉动后,他意外地恢复了自动合并提交中显示的所有文件,认为他们不应该提交,因为他没有更改这些文件。之后他提交了自动合并并推动了它。在推动24小时(跨度-2)之后,我们认识到了这个问题。

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

我们尝试了樱桃挑选,但它要求解决冲突,这在我们的案例中绝对不可能,因为许多开发人员都参与其中。

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

注意:问题here并未解决我的具体问题。这是关于删除git提交的一般问题。我也不想删除/重写历史记录。我们只希望在不必解决合并冲突的情况下在远程存储库上提供由于错误合并而导致的回滚更改

1 个答案:

答案 0 :(得分:0)

  

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

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重写)或有关每个提交的信息。否则,将保留所有信息(包括原始提交时间或合并信息)。