【问题标题】:git - remove commits from merged branchgit - 从合并的分支中删除提交
【发布时间】:2017-01-24 15:38:49
【问题描述】:

我不小心推送了一个包含一些大文件的提交,然后又恢复了它。但这会导致任何人拉动这个分支来获取历史中的这些文件,所以我决定删除或压缩这两个提交。但是,已经合并了一些分支。我不知道如何使“git rebase -i”保持分支结构。

历史现在看起来像:

H - new commits
|
G - merge
| \
|  F - commits on another branch
|  |
E  | - some other commits
|  |
D  | - corrected B
|  |
C  | - revert B
|  |
B  | - huge files
| /
A - early commit

我可以改成关注吗?

h - new commits
|
g - merge
| \
|  F - commits on another branch
|  |
e  | - some other commits
|  |
d  | - corrected B
| /
A - early commit

【问题讨论】:

  • 让对方重做合并有可能吗?
  • @TimBiegeleisen 是的,但必须保持结构。
  • 交互式变基并删除 huge filesrevert B。然后重做合并。最后,挑选之后的新提交。
  • @TimBiegeleisen 谢谢。有没有脚本可以做到这一点?因为在那之后会有一些新的分支和合并,所以手动重放是很困难的。
  • @TimBiegeleisen @nonsensickle 谢谢。 git filter-branch 有助于节省空间。虽然还没有弄清楚如何使用它完全删除提交,但对于这种情况来说已经足够了。

标签: git git-rebase git-revert


【解决方案1】:

是的你可以 但你不应该

这将需要您重写历史记录并替换服务器上已经推送的历史记录(这需要强制推送并且通常会导致每个人都对您大喊大叫)

但如果你真的想要,那么git filter-branch 就是你想要使用的,就像在this SO answer 中一样。所以你会做这样的事情:

git filter-branch --commit-filter '
    if [ "$GIT_COMMIT" = "<your commit to remove here>" ]
    then
        skip_commit "$@";
    else
        git commit-tree "$@";
    fi'  HEAD

还有几个例子here

【讨论】:

  • 太好了,这就是我要找的。这是一个内部回购,让其他人强制拉动不是问题。
【解决方案2】:

不,你不能。

每个提交的哈希不仅包括索引中所有文件的哈希内容,还包括提交父级的哈希。

“更正后的 B”将有一个与现在不同的父级。这会改变哈希值。

有可能解决这个问题,但是一旦完成,就无法避免强制推动修复,并让每个人都强制拉动它。

解决此问题的唯一真正方法是以下过程:

 git checkout A

在分支分叉之前检查父提交。然后,创建两个工作分支:

 git checkout -b corrected-mainline
 git checkout -b corrected-fork

您现在位于修正后的分支上。现在,在这个分支上,您应该能够 git cherry-pick 直到 F 提交的所有提交,跳过带有大文件的提交,并恢复它。如果这些提交中的任何一个是合并,请执行相同的合并。

现在,在 corrected-mainline 分支上做同样的事情

 git checkout corrected-mainline

现在,git cherry-pick 主线分支上的所有提交,直到 G 合并之前的最后一次提交。然后,与corrected-fork 分支合并。现在这是您更正后的 G 合并提交。

完成对图表中最初位于 G 之上的所有提交的挑选,并在原始分支上的最后一个提交完成。

此时,你的工作分支的内容应该和你原来的分支的内容一致。确认是这样。

然后,删除您的原始分支,将您的工作分支重命名为其名称。或者,使用git reset --hard 将原始分支重置为更正后的工作分支。

然后执行git push --force,将更正的分支向上推。当然,任何拉动树枝的人最终都会被强行拉动。

【讨论】:

  • 我正在使用git filter-branch。感谢您的回答。
猜你喜欢
  • 2021-04-13
  • 1970-01-01
  • 2022-10-15
  • 2020-10-18
  • 2014-10-29
  • 2018-05-10
  • 1970-01-01
  • 1970-01-01
  • 2019-11-09
相关资源
最近更新 更多