所以我在一个分支机构工作,进行一些更改,然后运行git merge master.我得到我修改过的文件(我知道如何处理)的一个合并冲突,但由于某些原因,一堆文件我根本不碰(但在主得到更新)突然进入我的"更改列表承诺".
为什么是这样?我该如何解决这个问题?我不希望任何这些不通过我的更改得到承诺.
发生这种情况的原因是因为您很可能做了与您打算做的相反的事情。
假设您的工作分支名为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。
- 确定 current 和 merge 的共同祖先。称之为祖先提交。
- 处理简单的情况。如果祖先提交等于合并,则不执行任何操作。如果祖先提交等于当前,则进行快进合并。
- 否则,确定祖先提交和合并之间的更改。
- 尝试将这些更改合并到 current 中的文件中。
- 如果没有冲突,则创建一个新提交,其中包含两个父项:当前提交和合并提交。将当前(和 HEAD)设置为指向此新提交,并相应地更新项目的工作文件。
- 如果存在冲突,请插入适当的冲突标记并通知用户。没有创建提交。
我自己也遇到了同样的问题,并想出了一个中间解决方案。需要在路上找到一个更好的。
首先解决@NoufalIbrahim 提出的问题:至于“我不希望提交任何这些非我的更改。”,如果您不想进行任何更改,为什么要进行合并?
你误解了@grautur 的意图。需要更改,但不是作为新提交的一部分。例如,本地添加了 1 个文件,来自合并的 100 个文件。新提交应该有 1 个更改的文件,而不是 101 个更改的文件。如果无法进行自动合并,但发起了拉取请求并且必须有人审查提交,则这一点尤其重要。您希望审阅者审阅 1 个文件,而不是 101 个文件。
我目前正在做的是:假设我们有分支“master”和“feature”。“功能”是从“主”创建的,我只对“功能”中的文件进行更改。当新更改被拉入“master”时,git merge master“feature”内部将引入新文件(这些文件会在 VSCode 中自动暂存,这是我使用的 IDE)。
我接下来要做的是取消暂存所有这些文件。基本上无视他们。只添加和提交我更改的文件。将“功能”推送到源/远程存储库,创建拉取请求。当请求被接受并将提交合并到主分支时,在本地和远程删除“功能”。将更改拉到“master”本地并创建一个新分支以处理新功能。这个新分支不会有一堆未暂存的文件。
可以有一个 git 命令告诉 git 在不使用 .gitignore 的情况下忽略一堆文件。对此进行进一步研究。
Nou*_*him -1
当您尝试合并时,所有可以自动合并的文件(例如,您在本地分支中没有任何更改,但已在源分支上进行了修改)将自动合并和暂存。无法自动合并的文件会在您的工作区域中使用冲突标记进行更新,您必须修复它们。
Git 总是在提交新提交之前在暂存区中组装这些提交。合并做同样的事情。在暂存区域中创建包含源分支的所有更改的新提交。如果发生冲突,更新暂存区域的过程将被中断,控制权将交给您。这就是为什么会发生这种情况。提交后,将在存储库中创建“合并提交”,该存储库将源分支和目标分支作为父分支。
至于“我不希望提交任何这些非我所做的更改。”,如果您不想进行任何更改,为什么要进行合并呢?