在过去的几个月里,我有一个分支在几台电脑上亲自工作。结果是一个很长的历史链,在我将它合并到主分支之前,我想清理它。最终的目标是摆脱我在处理服务器代码时经常做的所有那些wip提交。
下面是gitk历史可视化的屏幕截图:

在这一条的底部,我从师父那里分道扬镳。自从我开始这个分支以来,主人已经改变了一点,但是变化是不相交的,所以合并应该是小菜一碟。我通常的工作流程是重新建立在主人的基础上,然后压缩wip提交。
我试着执行一个简单的
git rebase -i master我编辑了对sqush的提交。
它似乎开局很好,但后来失败了,想让我解决一场冲突。然而,似乎没有一个好的方法来解决这个问题,通过观察差异。每个片段都使用范围中未定义的变量,因此我不确定如何解决这些变量。
我还尝试使用git rebase -i -s recursive -X theirs master,这没有导致冲突,但它从修改过的分支中更改了HEAD的状态(我希望以这样一种方式编辑历史记录,最终结果是HEAD不会改变)。
我认为这些冲突产生于链条的各个部分,你可以看到钻石的图案。(例如,在重分类器之间..。并合并分支iccv)。
要更好地表达我的问题,请让A=“合并分支iccv”和B=“重新处理的分类器”引用图像中的示例。中间的提交将是X和Y。
...
|
|
A
/ \
| X
Y |
\ /
B
|
|
...我希望重写历史,使A的状态完全保持不变,并有效地销毁中间表示形式X和Y,因此产生的历史如下所示
...
|
|
A
|
|
B
|
|
...有没有办法将A、X和Y的解决状态压缩到这样的历史链中间的单个提交中?
如果A和B是提交的SHAID,那么我可以运行一个简单的命令(或者脚本)来达到我想要的结果吗?
如果A是我能做的头
git reset B
git commit -am "recreating the A state"来创建一个新的头,但是如果A处于这样的历史链的中间,我如何做到这一点。我想维护它之后的所有节点的历史记录。
发布于 2017-05-06 02:45:51
首先将当前工作树清理干净,然后运行以下命令:
#initial state

git branch backup thesis4
git checkout -b tmp thesis4

git reset A --hard

git reset B --soft

git commit

git cherry-pick A..thesis4

git checkout thesis4

git reset tmp --hard
git branch -D tmp

S是X,Y,A的壁球。M'等同于M,N'等效于N。如果您想恢复初始状态,请运行
git checkout thesis4
git reset backup --hardhttps://stackoverflow.com/questions/43815567
复制相似问题