如何解决git冲突,其中我希望保留更改并拒绝删除最新分支中的文件
冲突(修改/删除):src/a.js在aa1e4d中删除,在HEAD中修改。src/a.js的版本头留在树中。 我想保留头部的内容,并拒绝删除aa1e4d中的内容 [吉特说]如何解决git冲突,其中我希望保留更改并拒绝删除最新分支中的文件,git,merge-conflict-resolution,git-merge-conflict,Git,Merge Conflict Resolution,Git Merge Conflict,冲突(修改/删除):src/a.js在aa1e4d中删除,在HEAD中修改。src/a.js的版本头留在树中。 我想保留头部的内容,并拒绝删除aa1e4d中的内容 [吉特说] CONFLICT (modify/delete): src/a.js deleted in aa1e4d and modified in HEAD. Version HEAD of src/a.js left in tree. 我想保留头部的内容,并拒绝删除aa1e4d中的内容 Git已经做到了,或者更准确地说,在您的工
CONFLICT (modify/delete): src/a.js deleted in aa1e4d and modified
in HEAD. Version HEAD of src/a.js left in tree.
我想保留头部的内容,并拒绝删除aa1e4d中的内容
Git已经做到了,或者更准确地说,在您的工作树中做到了。那么,您现在需要做的就是告诉Git这实际上是正确的分辨率:
git add src/a.js
一旦您告诉Git所有必要的解决方案,您就可以完成正在执行的任何操作(Git merge
,Git rebase
,或者任何可能的操作,所有这些都将调用Git的合并机制)。在Git的现代版本中,运行Git merge--continue
,Git rebase--continue
,或者您正在使用执行的任何操作--continue
,告诉Git继续执行挂起的操作
了解正在发生的事情
重要的是,你要了解你在这里做什么:你将需要这类信息用于未来的合并、重新调整等等
在Git中,我喜欢称之为merge的merge操作是各种Git命令中的任意一种,这些命令接受一组输入文件的三个版本,并使用这三个版本生成每个文件的单个版本。这种合并的一个常见来源,也是一个容易理解的来源,至少是git merge
命令本身,通常由git pull
运行
Merge有三个输入
这三个输入是什么?好吧,记住Git实际上就是关于提交的。这与分支无关,尽管分支名称可以帮助您查找提交。它甚至与文件无关,尽管提交包含文件。Git是关于提交的。因此,这三个输入是三个特定的提交
当我们使用git merge
时,我们自己选择其中两个提交。让我们画一对分支,每个分支都有一些对该特定分支私有的提交和一些公共的提交(在两个分支之间共享)。我们将旧的提交放在左边,新的提交放在右边,而不是实际的提交哈希ID(如aa1e4d
),我们只使用一个大写字母来代表每个提交:
I--J <-- branch1 (HEAD)
/
...--G--H
\
K--L <-- branch2
这个新的合并提交M
仅在分支branch1
上,但作为其父级(而不是通常的单亲),它有三个输入提交中的两个,即J
——我们启动时使用的提交和L
,我们告诉Git合并的提交
与任何提交一样,新的mergeM
将保存Git知道的每个文件的完整快照。Git知道的文件将是来自三个输入提交的文件。这三个输入提交都包含Git在您或其他人进行这些提交时知道的每个文件的完整快照
我一直提到三项承诺。这里的三个承诺是什么?到目前为止,我们只显示了两个提交作为输入:J
,我们当前的或头
提交自branch1
,以及L
,最后一次提交在branch2
上,现在是branch2
。第三个承诺是最好的共同祖先
请注意,如果我们从commitJ
开始向后工作,我们将找到commitI
,然后是commitH
,然后是commitG
,依此类推。同时,如果我们从commitL
开始向后工作,我们将找到commitK
,然后是commitH
,然后是commitG
,依此类推。我们的两条路径在commitH
处连接在一起,这两个分支来自一个共同的祖先
这就是Git的工作原理。它就像一个大的系谱或家谱:commitJ
将commitI
作为它的(一个,单个)父代。CommitI
将CommitH
作为其父级。CommitH
将CommitG
作为其父级。我们从最新的提交开始向后工作,作为当前或HEAD
commit。大多数提交只有一个父级,但偶尔,我们会遇到类似于M
的合并提交,其中有两个父级。(我们现在不担心这一点,但当我们在向后工作时遇到合并时,我们通常必须跟随双亲。)
无论如何,看看这个图表,很明显,G
和H
都可以作为一个共享的祖先。在本例中,最好的定义是提交H
。对于像这样的简单图,最好的一个是显而易见的:它是最新的,H
比G
更新,所以这是最常见的共享提交技术术语是合并基数。
合并的工作原理
要执行合并,git merge
将:
- 将合并基本提交中的快照与当前快照或
commit进行比较,以查看更改的内容;及HEAD
- 将相同的合并基本快照与其提交进行比较,以查看它们更改了什么
src/a.js
的文件。1您自己的提交也有一个src/a.js
文件,并且您已更改该文件,使其与src/a.js
的合并库副本不匹配:
头部修饰
不过,在提交过程中,他们所做的是完全忽略了src/a.js
。因此,当将合并基src/a.js
与其提交进行比较时,他们删除了文件:
。。。已在aa1e4d中删除,并且
git merge
的任务是将它们的更改与您的更改相结合。如果您更改了文件的第42行
I--J
/ \
...--G--H M <-- branch1 (HEAD)
\ /
K--L <-- branch2
Version HEAD of src/a.js left in tree.
CONFLICT (modify/delete): src/a.js deleted in aa1e4d and modified
in HEAD. Version HEAD of src/a.js left in tree.
git add src/a.js