Heim  >  Fragen und Antworten  >  Hauptteil

Erfordert Git Merge das Zusammenführen von Zweigen? Kann ich zwei Commits zusammenführen?

Git-Merge-Merge-Operation, muss die Spitze des Zweigs (Spitze des Zweigs) zusammengeführt werden, können zwei beliebige Commits zusammengeführt werden?
Zum Beispiel gibt es Branch Hotfix und Branch Master, die Struktur ist wie folgt:

      /A+--+B+----+C   hotfix
     /

init---->D +--->E +--->F+---->G Master

Frage 1:
Ich möchte einen Commit in der Mitte des Thotfix-Zweigs, z. B. B, mit dem aktuellen Zweigmaster zusammenführen.
Ist es in Ordnung?
Denn der Parametererklärung des Befehls nach zu urteilen, können Sie commit verwenden, anstatt den Zweignamen branchName verwenden zu müssen.

Frage 2:
Wenn es noch ein Zweigthema gibt (im Bild nicht dargestellt) und der aktuelle Zweig der Master ist, möchte ich die Hotfix- und Themenzweige zusammenführen, sie aber nicht mit dem aktuellen Zweigmaster zusammenführen, und das tue ich auch nicht Zweige wechseln Ich möchte den aktuellen Zweig behalten, aber ich bin ein Master. Kann ich das tun?
Da nach den Parametern des Befehls mehrere Commits akzeptiert werden können, heißt es im Handbuch, dass die Zusammenführung mehrerer Commits eine Oktopus-Zusammenführung darstellt. Es gibt also dieses Problem.

学习ing学习ing2702 Tage vor1307

Antworte allen(2)Ich werde antworten

  • ringa_lee

    ringa_lee2017-06-17 09:17:31

    使用cherry-pick挑选你要的提交

    Antwort
    0
  • 阿神

    阿神2017-06-17 09:17:31

    首先,你这张图画得貌似有点儿问题,看不出来这两个 branch 是从 哪儿分离的。你应该使用 git cherry-pick 命令,而不是 merge。只能猜一下,是不是这样?

       A - B - C           hotfix
      /
    init - D - E - F - G   master

    后面的回答都基于这个猜测。如果和你的不同,请评论指出。

    问题一:简单来说,最好用 cherry-pick
    首先你要知道,git merge <hash>git cherry-pick <hash> 是不同的。。如果你要在这里用 git merge B,那就会得到这样的结果:

         A  -  B  -  C   hotfix
        /       \
    init-D-E-F-G-G'      master

    但如果你是 git cherry-pick B,就会得到这样的结果:

       A - B - C                hotfix
      /
    init - D - E - F - G - B'   master

    merge 有它的优点,因为每一次 merge 其实都是创建一个新的 "merge commit",而且会 "保留历史",所以是一个 "non-destructive"(非破坏性)的过程。当然,cherry-pick 也有它的缺点,首先是创建一个新的 hash,这可能会导致多人协作的混乱。比如有人已经在 G 后面又加了 HJKL,那至少他还要 rebase 一下。另外,这个 B' 也不会像 merge 那样保留自己的历史记录。因此,确切的说,这个 B' 更像是一个 patch。(请参考 git format-patch https://git-scm.com/docs/git-...

    我个人比较喜欢 cherry-pickrebase 这样的命令,不太喜欢 merge,最主要是因为历史线简洁很多。虽然这两个命令比 merge 破坏性稍强,但稍微熟悉一点儿 git,知道每一步在做什么以及可能造成什么影响就好。


    问题二:
    感觉是不行的。merge 不像 rebase 那样有类似于 --onto 这样的参数。还是切换过去再 merge 吧。

    你后面说到章鱼合并,你说的是 --strategy=octopus 么?不太确定这个 strategy 和你要问的有什么联系。。因为多个 branchmerge 默认 strategy 就是 octopus。。不用去专门设置。。。顺便,对于单个 HEAD 的 merge,默认 strategy 是 recursive。

    对于你说的多个 commits 合并,请详细描述一下你的需求。或者画个图补充一下

    Antwort
    0
  • StornierenAntwort