Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何解决git冲突,其中我希望保留更改并拒绝删除最新分支中的文件_Git_Merge Conflict Resolution_Git Merge Conflict - Fatal编程技术网

如何解决git冲突,其中我希望保留更改并拒绝删除最新分支中的文件

如何解决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已经做到了,或者更准确地说,在您的工

冲突(修改/删除):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已经做到了,或者更准确地说,在您的工作树中做到了。那么,您现在需要做的就是告诉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合并的提交

与任何提交一样,新的merge
M
将保存Git知道的每个文件的完整快照。Git知道的文件将是来自三个输入提交的文件。这三个输入提交都包含Git在您或其他人进行这些提交时知道的每个文件的完整快照

我一直提到三项承诺。这里的三个承诺是什么?到目前为止,我们只显示了两个提交作为输入:
J
,我们当前的或
提交自
branch1
,以及
L
,最后一次提交在
branch2
上,现在是
branch2
。第三个承诺是最好的共同祖先

请注意,如果我们从commit
J
开始向后工作,我们将找到commit
I
,然后是commit
H
,然后是commit
G
,依此类推。同时,如果我们从commit
L
开始向后工作,我们将找到commit
K
,然后是commit
H
,然后是commit
G
,依此类推。我们的两条路径在commit
H
处连接在一起,这两个分支来自一个共同的祖先

这就是Git的工作原理。它就像一个大的系谱或家谱:commit
J
将commit
I
作为它的(一个,单个)父代。Commit
I
将Commit
H
作为其父级。Commit
H
将Commit
G
作为其父级。我们从最新的提交开始向后工作,作为当前或
HEAD
commit。大多数提交只有一个父级,但偶尔,我们会遇到类似于
M
的合并提交,其中有两个父级。(我们现在不担心这一点,但当我们在向后工作时遇到合并时,我们通常必须跟随双亲。)

无论如何,看看这个图表,很明显,
G
H
都可以作为一个共享的祖先。在本例中,最好的定义是提交
H
。对于像这样的简单图,最好的一个是显而易见的:它是最新的,
H
G
更新,所以这是最常见的共享提交技术术语是合并基数。

合并的工作原理 要执行合并,
git merge
将:

  • 将合并基本提交中的快照与当前快照或
    HEAD
    commit进行比较,以查看更改的内容;及
  • 将相同的合并基本快照与其提交进行比较,以查看它们更改了什么
由于这三个提交中的每个提交在其快照中都有一组文件,因此这些文件是要进行比较的文件

在您的特定情况下,合并库有一个名为
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