gpt4 book ai didi

Git:如何将两次提交之间的所有提交压缩为一次提交

转载 作者:行者123 更新时间:2023-12-02 22:43:00 25 4
gpt4 key购买 nike

在过去的几个月里,我一直在多台计算机上亲自处理一个分支。结果是一个很长的历史链,我想在将其 merge 到主分支之前清理它。最终目标是摆脱我在处理服务器代码时经常进行的所有 wip 提交。

这是 gitk 历史可视化的屏幕截图:

enter image description here /image/i7SX8.jpg

这就是我从 master 分支出来的地方。自从我开始这个分支以来,Master 发生了一些变化,但这些变化是不相交的,所以 merge 应该是小菜一碟。我通常的工作流程是重新建立 master 基础,然后压缩 wip 提交。

我尝试执行一个简单的

git rebase -i master

我编辑了对 sqsh 的提交。

一开始似乎不错,但后来失败了,需要我解决冲突。然而,似乎没有什么好的方法可以通过查看差异来解决这个问题。每一部分都使用范围内 undefined variable ,因此我不确定如何解决它们。

我还尝试使用git rebase -i -s recursive -X Theirs master,这并没有导致冲突,但它改变了修订后分支的HEAD状态(我想以 HEAD 中的最终结果不会改变的方式编辑历史记录)。

我相信这些冲突是由链条中可以看到菱形图案的部分引起的。 (例如,在重新设计的分类器之间......和 merge 分支 iccv)。

<小时/>

为了更好地表达我的问题,让 A="Mergebranch iccv"和 B="reworked classifiers"引用图像中的示例。其间的提交将是 XY

      ...
|
|
A
/ \
| X
Y |
\ /
B
|
|
...

我想重写历史,使 A 的状态完全保持原样,并有效地破坏中间表示 XY,所以结果历史看起来像这样

      ...
|
|
A
|
|
B
|
|
...

有没有办法将 AXY 的已解析状态压缩为历史链中间的单个提交像这样?

如果 AB 是提交的 SHAID,是否有一个我可以运行的简单命令(或者可能是一个脚本)来实现我想要的结果?

如果A是HEAD,我相信我能做到

git reset B
git commit -am "recreating the A state"

创建一个新的头,但是如果A位于这样的历史链的中间,我该怎么做呢?我想维护它之后的所有节点的历史记录。

最佳答案

首先清理当前工作树,然后运行以下命令:

#initial state

enter image description here

git branch backup thesis4
git checkout -b tmp thesis4

enter image description here

git reset A --hard

enter image description here

git reset B --soft

enter image description here

git commit

enter image description here

git cherry-pick A..thesis4

enter image description here

git checkout thesis4

enter image description here

git reset tmp --hard
git branch -D tmp

enter image description here

SX,Y,A 的压缩。 M' 相当于 MN' 相当于 N。如果您想恢复初始状态,请运行

git checkout thesis4
git reset backup --hard

关于Git:如何将两次提交之间的所有提交压缩为一次提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43815567/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com