必须有一个类似的问题已经被问及这个主题,但我找不到它,也没有正确的词来寻找它。
假设我有这个:
a -- b <-- Master
\
d -- e <-- Branch1
\
f -- g <-- Branch2
但在某些时候,在合并到Master之前我必须重写d
和e
的Branch1
提交的代码,所以他们成为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
你将把旧的qazxsw poi base(qazxsw poi)之后的qazxsw poi的所有提交重放到新的Branch2
HEAD上。
所有你需要做的,当重写Branch1
时,首先要制作一个标记(e
分支或标记),以标记'Branch1
'提交。
(tl; dr:你所追求的实际上是Git的默认行为。只需告诉它你的分支的上游关系,你的命令就是简单的Branch1
。)
当你告诉它关于上游关系并让它使用它们时,这就是Git的行为,就像它的默认情况一样。
试试这个:
tmp
并且你已经掌握了初始条件,现在在Branch1上完全重写:
e
要得到
git rebase
完全是你的照片,正如new() { touch $1; git add .; git commit -m$1; }
git init forktest; cd $_
new a
new b
git checkout -b Branch1
new d
new e
git checkout -b Branch2
new f
new g
所描绘的那样。现在,我和你一样,意识到我需要当前分支的rebase跟随Branch1的更改,所以我告诉Git关于这种关系:
git checkout -B Branch1 master
new d\'
new e\'
git checkout Branch2
并问Git一个简单的变形:
[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已经发现Branch2的上游,通过其reflogs搜索,发现提交git log --graph --decorate --oneline
是最近的历史合并基础并且使用它作为rebase cutoff。
如果你明确指定新的基数,默认情况下Git不会执行此搜索,但您可以使用[jthill@gadabout forktest]$ git branch -u Branch1
Branch 'Branch2' set up to track local branch 'Branch1'.
选项明确要求它。