COPY 本地提交到另一个分支

COPY local commits to another branch

我正在阅读 rebase 文档。变基 "Forward-port local commits to the updated upstream head"。好的,...可以 copy 本地提交到上游更新吗?

这是起点:

           o---o---o---o---o  master
                \
                 o---o---o---o---o  next
                                  \
                                   o---o---o  topic

这是我可以通过rebase得到的:

           o---o---o---o---o  master
               |            \
               |             o'--o'--o'  topic
                \
                 o---o---o---o---o  next

这就是我想要的:

           o---o---o---o---o  master
               |            \
               |             o'--o'--o'  new topic
                \
                 o---o---o---o---o  next
                                  \
                                   o---o---o  topic

没有原因:我只是想问一下是否可以。

只需创建一个新分支并重新设置该分支即可。

git checkout topic
git checkout -b new_topic
git rebase next new_topic --onto master
  1. git checkout -b topic2 master

    o---o---o---o---o  master / topic2
                \
                 o---o---o---o---o  next
                                  \
                                   o---o---o  topic
    
  2. git rebase --onto topic2 next topic

    将所有从 next(不包括)到主题(包括)的提交变基到 topic2

     o---o---o---o---o  master
           |            \
           |             o'--o'--o'  topic2
            \
             o---o---o---o---o  next
                              \
                               o---o---o  topic
    

PS: 如果您已经重新设置 topic 分支的基线

       o---o---o---o---o  master
           |            \
           |             o'--o'--o'  topic
            \
             o---o---o---o---o  next

'old' 提交没有消失。检查 git reflog 并且您可以重新创建 'old' 分支。

 git checkout -b old_topic <TOPIC_COMMIT_ID_BEFORE_REBASE>

除了 rebase 这是一个比方说更复杂的工具,还有一个 cherry-pick 命令可以直接执行提交的副本。

首先在 master 上创建一个新分支并检出它。现在 note/read/view 您要复制的所有提交的 哈希值

           o---o---o---o---o  master / new-topic
               |           
               |           
                \
                 o---o---o---o---o  next
                                  \
                                   C---B---A  topic
                                   :   :   :
                                   :   :   ^ commit hash AAAAA
                                   :   ^ commit hash BBBBB
                                   ^ commit hash CCCCC

坐在 new-topic 分支,问题:

git cherry-pick CCCCC

           o---o---o---o---o  master
               |            \
               |             c'  new-topic
                \
                 o---o---o---o---o  next
                                  \
                                   C---B---A  topic

git cherry-pick BBBBB
git cherry-pick AAAAA

           o---o---o---o---o  master
               |            \
               |             c'---b'---a'  new-topic
                \
                 o---o---o---o---o  next
                                  \
                                   C---B---A  topic

您可以切换它们的顺序,同时使用 --no-commit 和修补它们,等等 - 就像在 rebase --interactive 期间一样,但是要一步一步地手动进行。实际上,您可能会认为 rebase 类似于不错的大规模自动化 cherry-pick