如何重新绑定一堆链式拉请求?

时间:2014-03-06 22:39:53

标签: git version-control github workflow pull-request

我如何干净地改变一堆彼此分叉的拉取请求?

我有3个拉链请求彼此“链接”(ABC),所有这些请求都来自干净的主人。即在我创建了远程分支A之后,我从A进行了一些更改,进入了新的分支B。我在两个分支之间的diff中发出了一个pull请求,并将其称为pull request B

从那时起,师父已经改变了(大概)。

拉取请求A与当前主人“最接近”,因为那里的更改很可能是关闭主人的。但我需要对A进行一些修改并更新我的拉取请求(来自代码审查)。我假设我可以使用拉请求分支A轻松地从主服务器中退出。

当我尝试将B重新绑定回“主人”时(从A更改)会发生什么?我想从更新的A开始挑选第一个樱桃?如何正确选择AB没有)的更改,B然后可以将其更改为主?

在一天结束时,我只想要更改A(以及新的更改),BC重新加入主人,以便主人的历史记录清晰。这样做的最佳方式是什么?

(随意纠正我的术语,我不认为“rebase into master”是正确的。我只是想说当我说“rebase into master”时我想重播我对master的更改)< / p>

2 个答案:

答案 0 :(得分:1)

所以,我认为这就是你如何设置你的分支机构,但如果这是错误的话,请纠正我:

  master-with-new-commits
 /
/
master-old - A - B - C

你说你想把A重新绑定到master,然后通过分支链传播,这是正确的吗?如果是,那么您只需对每个分支多次使用rebase,在其重新定位的父级之上重新定位每个分支,如下所示:

git rebase --onto <new-base> <old-base> <branch>
git rebase --onto master-with-new-commits master-old A
git rebase --onto new-A A@{1} B
git rebase --onto new-B B@{1} C

在这种情况下,branch@{1}语法仅仅意味着branch在其第一个位置的状态,即在它被重新定位之前(假设干净地应用了rebase并且没有任何冲突)。如果存在冲突,您可以简单地为每个分支使用旧基础的提交sha而不是branch@{1}语法。

完成所有变基后,您应该拥有以下内容:

  master-with-new-commits - new-A - new-B - new-C
 /
/
master-old - A - B - C

答案 1 :(得分:0)

显然,您需要做的就是......在A上更改您内心的内容。从新分支A重新绑定master并将其全部合并为master(--no-ff)。

然后从B修改主人,并且更改是!!当重放更改失败时,git会进行非常聪明的3向合并。因此,从新的Amaster开到分支B或新B,您可以非常轻松地完成所需的所有更改。

根据需要重复步骤。

如果您遇到重复提交,只需按照它git rebase --skip告诉您:)