方便的方法在git中做“错误的方式rebase”?

时间:2013-10-24 03:02:40

标签: git git-rebase

我想从master引入较新的提交到topic,但不是在topic之上重播master更改的方式,而是副本反之亦然。我希望master的新更改在topic之上播放,结果将作为新的topic头安装。

如果我将master重新定义为topic,我可以获得完全正确的对象,唯一的问题是 该对象作为master的新头而不是topic安装。

有没有一些很好的方法可以在没有手动改变临时头指针的情况下做到这一点?

编辑:

以下是如何使用临时分支头实现的,但它很笨拙:

git checkout master
git checkout -b temp   # temp points to master
git rebase topic       # topic is brought into temp, temp changes played on top

现在我们拥有了我们想要的对象,temp指出了它。

git checkout topic
git reset --hard temp

现在topic拥有它;剩下的就是通过删除temp来整理:

git branch -d temp

另一种方法是取消temp,然后重新定位master,然后将topic重置为master。最后,通过从reflog或剪切和粘贴缓冲区中拉出旧头,将master重置回原来的状态。这让它落到了六个步骤,仍然很尴尬:

git checkout master
git rebase topic  # solve conflicts, git rebase --continue, if necessary
git checkout topic
git reset --hard master  # topic and master same now
git checkout master
git reset --hard HEAD@{13}

最好在最后一步中依赖一些保存的提交哈希,而不是去寻找reflog。

为什么这很有用

假设您有一些人在分支机构工作,他们正在与master隔离的某些开发项目进行协作,但会定期与其集成。通过这种方式执行rebase,我们可以避免分支上的非快进更改(重写分支历史记录)。当将分支整合到其中时,如何处理master是另一个故事;但有一些选项,包括避免master的非快进操作的场景。

2 个答案:

答案 0 :(得分:1)

所以你有,例如:

A - B - C - D - E    <-- master
          \
            F - G    <-- topic

你想要:

A - B - C - D - E             <-- master
          \
            F - G - D' - E'   <-- topic

其中D'E'DE的副本? (我完全不确定这是你想要的;如果你绘制一张你所拥有的图表和你想要的图表,它会有很大的帮助。)

执行此操作的简单方法是使用git cherry-pick。在topic上,在上面的主提交DE上挑选一切新内容,但很容易以编程方式获取:

git cherry-pick topic..master

答案 1 :(得分:0)

可能是我误解了你的问题,但是你试过git merge master --squash然后git commit吗?这应该使用额外的压缩提交将master的最新状态移动到topic,以指定合并发生以使其进入您正在寻找的状态。

但这可能不是您想要修改提交图的方式。