Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.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_Merge_Rebase - Fatal编程技术网

如何在git中管理合并和重定基址?

如何在git中管理合并和重定基址?,git,merge,rebase,Git,Merge,Rebase,我明白重新设置基础的目的。这对我来说很有意义。基本上,我有一个功能分支,我正在工作,我准备把它放到主分支中,我会做一个重基,将我所有的提交压缩到一个干净的分支中,这样它就可以很容易地集成到主分支中,而无需所有混乱的历史。对吧? 这就是我们一直在做的 创建要素分支 在构建功能时添加一组提交 定期将主分支合并到要素分支中(以避免痛苦的合并) 完成所有操作后,将要素分支合并到主分支中 我看到的问题是,定期将主分支合并到功能分支会在重定基址时导致问题,因为现在我的功能签入中混合了一堆主分支签入 这里的正

我明白重新设置基础的目的。这对我来说很有意义。基本上,我有一个功能分支,我正在工作,我准备把它放到主分支中,我会做一个重基,将我所有的提交压缩到一个干净的分支中,这样它就可以很容易地集成到主分支中,而无需所有混乱的历史。对吧?

这就是我们一直在做的

  • 创建要素分支
  • 在构建功能时添加一组提交
  • 定期将主分支合并到要素分支中(以避免痛苦的合并)
  • 完成所有操作后,将要素分支合并到主分支中
  • 我看到的问题是,定期将主分支合并到功能分支会在重定基址时导致问题,因为现在我的功能签入中混合了一堆主分支签入

    这里的正确工作流程是什么?以下命令在哪里起作用:

    • git rebase-我的头^#
    • git重基主控器
    • git合并主机
    • 吉特雷雷雷尔酒店
    • git重置--硬头^

    如果您要重新设置分支的基础,只要在希望“合并”中的更改时重新设置基础即可。在准备将该分支“合并”到主分支之前,您不必重新设置基础+挤压。在分支生命结束时,您应该只与主分支合并一次。特性/主题分支的思想是,它只包含与特性相关的更改;当你在master中反复合并时,你会失去它。(你可以读什么。)

    你可以做一个“练习”合并,你会扔掉它,然后使用
    git-rere
    让git自动记录你的合并决议,这样当你真的准备好合并时就可以重复使用它们。有关背景和教程,请参见。这真的很酷,因为它允许您完成合并工作,而无需在任何地方明确提交,然后在您真正准备创建合并时“神奇地”将该工作返回。因此,你可以做一些小的、希望更简单的、中间的“实践”合并,而不是在最后进行一次痛苦的合并。粗略地说:

    # Enable rerere
    git config --global rerere.enabled 1
    # Start a feature branch
    git checkout -b feature
    # Hack hack hack
    git commit
    git commit
    # Practice merge
    git merge master
    # ...then throw the merge commit away, the work is saved by rerere
    git reset --hard HEAD^
    # Hack hack hack
    git commit
    # Really merge to master, reusing any saved work from rerere
    git checkout master
    git merge feature
    git branch -d feature
    
    另请参见以获取其他教程

    您还可以定期在master上重新设置主题分支的基础,然后在末尾进行合并

    要处理像您当前所处的情况,一个主题分支(例如名为
    功能
    )具有一系列来自main的合并和各种正在进行的提交,最简单的方法是执行压缩合并以生成“合并”工作树,然后创建一个新的提交(或一系列提交)上主楼。例如:

    git checkout master
    git merge --squash feature
    git commit
    
    这将产生一个单一的提交,该提交表示特性头部的树的状态,并合并到主文件中

    当然,对于此更改,您也可以定期合并到
    master
    ,保留
    功能的混乱历史,并在将来更干净地工作。e、 g.简单地说

    git checkout master
    git merge feature
    
    然后继续。

    如果您要重新设置基址(我建议您这样做),那么永远不要从master合并。rebase工作流基于这样一种理念,即主题分支由从主功能到新功能的路径组成,而不包括其他内容。当master向前移动时,您为实现新功能所做的更改也随之移动

    当您最终准备将更改引入master时,您有两个主要选项:

  • 最后一次对master重新设置基址,然后执行正常的快进合并,这基本上会将所有分支的提交一个接一个地提交到master中。这将保持更细粒度的历史记录,但是如果中间提交破坏了构建,那么您可能更愿意挤压它们。交互式重基(-i)可以帮助安排这些提交

  • 使用merge--squash在master中进行单个提交,其中包含所有分支的更改


  • 我相信简单的答案是:

    如果出现以下情况,请使用git merge--squash

    例如,如果您有一个功能分支,并且在工作时从另一个分支拉入该分支,那么您可以切换到功能并定期运行git merge master以在主分支中合并。或者你正在将该分支机构拉到或推到其他机构或像github这样的中央回购机构

    如果出现以下情况,请使用git rebase:


    如果您有一个功能分支,您没有向其他分支推送或拉送,并且您没有定期将另一个分支合并到其中,如上所述

    现在我更困惑了。我从来没有听说过这件事。我读了手册页,它有点道理,但我不知道如何使用它。因此,重定基址不仅用于挤压提交,而且还设置为向前移动初始原点分支?我很困惑。我在这里应该采用的实际流程是什么?特别是对于长时间运行的分支,您不需要重新访问。只需在执行过程中对master重新设置基址,这样冲突的主题分支提交就可以修复。我应该使用哪个重新设置基址命令?在过去,我尝试过git rebase master,它会在master上重放我的所有提交以及一百万个合并冲突。这需要很长时间,最后,我永远也不确定我是否正确合并了。git-Reere是一个工具,它可以帮助您管理重复合并,同时保留主题分支应该干净的“理论”。在您当前的情况下,您有一个分支,其中有许多来自main的合并,最干净的做法是
    git checkout master
    ,然后
    git merge——挤压您的分支名称,这将合并回master,但丢弃合并历史记录。将来,您可以练习合并并使用git Reere来提供帮助,也可以在master上频繁地重新设置主题分支的基础。如果有人能够提供,我将对这里的实际命令感兴趣。给定一个名为Master的主分支和一个名为feature的要素分支,一个切换到要素分支并键入git-rebase-Master,然后切换到主分支并键入git-merge-fea