gpt4 book ai didi

git - 将单个分支历史转换为许多较小的 merge 分支

转载 作者:太空狗 更新时间:2023-10-29 13:33:11 26 4
gpt4 key购买 nike

问题

基本上,我有一个坏习惯,就是在开发过程中忘记创建分支。这给我留下了大量的提交痕迹,很难看出一个功能从哪里开始,下一个功能从哪里结束。

可能的解决方案

提交是有序的,我只是希望能够将单个主分支分解为几个较小的功能分支,然后 merge 回主分支。

当前的 Git 仓库:

-- A -- B -- C -- D -- E -- F -- G -- H => master

理想的 Git 仓库:

       B -- C => feature1 
/ \
-- A --------- D -- E --------- H => master
\ /
F -- G => feature2

我尝试过的

我读过其他一些类似的问题,但找不到任何描述我的问题的内容。我试过 git rebase 但我不太确定在这种情况下如何使用它,显然它可能还需要 --onto 选项。

非常感谢任何帮助,因为这将使我的存储库更美观!

最佳答案

图例

  • A' 表示来自提交 A 的补丁和消息,但是不同的提交散列,因为父级已更改。
  • branch-name* 表示 branch-name 是当前 checkout 的分支 HEAD

-- A -- B -- C -- D -- E -- F -- G -- H => master


B -- C -- D
/ \
-- A ------------- M1 -- E ------------ M2 => master
\ /
F -- G -- H

Note that in your diagram you have marked having your previous non-merge commits D and H as merge commits in the end. I don't believe this is what you want as you would usually have different patches and messages in these commits which you want to keep separate from the merge commit. I've added M1 and M2 respectively in the end result.

你应该可以使用这个:

git checkout 大师

git reset --hard A

-- A => master*
\
B -- C -- D -- E -- F -- G -- H

git checkout -b feature1 D(不需要,但可以作为标签)

                   => feature1
/
B -- C -- D -- E -- F -- G -- H
/
-- A => master*

git merge --no-ff feature1

                   => feature1
/
B -- C -- D -- E -- F -- G -- H
/ \
-- A ------------- M1 => master*

git cherry-pick E

                     => feature1
/
B -- C -- D -- E -- F -- G -- H
/ \
-- A -------------- M1 -- E' => master*

git checkout -b feature2 H

                     => feature1
/
B -- C -- D -- E -- F -- G -- H => feature2*
/ \
-- A -------------- M1 -- E' => master

git rebase --onto E master

Reset to master, cherry pick everything from E to H on top with rebase.


Note we choose E here and not E' as --onto is about the history of the branch being rebased, not what we are rebasing on top of. Equivalent would be git rebase --onto F^ master where F^ means the parent of F in Git.

                     => feature1
/
B -- C -- D -- E -- F -- G -- H
/ \
-- A -------------- M1 -- E' => master
\
F' -- G' -- H' => feature2*

git checkout 大师

                     => feature1
/
B -- C -- D -- E -- F -- G -- H
/ \
-- A -------------- M1 -- E' => master*
\
F' -- G' -- H' => feature2

git merge --no-ff feature2

                   => feature1
/
B -- C -- D -- E -- F -- G -- H
/ \
-- A ------------ M1 -- E' --------------- M2 => master*
\ /
F' -- G' -- H' => feature2

当没有任何命名引用指向它们的提交被丢弃时的最终结果:

      B -- C -- D => feature1
/ \
-- A ------------ M1 -- E' --------------- M2 => master*
\ /
F' -- G' -- H' => feature2

关于git - 将单个分支历史转换为许多较小的 merge 分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48879390/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com