我想从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
的非快进操作的场景。
答案 0 :(得分:1)
所以你有,例如:
A - B - C - D - E <-- master
\
F - G <-- topic
你想要:
A - B - C - D - E <-- master
\
F - G - D' - E' <-- topic
其中D'
和E'
是D
和E
的副本? (我完全不确定这是你想要的;如果你绘制一张你所拥有的图表和你想要的图表,它会有很大的帮助。)
执行此操作的简单方法是使用git cherry-pick
。在topic
上,在上面的主提交D
和E
上挑选一切新内容,但很容易以编程方式获取:
git cherry-pick topic..master
答案 1 :(得分:0)
可能是我误解了你的问题,但是你试过git merge master --squash
然后git commit
吗?这应该使用额外的压缩提交将master
的最新状态移动到topic
,以指定合并发生以使其进入您正在寻找的状态。
但这可能不是您想要修改提交图的方式。