为什么git会与来自同一分支的我自己的提交产生冲突?

为什么git会与来自同一分支的我自己的提交产生冲突?,git,Git,从源位置拉取主文件后,将其与具有本地提交的当前分支合并,似乎总是会与只有我在同一分支中编辑过的文件产生冲突。我通常希望这些问题能够自动解决 下面是我的工作流程(我在控制台中运行命令): 假设有一个名为“branch_a”的分支,在该分支中,先前已经进行了提交并合并到master中,现在它与master同步 (在分支中进行更改后)git add.然后git commit-m“进行了更改” (现在已经过了一段时间,master在前面)git checkout master git pull git

从源位置拉取主文件后,将其与具有本地提交的当前分支合并,似乎总是会与只有我在同一分支中编辑过的文件产生冲突。我通常希望这些问题能够自动解决

下面是我的工作流程(我在控制台中运行命令):

假设有一个名为“branch_a”的分支,在该分支中,先前已经进行了提交并合并到master中,现在它与master同步

  • (在分支中进行更改后)git add.然后git commit-m“进行了更改”
  • (现在已经过了一段时间,master在前面)git checkout master
  • git pull
  • git签出分支机构a
  • git合并主机。(这里我得到了我在分支_a中所做的最新更改与以前的更改的合并冲突,这些更改已经合并到master中)

我的工作流程是否存在明显的问题?而且,考虑到对文件所做的唯一更改是在同一个分支上提交的,但在不同的时间点提交的,那么git是否会自动解决这些冲突呢?

请在评论中给出答案(谢谢@philip wrage):合并冲突发生在尝试合并两个分支时,这两个分支的提交涉及相同的行,或者进行一些互不排斥的更改。我在这里使用的词语非常模糊,因此最好仔细阅读以下主题:

如果您对自动解决这些冲突特别感兴趣,以便本地更改始终优先,这可能会很有用

我完全认为它将自动接受前面的任何更改,因为它正在将其与该分支上已经存在的较早的提交进行比较

这是一个完全合理的假设,基于
git log
向您展示的内容。不幸的是,
git log
由于遗漏而对您撒谎。默认情况下,
git log
将提交显示为按时间顺序排列的直线

commit b8502a5b1efcb971f90d605517d3f93d0a0951de
Author: Michael G. Schwern <schwern@pobox.com>
Date:   Sat Nov 14 12:00:00 2020 -0800

    Add more foo

commit 20969b1e307efd6152ef43165ae0d11aceb2a2b5
Author: Michael G. Schwern <schwern@pobox.com>
Date:   Fri Nov 13 12:00:00 2020 -0800

    Fix foo

commit 83693247615e3f528d07f33d955c9a3fbdee2791
Author: Michael G. Schwern <schwern@pobox.com>
Date:   Thu Nov 12 12:00:00 2020 -0800

    Add more foo

commit 8b4a4381ebe79091ccdcf2ed1214a55c94189cbf
Author: Michael G. Schwern <schwern@pobox.com>
Date:   Wed Nov 11 12:00:00 2020 -0800

    Change foo

commit ad5f84597211909ff1f1adc3754271817556f7f7
Author: Michael G. Schwern <schwern@pobox.com>
Date:   Tue Nov 10 12:00:00 2020 -0800

    Add foo
现在我们可以看到在不同的分支中发生的变化。虽然b8502a发生在20969年之后,但它们在空间上平行发生分支实际上是分支,这是理解Git的基础。不幸的是,Git隐藏了这一点

Git假设分支机构的工作不协调。这使得许多人可以独立地处理同一代码,或者一个人同时处理许多事情,而不必跟踪谁在更改什么。这将由Git在合并时解决

正因为如此,Git无法在一个分支中更改偏好。虽然Git可以假设b8502a是用836932的知识编写的,但它们在同一个分支上,它不能假设b8502a是用20969b或8b4a43的知识编写的;尽管b8502a比20969b和8b4a43更新,但它们位于不同的分支上


