Git rebase 分支与所有父分支(或依赖子分支)

标签 git branch rebase git-rebase

是否可以使用 Git 对一个分支及其所有父分支进行 rebase ? (我认为“父分支”是在这里使用的正确形式。根据你的观点,你也可以称它们为依赖子分支。但是,遵循提交的父指针将带你到那些分支,所以恕我直言称它们为“父分支”是公平的)。

我经常使用分支作为快速/可变标签/检查点来标记某些提交。 所有父分支/父引用都完全包含在要重新定位的分支中;仅在父分支中没有提交。

* master
*
* featureA-finished
*
* origin/master

现在我想将 rebase -i masterorigin/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/

相关文章:

git - git 存储库可以处理的提交数量是否有上限?

git - 仅给出文件的一个版本查找 Git 提交

git - 503错误推送到远程

git - git merge --squash 是否会导致跨分支 merge 令人头疼

svn - Idea Intellij-分支之间比较-内容相同

assembly - 什么是分行摊位?

Git Squash 作者按顺序提交以压缩历史记录

git - Github 如何检测镜像仓库?

git - 无法从工作目录中删除文件

tfs - TFS 2010 中的许多分支有哪些可扩展性和性能限制?