具有所有子分支的git rebase分支

具有所有子分支的git rebase分支,git,rebase,branch,Git,Rebase,Branch,是否可以在git中重新设置分支及其所有子分支的基础 我经常使用分支作为快速/可变标记来标记某些提交 * master * * featureA-finished * * origin/master 现在我想rebase-imaster到origin/master,以更改/重写提交featureA finished^ 在git-rebase-i--on-origin/master-origin/master之后,我基本上希望历史是: * master * * featureA-finished

是否可以在git中重新设置分支及其所有子分支的基础

我经常使用分支作为快速/可变标记来标记某些提交

* master
*
* featureA-finished
*
* origin/master
现在我想
rebase-i
master
origin/master
,以更改/重写提交
featureA finished^

git-rebase-i--on-origin/master-origin/master
之后,我基本上希望历史是:

* master
*
* featureA-finished
* (changed/reworded)
* origin/master
但我得到的是:

* master
*
* (same changeset as featureA-finished)
* (changed/reworded)
| * featureA-finished
|.* (original commit i wanted to edit)
* origin/master

有没有办法解决这个问题,或者我一直在重新创建新的基于重定基础的提交上的分支?

我不知道您是如何做到的,但是:

git branch -f (same changeset as featureA-finished)

应该足以用正确的历史记录重置您的
featureA finished
分支。

我的建议是首先将
featureA finished
重新设置到
origin/master
上。然后执行重新编写步骤。在此之后,将
master
重新设置为
featureA finished
。这将使你得到你想要的最终结果

请注意,您需要在两个基准上都使用
-i
,并且可能必须删除在第二个基准中找到的原始
特性下的所有提交。如果需要,您可以编写一个脚本,通过保存中间分支并将其用作在新版本上重新基址的基础来消除这种情况。如果你写对了,它甚至可以处理一系列这样的“分支”。如果您需要帮助,我可以尝试敲出一个。

根据git的说法,如果您只更改提交的元数据(即提交消息),而不更改其中包含的基础数据(“树”),那么它的树哈希将保持不变

除了编辑提交消息外,您还将执行重基,这将更改历史记录中每个提交的树哈希,因为从
origin/master
中提取的任何更改都将影响重新写入的历史记录中的文件:这意味着提交指向的某些文件(blob)已更改

所以没有防弹的方法来做你想做的事

这就是说,使用
rebase-i
编辑提交通常不会改变提交的时间戳和作者,因此您可以使用它在rebase操作前后唯一地标识提交

您必须编写一个脚本,根据这些“timestamp:author”标识符记录所有分支的起始点,然后再使用相同的“timestamp:author”ID查找重写的提交,并在其上重新设置分支的基础

遗憾的是,我现在没有时间自己写这个剧本,所以我只能祝你好运

编辑:您可以使用以下方法获取作者电子邮件地址和时间戳:

$ git log --graph --all --pretty=format:"%h %ae:%ci"
* 53ca31a robert.meerman@gmail.com:2010-06-16 13:50:12 +0100
* 03dda75 robert.meerman@gmail.com:2010-06-16 13:50:11 +0100
| * a8bb03a robert.meerman@gmail.com:2010-06-16 13:49:46 +0100
| * b93e59d robert.meerman@gmail.com:2010-06-16 13:49:44 +0100
|/
* d4214a2 robert.meerman@gmail.com:2010-06-16 13:49:41 +0100
您可以根据每个分支的提交散列获取它们的分支列表:

$ git branch --contains 03dda75
* testbranch

每次提交时请注意多个分支,公共祖先
d4214a2
属于这两个分支

看起来这个功能正在慢慢进入git
rebase
将获得选项
--rebase refs
,该选项将完全按照我最初的答案要求执行。对于建议的补丁系列,请参阅gmane上的线程。

是的,这就是我所说的»在新的重基提交上重新创建分支«。我知道这样做是可能的,但对于三个分支来说,这真的很麻烦already@knittl:有趣。更详细的分支之前和之后的日志图可能会有所帮助。想象一下相同的图有15次提交,每秒提交完成FeatureUrea、featureB、featureC等。您可以使用
git notes
来标记您的提交-这些提交会在回扣期间自动复制,我相信。(这是一项新功能,因此您需要最新版本)另请参阅。该解决方案中令人不快的部分是需要在之后将主题分支引用重置为新的基于rebase的提交。遗憾的是,这似乎没有进入Git:我在Git rebase的当前文档(手册页)中没有看到这样的功能!(git-1.7.9.3)