在git中,在将新代码添加到主代码后,是否可以从主代码合并到最初从主代码创建的分支?

在git中,在将新代码添加到主代码后,是否可以从主代码合并到最初从主代码创建的分支?,git,merge,branch,branching-and-merging,Git,Merge,Branch,Branching And Merging,我不确定这是否是一个正常的分支场景,但是 假设我从master创建了一个分支,比如说分支C,然后将其他先前存在的分支,比如分支a和B,合并回master,我需要分支C中a和B的一些代码,那么我可以从master合并到分支C吗 如果是这样的话,有什么理由认为这不是一个好主意?这是git中常见的操作吗?肯定是正常情况。这就是你想要做的: $ git checkout your-branch $ git rebase master 为了更好地理解重定基址,这里有一个例子。假设这是您的提交历史记录:

我不确定这是否是一个正常的分支场景,但是

假设我从master创建了一个分支,比如说分支C,然后将其他先前存在的分支,比如分支a和B,合并回master,我需要分支C中a和B的一些代码,那么我可以从master合并到分支C吗


如果是这样的话,有什么理由认为这不是一个好主意?这是git中常见的操作吗?

肯定是正常情况。这就是你想要做的:

$ git checkout your-branch
$ git rebase master
为了更好地理解重定基址,这里有一个例子。假设这是您的提交历史记录:

        H--I--J [branch C]
       /
A--B--C--D--E--F--G [master]
如您所见,自创建分支以来,master已经有多个新提交

如果您将您的分支重新设置为针对master的分支,则该历史将如下所示:

                    H'--I'--J' [branch C]
                   /
A--B--C--D--E--F--G [master]
现在分支C是最新的,并且合并了自最初创建分支以来的所有更改

资源:


这是一个非常正常的操作

git checkout C
git merge master
通常的方法是这样做的(如果您已经在这个分支上,您可以先进行ommit)

Alex提到的
rebase
命令是另一种选择,但它还有其他结果。(实际上,您的分支得到了一个更线性的历史记录,但是在重新基础之前(以及在原始分支之后)C上的所有旧提交现在都有了其他名称(提交ID),因为它们的祖先中有a和B中的提交。)

是和是

您可以在git中以任何方式合并。合并只是指“合并这些历史”。当git做不到时,它的默认模式是将更改转储到您身上,这是一种“合并冲突”,但您也可以改变这种行为,使其倾向于“我们的”或“他们的”。查看文档,了解数百个选项的完整解释

因此,根据您的解释,历史图表可能如下所示:

*-------*-------*------* master
        |
        *----*-----* A
        |
        *-------* B
        |
        *----* C
其中,
*
只是该分支上的一些提交,除了它们都已创建的点。那么如何解决这个问题呢?好吧,我会:

git checkout A
在A上,基本上我们要将A合并到master中,如下所示:

git merge master
这样做有一个很好的理由——当提交给另一个开发人员时,假设合并是准确的,这代表了一个简单的快速合并。换言之,要将A合并到其他人存储库中的实际主机中,这将变得更容易。现在,您或其他开发人员可以执行的下一步:

git checkout master && git merge A
它应该基本上没有合并冲突,因为将主服务器合并到主服务器的过程解决了冲突,负责集成主服务器的开发人员处理了冲突

那么

git checkout B && git merge master
再次解决合并问题,然后
git checkout master&&git merge B

最后,您是说我可以将
master
合并到C中吗?绝对地我们刚刚做了两次这个过程

我们在工作中使用这种特殊的做事方式。基本上,我让其他开发人员在他们的分支准备就绪时通知我,然后我将它们合并,然后每个人将master合并到他们的分支中,然后这个过程重复。您甚至可以通过远程存储库实现这一点。如果您在远程系统中有跟踪分支,
git pull
将您的更改拉入。这实际上是一个
git fetch
,后跟一个
git merge
,因此如果您没有跟踪其他人的分支,您仍然可以像这样应用合并:

他们可以执行
git合并leaddeveloper/master
,其中
leaddeveloper
是一个远程名称。然后他们可以纠正任何冲突,向首席开发人员发送一封电子邮件,说“请退出”,首席开发人员可以键入
git fetch&&git merge juniordeveloper1/somebranch
,或者更可能键入
git fetch&&git diff master..juniordeveloper1/somebranch
,以确定他们首先做了什么

简言之,我认为这是管理项目的一种非常好的方式。它使每个人都保持最新状态,并确保处理主控程序的人不需要集成代码


关于git rebase的问题,处理得非常巧妙。

除非分支机构C被其他用户从上游回购中大量共享,否则我仍然支持在s中提到的
rebase
方法。


如果您在
C
中只需要提交一些
A
B
,这将是一个解决方案,但正如我在“”中所提到的(在结尾),cherry pick有一些缺点。

哇,感谢各位的帮助。我真的很感谢你花时间回答我的问题。我会看看这些。我现在学到了很多,我不得不说我真的很喜欢git。