当父分支从 master 更改时更改分支的 ref
change ref of branchB when parent branchA was changed from master
肯定已经有人问过关于这个主题的类似问题,但我找不到它,也找不到合适的词来寻找它。
假设我有这个:
a -- b <-- Master
\
d -- e <-- Branch1
\
f -- g <-- Branch2
但在某些时候,在合并到 Master 之前,我不得不重写在 Branch1
的提交 d
和 e
中完成的代码,所以它们变成了 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
将不包含 d
,e
, 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
选项明确要求。
肯定已经有人问过关于这个主题的类似问题,但我找不到它,也找不到合适的词来寻找它。
假设我有这个:
a -- b <-- Master
\
d -- e <-- Branch1
\
f -- g <-- Branch2
但在某些时候,在合并到 Master 之前,我不得不重写在 Branch1
的提交 d
和 e
中完成的代码,所以它们变成了 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
将不包含 d
,e
, 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
选项明确要求。