是否可以使用 Git 对一个分支及其所有父分支进行 rebase ? (我认为“父分支”是在这里使用的正确形式。根据你的观点,你也可以称它们为依赖子分支。但是,遵循提交的父指针将带你到那些分支,所以恕我直言称它们为“父分支”是公平的)。
我经常使用分支作为快速/可变标签/检查点来标记某些提交。 所有父分支/父引用都完全包含在要重新定位的分支中;仅在父分支中没有提交。
* master
*
* featureA-finished
*
* origin/master
现在我想将 rebase -i
master
到 origin/master
上以更改/改写提交 featureA-finished^
在 git rebase -i --onto origin/master origin/master 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
有没有办法解决它,或者我是否坚持在新的、重新设置基础的提交上重新创建所有父分支——更具体地说是分支标签?
这个问题与Rebasing a branch including all its children有关,但仍然有很大不同。 .
最佳答案
根据 git 的 Object Model如果您只更改提交的元数据(即提交消息)而不更改其中包含的基础数据(“树”),那么它的树哈希将保持不变。
除了编辑提交消息外,您还在执行 rebase ,这将更改历史记录中每个提交的树哈希,因为从 origin/master
中提取的任何更改都会影响文件你重写的历史:这意味着你的提交指向的一些文件(blob)已经改变。
所以没有万无一失的方法来做你想做的事。
也就是说,使用 rebase -i
编辑提交通常不会改变提交的时间戳和作者,因此您可以使用它来唯一标识 rebase 操作前后的提交。
在进行 rebase 之前,您必须编写一个脚本,根据这些“timestamp:author”标识符记录所有分支起点,然后找到具有相同“timestamp:author”ID 的重写提交并 rebase 分支在上面。
遗憾的是,我现在没有时间尝试自己编写这个脚本,所以我只能祝你好运!
编辑:您可以使用以下方式获取作者电子邮件地址和时间戳:
$ 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 分支与所有父分支(或依赖子分支),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2730866/