git 如何将分支中的旧提交移动到新分支?

noj0wjuj  于 2023-06-28  发布在  Git
关注(0)|答案(2)|浏览(138)

我有一个名为staging的分支,其中包含我想移动到两个单独分支的旧提交。

A - B - C - D - E - F - G - H - I   staging

我想将提交BC移动到一个新的分支:feature-a。然后将提交DEF移动到新分支:feature-b
最后,我的分支看起来像这样:

A - G - H - I   staging
A - B - C       feature-a
A - D - E - F   feature-b

staging分支是公开的,其他开发人员可能有它的本地版本。我怎么能做到这一点?

flseospp

flseospp1#

NB:可能有更好的方法,但这里有一个方法。
创建feature-a很简单:

git branch feature-a C

我们可以通过基于A创建一个新分支,然后使用cherry-pick来创建feature-b

git checkout -b feature-b A
git cherry-pick feature-a..F

git-rev-parse手册页中记录了该r1..r2表达式:
..(两点)范围表示法
^r1 r2集合操作出现得如此频繁,以至于有一种简写。当你有两个提交r1r2(根据上面指定修订中解释的语法命名)时,你可以要求从r2可到达的提交,排除那些通过^r1 r2r1可到达的提交,它可以写成r1..r2
最后,我们可以在staging分支上使用git rebase -i --root来删除提交B-F:

git checkout staging
git rebase -i --root

在我的测试存储库中,这会导致:

$ git log --oneline staging
15326ce (HEAD -> staging) This is commit I
3862020 This is commit H
a26f0bb This is commit G
9bc662c This is commit A

$ git log --oneline feature-a
b390f07 (feature-a) This is commit C
1489cd1 This is commit B
9bc662c This is commit A

$ git log --oneline feature-b
f8f3c18 (feature-b) This is commit F
0eb0b08 This is commit E
4e2ed05 This is commit D
9bc662c This is commit A
cclgggtu

cclgggtu2#

@larsks的答案很好(被投票赞成),但它也可以在没有任何来自rebase或cherry-picking的交互工作的情况下完成。从原始设置开始

git branch feature-a C # branch needs no more work

现在你有:

* I (staging)
* H
* G
* F
* E
* D
* C (feature-a)
* B
* A

然后:

git branch feature-b F

现在您拥有:

* I (staging)
* H
* G
* F (feature-b)
* E
* D
* C (feature-a)
* B
* A

然后:

git rebase --onto A feature-a feature-b # place on top of commit A all commits in feature-b that are _past_ feature-a (D, E and F)

现在您拥有:

* I (staging)
* H
* G
* F
* E
* D
* C (feature-a)
* B
| * F' (feature-b)
| * E'
| * D'
|/
* A
git rebase --onto A F staging # place on top of A all commits that make up staging past F (G, H, I)

最后你有:

* C (feature-a)
* B
| * F' (feature-b)
| * E'
| * D'
|/
| * I' (staging)
| * H'
| * G'
|/
* A

相关问题