Git Rebase vs;“反向合并”;

Git Rebase vs;“反向合并”;,git,Git,在git中,如果我有一个旧功能,我们就称之为,feature/improvement从mastermaster分支的feature/improvement得到大约500次提交,并且feature/improvement需要更新,我看到了3个选项 将主控形状合并到功能/改进上 将功能/改进合并到master指向的提交上,并将功能/改进的属性更改为指向新的合并提交 重基 2对我来说似乎是最直接的选项,它显示了一个合并提交,它显示了旧的更改,并重新应用于最新的主更改 但是工具和历史会变得非常混乱,因为

在git中,如果我有一个旧功能,我们就称之为,
feature/improvement
master
master分支的
feature/improvement
得到大约500次提交,并且
feature/improvement
需要更新,我看到了3个选项

  • 将主控形状合并到功能/改进上
  • 将功能/改进合并到master指向的提交上,并将功能/改进的属性更改为指向新的合并提交
  • 重基
  • 2对我来说似乎是最直接的选项,它显示了一个合并提交,它显示了旧的更改,并重新应用于最新的主更改

    但是工具和历史会变得非常混乱,因为它是“倒退”或“逆转的”

    我是不是误解了一些基本的东西?我不明白有什么明显的缺点吗

    为什么要重新设定基准

    编辑:

    根据要求,我已经创建了一个“反向合并”的演示repo,很抱歉git命令/输入错误太差了

    306  touch demo.txt
      307  echo "1" > demo.txt
      308  git add demo.txt
      309  git commit "Master 1"
      310  git status
      311  git commit -m "Master 1"
      312  echo "2" > demo.txt
      313  git commit "Master 2"
      314  git add .
      315  git commit -m "Master 2"
      316  git status
      317  git log
      318  git branch feature
      319  git checkout feature
      320  echo "a" > demo.txt
      321  echo "b" > demo.txt
      322  echo "c" > demo.txt
      323  git commit -m "feature c"
      324  git add .
      325  git commit -m "feature c"
      326  echo "d" > demo.txt
      327  git commit -m "feature d"
      328  git add .
      329  git commit -m "feature d"
      330  git checkout master
      331  echo "3" > demo.txt
      332  git add .
      333  git commit -m "master 3"
      334  echo "4" > demo.txt
      335  git add .
      336  git commit -m "master 4"
      337  echo "5" > demo.txt
      338  git add .
      339  git commit -m "master 5"
      340  git branch feature2
      341  git checkout feature2
      342  git merge help
      343  git help merge
      344  git merge feature
      345  git add .
      // This is where I gave up, and Used Source Tree to use a GUI to reset feature to feature2's ref
      346  git status
      347  git commit
      348  git status
      349  echo "e" > demo.txt
      350  git add .
      351  git commit -m "feature e"
      352  checkout -b "master"
      353  git checkout master
      354  git commit -m "master 6"
      355  echo "6" > demo.txt
      356  git add .
      357  git commit -m "master 6"
    
    导致

    合并将获取
    主控
    中的所有更改,并尝试将它们与
    功能/改进
    的更改合并。请原谅这些可怜的ascii图表

    master   -------------
    feature  \----\--
             ^    ^
        Branch    Merge
    
    rebase将获取
    功能/改进
    中的所有更改,并实际移动这些更改,就好像它们是在提交
    主控
    更改后提交的一样

    重设基准前:

    master   -------------
    feature  \------
             ^
        Branch
    
    重设基准后:

    master   -------------
    feature               \------
                          ^
                     Branch
    
    换言之:

    • 合并:“合并这两个提交”
    • Rebase:“重写历史记录,以便我的提交中的所有更改仅在master之后应用”

    合并将采用
    主控
    中的所有更改,并尝试将它们与
    功能/改进
    的更改合并。请原谅这些可怜的ascii图表

    master   -------------
    feature  \----\--
             ^    ^
        Branch    Merge
    
    rebase将获取
    功能/改进
    中的所有更改,并实际移动这些更改,就好像它们是在提交
    主控
    更改后提交的一样

    重设基准前:

    master   -------------
    feature  \------
             ^
        Branch
    
    重设基准后:

    master   -------------
    feature               \------
                          ^
                     Branch
    
    换言之:

    • 合并:“合并这两个提交”
    • Rebase:“重写历史记录,以便我的提交中的所有更改仅在master之后应用”

      • 我不知道反向合并。但在这种情况下,我们有两种选择。首先,
        git-rebase
        。让我们看看rebase做了什么。 考虑下面的历史: 船长:c1、c2、c3、c4 改进:c1、c2、c5、c6、c7
        获得了结帐改进
        git重新基址主机
        现在,首先将删除您在yot分支上所做的所有提交,然后将应用来自主节点的新提交,以使您的历史记录与主节点相同。在此之后,rebase将把您的工作应用到它上面

        您的历史变成: c1,c2,c3,c4,c5,c6,c7

        根据我的说法,这使得事情变得非常复杂,但如果您已经将更改从
        改进
        推送到远程,则不建议执行重基,因为它可能会创建重复提交

        第二,git合并

        它将在改进分支上应用来自主分支的提交以及合并提交。如果您已经远程推送了tour分支,建议使用此选项


        希望有帮助。

        我不知道反向合并。但在这种情况下,我们有两种选择。首先,
        git-rebase
        。让我们看看rebase做了什么。 考虑下面的历史: 船长:c1、c2、c3、c4 改进:c1、c2、c5、c6、c7
        获得了结帐改进
        git重新基址主机
        现在,首先将删除您在yot分支上所做的所有提交,然后将应用来自主节点的新提交,以使您的历史记录与主节点相同。在此之后,rebase将把您的工作应用到它上面

        您的历史变成: c1,c2,c3,c4,c5,c6,c7

        根据我的说法,这使得事情变得非常复杂,但如果您已经将更改从
        改进
        推送到远程,则不建议执行重基,因为它可能会创建重复提交

        第二,git合并

        它将在改进分支上应用来自主分支的提交以及合并提交。如果您已经远程推送了tour分支,建议使用此选项


        希望有帮助。

        @吉姆·赖特的答案很好。关于
        $git-rebase
        的一些其他想法:

        就生成的源代码而言,合并和重基有什么区别? 没有。两个操作完成后将生成相同的源代码

        为什么要重新设定基准? Git的rebase操作将使项目的历史记录更加线性,因此更易于阅读

        git-rebase
        这样的“重写”提交历史的命令不是很糟糕吗? 我不认为rebase不好。这是保持历史可读性的非常有用的技术。 清晰易读的VCS历史有助于理解项目的发展。我建议保持它整洁,即使有一点额外的努力

        另一方面,如果您使用的是已发布的主题分支,则应避免重新编写历史记录的操作,因为这可能会影响到其他拉入该分支的团队成员。也就是说,一些团队(比如我的团队)有关于在主题分支上重写历史记录的许可规则。我的队伍很小。如果我确信没有其他人撤销我的分支,我很可能会重新设定基准。在合并拉取请求时,我还将定期重新设置过时主题分支的基础

        “重写”提交是怎么回事?我以为Git的历史是加密的?
        Git从不覆盖任何提交。它复制或重放诸如rebase之类的操作的提交。事实上,在一段时间内,从中复制的提交Git仍然可以通过reflog使用。它们不会通过重基操作自动销毁,必要时可以恢复。

        @Jim Wright的答案很好。关于
        $git-rebase
        的一些其他想法:

        就生成的源代码而言,d是什么