将两个分支变基到另一个分支
Rebase two branches onto another branch
鉴于以下 git 历史记录:
将分支 feature/1
和 feature/2
变基到 master
以实现以下历史记录的最简单方法是什么:
到目前为止,我已经想出了以下内容:
- 结帐
feature/2
(我要变基的提交链的头)
- 将分支重新设置为主分支:
git rebase master
- 更改
feature/1
分支的头部:git branch -f feature/1 <hash>
其中 <hash>
是由 rebase
命令创建的重复 Feature 1
提交的哈希值。
它工作正常,但对我来说太复杂了。
告诉git你在做什么,顺序是:
git rebase master feature/1
git rebase feature/1 feature/2
像这样,你可以 c&p 这个:
git init test; cd $_
doit() { eval echo \>$*; git add ; git commit -m ""; }
doit master "Initial commit"
git checkout -tb feature/1
doit file1 "Feature 1"
git checkout -tb feature/2
doit file2 "Feature 2"
git checkout master
doit master "New commit on master"
准确生成图表:
$ git log --graph --decorate --oneline --all
* 35cfad5 (feature/2) Feature 2
* 46b79ae (feature/1) Feature 1
| * ae89e31 (HEAD -> master) New commit on master
|/
* f1138eb Initial commit
$
现在,自从您告诉 git 您的分支结构后,
$ git rebase master feature/1
First, rewinding head to replay your work on top of it...
Applying: Feature 1
$ git rebase feature/1 feature/2
First, rewinding head to replay your work on top of it...
Applying: Feature 2
$
最简单、最快捷的解决方案是您已经制定的解决方案。您可以结合步骤 1 和 2
git rebase master feature/2
并且您可能会发现,在很容易为目标提交计算表达式的情况下(如您的示例),避免处理提交 ID 会更容易
git branch -f feature/1 feature/2^
正如其他人所说,您可以使用两个变基。然而,这并不简单。也就是说,命令的复杂程度是否更简单,见仁见智;但你告诉 git 做的事情客观上更复杂。因此,出现问题的机会更多。例如,首先对 feature/1
进行变基,然后对 feature/1
进行变基 feature/2
的具体技术依赖于在第二次变基期间检测重复的补丁 ID,如果有的话,这将以不幸的方式失败冲突解决发生在第一次变基期间。如果你真的想使用 2-rebase 方法,我建议将 2nd rebase 完成为
git rebase --onto feature/1 feature/1@{1} feature/2
因为这甚至可以避免考虑重写 feature/1
提交。 (feature/1@{1}
是一个 reflog 条目,在它变基之前指向 feature/1
。)但是你使用的变基语法不太常见,据我所知至少是 "not simple" 就像你一开始所做的那样。
或者您可以使用 --fork-point
告诉 git 自动解释 reflog 并尝试找出哪些提交是重复的。
git rebase --fork-point feature/1 feature/2
只要您几乎同时在同一个克隆上执行两个变基,这在大部分时间 都有效。但它增加了更多的复杂性(以 "magic" 的形式,git 在幕后做了),所以你需要明白它可能会出错,如果它出错了,(a) 知道足够了解它尝试做什么来诊断问题,或者 (b) 退出并使用其他方法之一。
鉴于以下 git 历史记录:
将分支 feature/1
和 feature/2
变基到 master
以实现以下历史记录的最简单方法是什么:
到目前为止,我已经想出了以下内容:
- 结帐
feature/2
(我要变基的提交链的头) - 将分支重新设置为主分支:
git rebase master
- 更改
feature/1
分支的头部:git branch -f feature/1 <hash>
其中 <hash>
是由 rebase
命令创建的重复 Feature 1
提交的哈希值。
它工作正常,但对我来说太复杂了。
告诉git你在做什么,顺序是:
git rebase master feature/1
git rebase feature/1 feature/2
像这样,你可以 c&p 这个:
git init test; cd $_
doit() { eval echo \>$*; git add ; git commit -m ""; }
doit master "Initial commit"
git checkout -tb feature/1
doit file1 "Feature 1"
git checkout -tb feature/2
doit file2 "Feature 2"
git checkout master
doit master "New commit on master"
准确生成图表:
$ git log --graph --decorate --oneline --all
* 35cfad5 (feature/2) Feature 2
* 46b79ae (feature/1) Feature 1
| * ae89e31 (HEAD -> master) New commit on master
|/
* f1138eb Initial commit
$
现在,自从您告诉 git 您的分支结构后,
$ git rebase master feature/1
First, rewinding head to replay your work on top of it...
Applying: Feature 1
$ git rebase feature/1 feature/2
First, rewinding head to replay your work on top of it...
Applying: Feature 2
$
最简单、最快捷的解决方案是您已经制定的解决方案。您可以结合步骤 1 和 2
git rebase master feature/2
并且您可能会发现,在很容易为目标提交计算表达式的情况下(如您的示例),避免处理提交 ID 会更容易
git branch -f feature/1 feature/2^
正如其他人所说,您可以使用两个变基。然而,这并不简单。也就是说,命令的复杂程度是否更简单,见仁见智;但你告诉 git 做的事情客观上更复杂。因此,出现问题的机会更多。例如,首先对 feature/1
进行变基,然后对 feature/1
进行变基 feature/2
的具体技术依赖于在第二次变基期间检测重复的补丁 ID,如果有的话,这将以不幸的方式失败冲突解决发生在第一次变基期间。如果你真的想使用 2-rebase 方法,我建议将 2nd rebase 完成为
git rebase --onto feature/1 feature/1@{1} feature/2
因为这甚至可以避免考虑重写 feature/1
提交。 (feature/1@{1}
是一个 reflog 条目,在它变基之前指向 feature/1
。)但是你使用的变基语法不太常见,据我所知至少是 "not simple" 就像你一开始所做的那样。
或者您可以使用 --fork-point
告诉 git 自动解释 reflog 并尝试找出哪些提交是重复的。
git rebase --fork-point feature/1 feature/2
只要您几乎同时在同一个克隆上执行两个变基,这在大部分时间 都有效。但它增加了更多的复杂性(以 "magic" 的形式,git 在幕后做了),所以你需要明白它可能会出错,如果它出错了,(a) 知道足够了解它尝试做什么来诊断问题,或者 (b) 退出并使用其他方法之一。