Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 如何将一个分支与一个部分重设基础并强制推送的主分支合并?_Git_Tfs - Fatal编程技术网

Git 如何将一个分支与一个部分重设基础并强制推送的主分支合并?

Git 如何将一个分支与一个部分重设基础并强制推送的主分支合并?,git,tfs,Git,Tfs,最初,我需要从主服务器恢复一些提交,包括合并的拉请求。让我们称之为“不必要的重构” 但这些变化在未来是需要的 我根据master的当前状态创建了一个新的分支develop,以便在那里进行这些更改 我决定将master硬重置为pull-request-merge的父提交(这是repo的稳定状态): git复位——硬ad23b887 然后,选择其他不是“不需要的重构”的提交: git cherry pick 现在,我想执行一个force push命令,它应该覆盖原始/主分支历史 在未来,我将需要

最初,我需要从主服务器恢复一些提交,包括合并的拉请求。让我们称之为“不必要的重构”

但这些变化在未来是需要的

我根据master的当前状态创建了一个新的分支develop,以便在那里进行这些更改

  • 我决定将master硬重置为pull-request-merge的父提交(这是repo的稳定状态):

    git复位——硬ad23b887

  • 然后,选择其他不是“不需要的重构”的提交:

    git cherry pick

  • 现在,我想执行一个force push命令,它应该覆盖原始/主分支历史

    在未来,我将需要将“不需要的重构”合并到develop的master中,届时将对其进行100%测试。但是,如果事实上,这两个分支有不同的历史(因为樱桃采摘和重置了一个头),那么我应该如何合并这两个分支呢

    重置一个头部,然后只挑选我在这种情况下需要的头部,这是恢复提交的正确方法吗

    另外,我的团队由两人组成,我认为这样的操作没有任何问题。

    让我们想象一下

    最初,我需要从主服务器恢复一些提交,包括合并的拉请求

    我根据master的当前状态创建了一个新的分支develop,以便在那里进行这些更改

    我决定硬重置master到pull-request-merge的父提交(这是repo的稳定状态):
    git-reset——硬ad23b887

    假设ad23b887是提交B

    A - B [master]
        |\
        | C ----------- M [develop]
         \             /
          F - G - H - I 
    
    这是同一张图,只是移动了一点,这样我们就可以和master一起工作了

    然后,选择其他不是“不需要的重构”的提交:
    git cherry pick

    假设是G和I

    A - B - G1 - I1 [master]
        |\
        | C ----------- M [develop]
         \             /
          F - G - H - I 
    
    现在,我想执行一个force push命令,它应该覆盖原始/主分支历史

    是的,但是使用。这样更安全。我把它化名为repush

    在未来,我将需要将“不需要的重构”合并到develop的master中,届时将对其进行100%测试。但是,如果事实上,这两个分支有不同的历史(因为樱桃采摘和重置了一个头),那么我应该如何合并这两个分支呢

    在母版的基础上进行再基开发。这将在master上重播developer的提交。合并将消失。你从中挑选出来的现在多余的提交也是如此,因为现在开发已经从master那里得到了这些更改

    A - B - G1 - I1 [master]
        |\
        | C ----------- M [develop]
         \             /
          F - G - H - I 
    
    $ git checkout develop
    $ git rebase master
    
    A - B - G1 - I1 [master]
                  \
                   C - F - H [develop]
    
    现在,您可以通过正常的公关流程进行合并开发

    A - B - G1 - I1 -------- M1 [master]
                  \         /
                   C - F - H
    
          G1 - I1
         /       \
    A - B ------- N [master]
        |\
        | C ----------- M [issue/#1234]
         \             /
          F - G - H - I 
    
          G1 - I1
         /       \
    A - B ------- N --------- M1 [master]
                   \         /
                    C - F - H
    

    重置一个头部,然后只挑选我在这种情况下需要的头部,这是恢复提交的正确方法吗

    让我们回到你摘樱桃之前

    避免像develope这样的泛型分支。给它一个与你正在做的事情相关的名字。一个好的选择是在问题跟踪器中使用ID,这会鼓励每个分支都有问题

    A - B [master]
        |\
        | C ----------- M [issue/#1234]
         \             /
          F - G - H - I 
    
    我建议永远不要直接向大师承诺,而是始终使用。这确保每项变更都经过了审查、QA等PR流程。这意味着主人总是稳定地在上面工作

    要做到这一点,做一个新的分支只是为了合并樱桃采摘

    $ git checkout -b issue/#abcd
    $ git cherry-pick G I
    
          G1 - I1 [issue/#abcd]
         /
    A - B [master]
        |\
        | C ----------- M [issue/#1234]
         \             /
          F - G - H - I 
    
    他们通过正常的公关流程将其合并

    A - B - G1 - I1 -------- M1 [master]
                  \         /
                   C - F - H
    
          G1 - I1
         /       \
    A - B ------- N [master]
        |\
        | C ----------- M [issue/#1234]
         \             /
          F - G - H - I 
    
          G1 - I1
         /       \
    A - B ------- N --------- M1 [master]
                   \         /
                    C - F - H
    
    现在在master上重新设置问题/1234的基础

          G1 - I1
         /       \
    A - B ------- N [master]
                   \
                    C - F - H [issue/#1234]
    
    并通过正常的公关流程合并问题/1234

    A - B - G1 - I1 -------- M1 [master]
                  \         /
                   C - F - H
    
          G1 - I1
         /       \
    A - B ------- N [master]
        |\
        | C ----------- M [issue/#1234]
         \             /
          F - G - H - I 
    
          G1 - I1
         /       \
    A - B ------- N --------- M1 [master]
                   \         /
                    C - F - H
    
    历史上的这些颠簸被称为“特征泡泡”,它们正是你想要看到的。它们有助于保持历史简单易懂,掌握稳定。

    让我们想象一下

    最初,我需要从主服务器恢复一些提交,包括合并的拉请求

    我根据master的当前状态创建了一个新的分支develop,以便在那里进行这些更改

    我决定硬重置master到pull-request-merge的父提交(这是repo的稳定状态):
    git-reset——硬ad23b887

    假设ad23b887是提交B

    A - B [master]
        |\
        | C ----------- M [develop]
         \             /
          F - G - H - I 
    
    这是同一张图,只是移动了一点,这样我们就可以和master一起工作了

    然后,选择其他不是“不需要的重构”的提交:
    git cherry pick

    假设是G和I

    A - B - G1 - I1 [master]
        |\
        | C ----------- M [develop]
         \             /
          F - G - H - I 
    
    现在,我想执行一个force push命令,它应该覆盖原始/主分支历史

    是的,但是使用。这样更安全。我把它化名为repush

    在未来,我将需要将“不需要的重构”合并到develop的master中,届时将对其进行100%测试。但是,如果事实上,这两个分支有不同的历史(因为樱桃采摘和重置了一个头),那么我应该如何合并这两个分支呢

    在母版的基础上进行再基开发。这将在master上重播developer的提交。合并将消失。你从中挑选出来的现在多余的提交也是如此,因为现在开发已经从master那里得到了这些更改

    A - B - G1 - I1 [master]
        |\
        | C ----------- M [develop]
         \             /
          F - G - H - I 
    
    $ git checkout develop
    $ git rebase master
    
    A - B - G1 - I1 [master]
                  \
                   C - F - H [develop]
    
    现在,您可以通过正常的公关流程进行合并开发

    A - B - G1 - I1 -------- M1 [master]
                  \         /
                   C - F - H
    
          G1 - I1
         /       \
    A - B ------- N [master]
        |\
        | C ----------- M [issue/#1234]
         \             /
          F - G - H - I 
    
          G1 - I1
         /       \
    A - B ------- N --------- M1 [master]
                   \         /
                    C - F - H
    

    重置一个头部,然后只挑选我在这种情况下需要的头部,这是恢复提交的正确方法吗

    让我们回到你摘樱桃之前

    避免像develope这样的泛型分支。给它一个与你正在做的事情相关的名字。一个好的选择是在问题跟踪器中使用ID,这会鼓励每个分支都有问题

    A - B [master]
        |\
        | C ----------- M [issue/#1234]
         \             /
          F - G - H - I 
    
    我建议永远不要直接向大师承诺,而是始终使用。这确保每项变更都经过了审查、QA等PR流程。这意味着主人总是稳定地在上面工作

    要做到这一点,做一个新的分支只是为了合并樱桃采摘

    $ git checkout -b issue/#abcd
    $ git cherry-pick G I
    
          G1 - I1 [issue/#abcd]
         /
    A - B [master]
        |\
        | C ----------- M [issue/#1234]
         \             /
          F - G - H - I 
    
    他们通过正常的公关流程将其合并

    A - B - G1 - I1 -------- M1 [master]
                  \         /
                   C - F - H
    
          G1 - I1
         /       \
    A - B ------- N [master]
        |\
        | C ----------- M [issue/#1234]
         \             /
          F - G - H - I 
    
          G1 - I1
         /       \
    A - B ------- N --------- M1 [master]
                   \         /
                    C - F - H
    
    现在在master上重新设置问题/1234的基础

          G1 - I1
         /       \
    A - B ------- N [master]
                   \
                    C - F - H [issue/#1234]
    
    并通过正常的公关流程合并问题/1234

    A - B - G1 - I1 -------- M1 [master]
                  \         /
                   C - F - H
    
          G1 - I1
         /       \
    A - B ------- N [master]
        |\
        | C ----------- M [issue/#1234]
         \             /
          F - G - H - I 
    
          G1 - I1
         /       \
    A - B ------- N --------- M1 [master]
                   \         /
                    C - F - H
    
    历史上的这些颠簸被称为“特征泡泡”,它们正是你想要看到的。它们有助于简化历史记录