首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Git:如何将两个提交之间的所有提交压缩为单个提交

Git:如何将两个提交之间的所有提交压缩为单个提交
EN

Stack Overflow用户
提问于 2017-05-06 00:48:59
回答 1查看 8.7K关注 0票数 12

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

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

http://imgur.com/a/I9feO

在这一条的底部,我从师父那里分道扬镳。自从我开始这个分支以来,主人已经改变了一点,但是变化是不相交的,所以合并应该是小菜一碟。我通常的工作流程是重新建立在主人的基础上,然后压缩wip提交。

我试着执行一个简单的

代码语言:javascript
复制
git rebase -i master

我编辑了对sqush的提交。

它似乎开局很好,但后来失败了,想让我解决一场冲突。然而,似乎没有一个好的方法来解决这个问题,通过观察差异。每个片段都使用范围中未定义的变量,因此我不确定如何解决这些变量。

我还尝试使用git rebase -i -s recursive -X theirs master,这没有导致冲突,但它从修改过的分支中更改了HEAD的状态(我希望以这样一种方式编辑历史记录,最终结果是HEAD不会改变)。

我认为这些冲突产生于链条的各个部分,你可以看到钻石的图案。(例如,在重分类器之间..。并合并分支iccv)。

要更好地表达我的问题,请让A=“合并分支iccv”和B=“重新处理的分类器”引用图像中的示例。中间的提交将是XY

代码语言:javascript
复制
      ...
       |
       |
       A 
     /  \
    |   X
    Y   |
     \ /
      B
      |
      |
     ...

我希望重写历史,使A的状态完全保持不变,并有效地销毁中间表示形式XY,因此产生的历史如下所示

代码语言:javascript
复制
      ...
       |
       |
       A 
       |
       |
       B
       |
       | 
      ...

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

如果AB是提交的SHAID,那么我可以运行一个简单的命令(或者脚本)来达到我想要的结果吗?

如果A是我能做的头

代码语言:javascript
复制
git reset B
git commit -am "recreating the A state"

来创建一个新的头,但是如果A处于这样的历史链的中间,我如何做到这一点。我想维护它之后的所有节点的历史记录。

EN

回答 1

Stack Overflow用户

发布于 2017-05-06 02:45:51

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

代码语言:javascript
复制
#initial state

代码语言:javascript
复制
git branch backup thesis4
git checkout -b tmp thesis4

代码语言:javascript
复制
git reset A --hard

代码语言:javascript
复制
git reset B --soft

代码语言:javascript
复制
git commit

代码语言:javascript
复制
git cherry-pick A..thesis4

代码语言:javascript
复制
git checkout thesis4

代码语言:javascript
复制
git reset tmp --hard
git branch -D tmp

SX,Y,A的壁球。M'等同于MN'等效于N。如果您想恢复初始状态,请运行

代码语言:javascript
复制
git checkout thesis4
git reset backup --hard
票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43815567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档