在Git合并冲突之后,我没有触及的很多文件都会变为提交

gra*_*tur 29 git merge

所以我在一个分支机构工作,进行一些更改,然后运行git merge master.我得到我修改过的文件(我知道如何处理)的一个合并冲突,但由于某些原因,一堆文件我根本碰(但在主得到更新)突然进入我的"更改列表承诺".

为什么是这样?我该如何解决这个问题?我不希望任何这些不通过我的更改得到承诺.

Chr*_*rry 8

发生这种情况的原因是因为您很可能做了与您打算做的相反的事情。

假设您的工作分支名为topic-branch.

而不是这样做:

$ git merge master

你本可以这样做:

$ git checkout master
$ git merge topic-branch
Run Code Online (Sandbox Code Playgroud)

在英语中,您可以合并master到 ,而不是将分支合并到。topic-branchtopic-branchmaster

要理解为什么会达到预期的结果,我们可以检查之前答案中的陈述:

当您尝试合并时,所有可以自动合并的文件 (例如,您在本地分支中没有任何更改,但已在源分支上进行了修改)将自动合并并暂存。

你遇到的问题只是merge试图完成它的工作。这些文件在您的主题分支中不会更改,但它们位于您要合并到其中的分支上。如果您以与合并到相反的方向来看待这个问题,那么问题topic-branch就会master消失,因为它只考虑您已修改的文件。

从概念上讲,合并正在执行以下操作(更多信息请参见此处):

令当前头称为current,要合并的头称为merge。

  1. 确定 current 和 merge 的共同祖先。称之为祖先提交。
  2. 处理简单的情况。如果祖先提交等于合并,则不执行任何操作。如果祖先提交等于当前,则进行快进合并
  3. 否则,确定祖先提交和合并之间的更改。
  4. 尝试将这些更改合并到 current 中的文件中。
  5. 如果没有冲突,则创建一个新提交,其中包含两个父项:当前提交和合并提交。将当前(和 HEAD)设置为指向此新提交,并相应地更新项目的工作文件。
  6. 如果存在冲突,请插入适当的冲突标记并通知用户。没有创建提交。

  • 这个答案似乎偏离主题,因为需要合并多个主题分支,但最近进行了更改以掌握。因此,在继续之前,必须将 master 合并到自己的主题分支中。 (13认同)
  • Q 特别指出他们在分支内使用了命令“git merge master”。对用户错误做出假设并不是答案。对用户错误做出与 Q 直接矛盾的假设是粗鲁且无益的。 (2认同)

Iva*_*Lim 8

我自己也遇到了同样的问题,并想出了一个中间解决方案。需要在路上找到一个更好的。

首先解决@NoufalIbrahim 提出的问题:至于“我不希望提交任何这些非我的更改。”,如果您不想进行任何更改,为什么要进行合并?

你误解了@grautur 的意图。需要更改,但不是作为新提交的一部分。例如,本地添加了 1 个文件,来自合并的 100 个文件。新提交应该有 1 个更改的文件,而不是 101 个更改的文件。如果无法进行自动合并,但发起了拉取请求并且必须有人审查提交,则这一点尤其重要。您希望审阅者审阅 1 个文件,而不是 101 个文件。

我目前正在做的是:假设我们有分支“master”和“feature”。“功能”是从“主”创建的,我只对“功能”中的文件进行更改。当新更改被拉入“master”时,git merge master“feature”内部将引入新文件(这些文件会在 VSCode 中自动暂存,这是我使用的 IDE)。

我接下来要做的是取消暂存所有这些文件。基本上无视他们。只添加和提交我更改的文件。将“功能”推送到源/远程存储库,创建拉取请求。当请求被接受并将提交合并到主分支时,在本地和远程删除“功能”。将更改拉到“master”本地并创建一个新分支以处理新功能。这个新分支不会有一堆未暂存的文件。

可以有一个 git 命令告诉 git 在不使用 .gitignore 的情况下忽略一堆文件。对此进行进一步研究。


小智 6

我认为这种 GIT 做事方式的问题在于,在提交之后,将执行“推送”。“推送”将包括所有提交的文件——包括“推送者”没有触及的文件。这使得跟踪更改非常复杂。


Nou*_*him -1

当您尝试合并时,所有可以自动合并的文件(例如,您在本地分支中没有任何更改,但已在源分支上进行了修改)将自动合并和暂存。无法自动合并的文件会在您的工作区域中使用冲突标记进行更新,您必须修复它们。

Git 总是在提交新提交之前在暂存区中组装这些提交。合并做同样的事情。在暂存区域中创建包含源分支的所有更改的新提交。如果发生冲突,更新暂存区域的过程将被中断,控制权将交给您。这就是为什么会发生这种情况。提交后,将在存储库中创建“合并提交”,该存储库将源分支和目标分支作为父分支。

至于“我不希望提交任何这些非我所做的更改。”,如果您不想进行任何更改,为什么要进行合并呢?

  • “你们为什么要合并?” 问题不是OP问题的答案。 (26认同)
  • 当您进行合并(从其他人推送到的公共分支)时,您自己未进行的更改会进入您的分支。这就是您对合并的期望。如果你不想要任何“不是我做的改变”,那么你就不应该合并。无论如何,这对我来说似乎是合乎逻辑的。 (6认同)
  • Noufal-由于 OP 没有触及任何这些文件,难道 git 不应该意识到这些文件已经在此工作流程之外合并并利用最新的提交吗? (3认同)
  • “...所有可以自动合并的文件...都会自动合并并暂存。” 这有什么意义呢?如果我没有对文件进行任何本地更改,那么提交这些更改只会让我感到困惑(这似乎是 git 的主要目的)。 (2认同)