即使作者是相同的,Git也不认为它可以在不同的分支上优先选择更新的更改。如果这样做,则假定作者在工作时将所有分支中的所有更改都记在心里,这就破坏了分支的意义。

使用此工作流时,您观察到了哪些特定的合并冲突?我将使用
git-rebase
而不是
git-merge
。如果在同一个文件中更改了某些内容,则可能会发生冲突。@PhilipRage这些内容与文件内容冲突。假设我编辑了一个文件的第5行,提交了它,并提出了一个拉取请求,然后远程与master合并。在同一个分支中,我用不同的内容再次编辑第5行,提交它,签出到master,从master中提取更改(其中有我的第一个第5行更改),切换到工作分支,然后合并master。在最后一次合并之后,它会要求我手动解决第5行中的冲突。这有帮助吗?是的,我相信你已经用这个例子回答了你自己的问题。正如@flaxel所提到的,如果您修改同一个文件,您可能会遇到冲突,即使您是团队中唯一修改该文件的人。它在GitHub上吗?我们可以检查一下你回购的历史记录吗?如果周围的线、上下文发生变化,你也可能会遇到冲突。如果一个分支更改第5行,而另一个分支更改第6行,则可能会导致冲突。Git有几种不同的合并策略,并会猜测哪一种是最好的。最终,Git不理解代码。冲突是Git说“我需要一个人来告诉我该选哪一个”的方式。谢谢你精心的回答!这个命令确实很有帮助。但是,如果我理解正确,如果我的解释不够清楚,我表示歉意,我认为您的回答假设对文件的更改在多个分支中提交。您是否还指出,即使仅在一个分支中提交文件中的更改,我也会遇到冲突?因为我的问题是当我将master合并到一个分支时,冲突发生在该分支中提交的更改之间,git在给出您的解释后应该知道这些更改。@dsosa不,您不会在同一个分支中的提交之间发生冲突。这应该是不可能的。检查你没有误解什么。冲突标记将指示这两个更改的来源。如果您可以向我们展示冲突标记,以及相关的
git日志--oneline--graph--decoration
覆盖这些提交,我们就可以拼凑出发生的事情。昨天,我在一个文件中更改了一行,在分支“trunk”中提交了它,将它推到源代码“trunk”,在ADO中创建了一个PR,得到了批准并合并到了源代码master中。今天,为了测试它,我在本地切换到master,运行
git pull
(只有我的更改),切换到“trunk”,更改同一行和文件的内容,将其提交到“trunk”,运行
git merge master
,并获得“自动合并”
* commit b8502a5b1efcb971f90d605517d3f93d0a0951de (HEAD -> master)
| Author: Michael G. Schwern <schwern@pobox.com>
| Date:   Sat Nov 14 12:00:00 2020 -0800
| 
|     Add more foo
|   
| * commit 20969b1e307efd6152ef43165ae0d11aceb2a2b5 (feature)
| | Author: Michael G. Schwern <schwern@pobox.com>
| | Date:   Fri Nov 13 12:00:00 2020 -0800
| | 
| |     Fix foo
| | 
* | commit 83693247615e3f528d07f33d955c9a3fbdee2791
| | Author: Michael G. Schwern <schwern@pobox.com>
| | Date:   Thu Nov 12 12:00:00 2020 -0800
| | 
| |     Add more foo
| | 
| * commit 8b4a4381ebe79091ccdcf2ed1214a55c94189cbf
|/  Author: Michael G. Schwern <schwern@pobox.com>
|   Date:   Wed Nov 11 12:00:00 2020 -0800
|   
|       Change foo
| 
* commit ad5f84597211909ff1f1adc3754271817556f7f7
  Author: Michael G. Schwern <schwern@pobox.com>
  Date:   Tue Nov 10 12:00:00 2020 -0800
  
      Add foo