我不小心用一些大文件推了一个提交,然后恢复了它。但这会导致任何人在历史中提取这些文件,所以我决定删除或压缩这两个提交。但是,有一个分支已经合并进来了。我不知道如何使“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

最佳答案

是的,你可以,但你不应该。
它将要求您重写历史记录并替换服务器上已推送的历史记录(这需要强制推送,最常见的结果是每个人都对您大喊大叫)。
但如果你真的想那么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

08-26 11:10