当父分支从 master 更改时更改分支的 ref

change ref of branchB when parent branchA was changed from master

肯定已经有人问过关于这个主题的类似问题,但我找不到它,也找不到合适的词来寻找它。

假设我有这个:

a -- b                  <-- Master
      \
       d -- e           <-- Branch1
             \
              f -- g    <-- Branch2

但在某些时候,在合并到 Master 之前,我不得不重写在 Branch1 的提交 de 中完成的代码,所以它们变成了 d'e':

a -- b                  <-- Master
     |\
     | d'--e'           <-- Branch1
      \
       d --e
            \
             f -- g    < -- Branch2

如何告诉我的 Branch2 f 的父提交应该是 e' 而不是旧的 e

a -- b                  <-- Master
      \
       d'-- e'          <-- Branch1
             \
              f -- g    <-- Branch2

基本上,当 Branch1 Pull Request 将通过 Github 在 master 上合并时,Branch2 将不包含 de, d'e'.

确切的命令是:

git rebase --onto Branch1 e Branch2

您将在 旧的 Branch1 基础 (e) 之后将 Branch2 的所有提交重播到新的 Branch1 头。

当重写Branch1时,你需要做的就是做一个标记(tmp分支或标签)以便标记'e' 提交。

(tl;dr: 你所追求的实际上是 Git 的默认行为。只需告诉它你的分支的上游关系,你的命令就很简单 git rebase。)

这就是当您将上游关系告知它并让它使用它们时 Git 的行为方式,这是它的默认设置。

试试这个:

new() { touch ; git add .; git commit -m; }
git init forktest; cd $_
new a
new b
git checkout -b Branch1
new d 
new e
git checkout -b Branch2
new f
new g

你已经有了初始条件,现在对 Branch1 进行完全重写:

git checkout -B Branch1 master
new d\'
new e\'
git checkout Branch2

获得

[jthill@gadabout forktest]$ lgdo
* 6a5240f (Branch1) e'
* 4487d2d d'
| * 53e5c85 (HEAD -> Branch2) g
| * e9e416b f
| * 157a7a3 e
| * 266e1d7 d
|/  
* 4b78ef0 (master) b
* 93871d3 a

正是您的图片,如 git log --graph --decorate --oneline 所画。现在我和你一样,意识到我需要我当前分支的 rebase 来跟随对 Branch1 的更改,所以我告诉 Git 这种关系:

[jthill@gadabout forktest]$ git branch -u Branch1
Branch 'Branch2' set up to track local branch 'Branch1'.

并要求 Git 进行普通的 rebase:

[jthill@gadabout forktest]$ git rebase
First, rewinding head to replay your work on top of it...
Applying: f
Applying: g
[jthill@gadabout forktest]$ 

Git 找到了 Branch2 的上游,搜索了它的 reflog,发现提交 e 是最近的历史合并基础,并将其用作 rebase 截止点。

如果您明确指定新基地,Git 默认情况下不会执行此搜索,但您可以使用 --fork-point 选项明确要求。