合并后提交时发生Git错误-致命:合并期间无法进行部分提交


280

我跑了git pull一场以冲突告终的比赛。我解决了冲突,现在一切都很好(我也使用了mergetool)。

当我提交已解析的文件时,git commit file.php -m "message"出现错误:

fatal: cannot do a partial commit during a merge.

我之前遇到过同样的问题,并且-a在commit中使用时效果很好。我认为这不是完美的方法,因为我不想提交所有更改。我想用单独的注释分别提交文件。我怎样才能做到这一点?为什么git不允许用户在合并后单独提交文件?对于这个问题,我找不到令人满意的答案。


5
而且,搜索git执行“完全提交”几乎没有任何用处。Git手册页中没有一个相关文档。这真是太惨了。
jww

6
@Torek-谈论由Git创建的另一个混乱...为什么真该死,很难从另一个分支检出冲突的文件,所以避免了冲突,将其添加到该分支,然后提交它???WTF是部分提交吗?我找不到关于它的任何文档...用户被迫尝试下面的猜测...
jww '16

你是怎么做到的?我有冲突,无能为力
Niklas R.

Answers:


441

我发现在提交命令中添加“ -i”可以为我解决此问题。-i基本上告诉它在提交之前暂存其他文件。那是:

git commit -i myfile.php

18
什么Stage additional files意思
jcalfee314 2014年

9
@ jcalfee314在git中暂存是为提交准备文件。在这种特殊情况下,它会在提交之前通过命令行暂存文件。-i标志主要用于结束合并时。您可以在此处阅读有关提交标志的更多信息。
MikaelHalen 2014年

4
@ jcalfee314我检查了文档,并说:“到目前为止,在从暂存的内容中进行提交之前,还要暂存命令行上给定路径的内容。通常,除非您要完成冲突的合并,否则这通常不是您想要的”。我的猜测是,在这种情况下,暂存区域中存在某种无法通过解决的不一致问题git add,这会git commit导致失败。添加-i会告诉git同时添加和提交。我仍然不确定为什么,但这似乎很有意义。
JonSlowCN 2015年

5
对于像我这样的菜鸟,如果您尝试使用包含无引号的空格的消息,也会遇到同样的错误。例如。[git commit -m一二三]正确:[git commit -m一二三]
Skychan

2
@Skychan的评论对我来说是票。
tehbeardedone

106
git commit -am 'Conflicts resolved'

这对我有用。您也可以尝试一下。


1
太神奇了,我不知道!
JeanValjean's

11
这会将所有修改过的文件添加到提交中,即使那些未暂存的文件也可能不受欢迎。用户可能希望放弃'a'标志
Chase Sandmann

4
这正是用户要不要执行的操作,这是为了避免提交所有文件。
迈克尔·

33

您可以git commit -i在大多数情况下使用,但以防万一

你需要做git commit -m "your_merge_message"。在合并冲突期间,您无法合并一个文件,因此您需要

  1. 仅暂存有冲突的文件(git add your_file.txt
  2. git commit -m "your_merge_message"

16

您可能未完成提交的事情就发生了冲突。git不会让您独立提交事务(因为我想这是合并的全部内容),因此您需要先添加git add该文件,然后再添加git commit -m "Merge conflict resolution"。的-i标志git commit会为您添加。


5
不要在1.9.0 -的commit -i工作,但不是git add; git commit
LeeGee

14

-m解决git合并冲突时忘记了git commit时得到了这个。

git commit "commit message"

应该

git commit -m "commit message"

2
啊啊!我又忘了!
user2705463'6


6

您的合并在操作过程中停止。您应该添加文件,然后“ git commit”:

git add file_1.php file_2.php file_3.php git commit

干杯


5

如果您只想抛弃整个挑选过程,并以所需的任何方式提交文件,

git reset --soft <ID-OF-THE-LAST-COMMIT>

带你到那里。

软重置的作用是将指向当前HEAD的指针移动到您提供的提交(ish),但不会更改文件。硬重置将移动指针,并且还将所有文件还原到该commit(ish)中的状态。这意味着通过软重置,您可以清除合并状态,但保留对实际文件的更改,然后根据自己的喜好分别进行提交或重置。


您能再解释一下吗?这可能是我所需要的,但是我不了解它的工作原理……这里的所有答案都只是“添加文件,然后提交!”,但这很明显。我在这里的原因是我不想在提交之前添加这些文件。-_-;
凯尔·贝克

有帮助。谢谢。:)
凯尔·贝克

5
  1. 转到您的项目目录
    1. 显示隐藏文件(将出现.git文件夹)
    2. 打开.git文件夹
    3. 删除MERGE_HEAD
    4. 再次提交
    5. 如果git告诉您git已被锁定,请返回.git文件夹并删除index.lock
    6. 再次承诺这次一切都会正常的。

大!那对我有用。顺便说一下,如果在MacOS上,您可以从终端上调用“ open .git”,女巫将在Finder中显示“ .git”内容
tontonCD

这也对我有用。这应该作为答案。
vandu

3

对我自己来说,这是在SourceTree中发生的,当时我尝试在解决所有文件之前进行合并。然后,我将最后一个文件标记为已解析,但是在尝试提交时仍然给我这个错误。我关闭SourceTree并重新打开它,然后提交就可以了。


1
谢谢,但是不幸的是,这对我没有用。烦人的是,我不得不提交一个视图私有的以及合并的,然后才能让我提交合并。
Coxy

3

我仅使用Xcode的源代码控制,通过完全不同的方法解决了这一问题。

背景:另一个团队(通过Beanstalk)将更改推送到了远程Git存储库。在我的末端,.xcodeproj文件位于不同的目录下,并且更改没有进行。后来,当我尝试提交时,我在Xcode中收到一个Tree Conflict错误。

树冲突截图

由于几乎不可能使用Xcode进行纠正,因此我用.xcodeproj从Git服务器下载的版本替换了该文件。结果... Xcode项目似乎已清除,但是损坏的Pull的所有更新都显示为我所做的更改,并且已暂存以提交。

查看所有这些Mod和添加的文件

但是,在尝试提交时,我收到了同样的“致命错误:无法在合并过程中进行部分提交”的错误,此处将对此进行讨论。

这是我解决问题的方法...(现在,了解我是一名菜鸟程序员,因此我可能会缺乏一些了解...但是我的无知使我找到了另一种解决方法。)首先,我克隆了我的主人分支到辅助分支并切换到该分支。然后,我创建了一个工作副本,并将目录放置到该工作副本的原始项目目录之外。(我不知道这是否有必要,但是当我阅读其他故障排除技术时,我做了什么。)然后,我将分支切换到主节点,在那里我意识到我所有的暂存文件(更改为Commit)都消失了。为了确保所有文件都更新为另一方所做的最新更改,我创建了一个名为ThirdBranch的新分支,该分支复制了所有文件,将其推送到Git服务器,让Beanstalk将我的master分支的服务器版本与我刚刚推送的ThirdBrach分支进行比较(逐行),并且对方的所有更改都出现在我的Xcode上。这意味着我的主存储库和Git主存储库是相同的,这证明我仅使用Xcode解决了问题。

别问我,除了我刚刚描述的内容之外,还有其他方法……当然可以填补我遗漏的空白。我是新来的,我什么都不懂。也许经验丰富的程序员可以将无关信息从相关信息中分离出来,然后更清晰地重新创建此技术,这部分也是我发布此信息的原因。

这是重复问题的重复答案,例如:Xcode Git Merge失败被卡住


2
请不要发布重复的答案。尽管潜在的问题可能是相同的,但您的答案是针对更具体的问题,并且只会笼罩该一般问题的答案。我认为在这种情况下,将问题链接到原始答案就更合适了。
Fookatchu '16

2

在合并期间,Git出于各种原因希望跟踪父分支。您要做的不是git看到的合并。您可能希望手动进行变基或自动选择。


1
我以前从未使用过rebase或Cherry-pick,现在我只看了本手册,那么在合并冲突后您会建议“ git rebase master”起作用吗?
pMan 2011年

1
这是一个并行的工作流程。 基本上,请参见stackoverflow.com/questions/804115/git-rebase-vs-git-merge,如果希望“合并”是单独的提交,则可以将源分支重新定位到目标分支的末尾。
2011年

1
只需git添加每个文件,然后不使用-a即可提交。
彼得·德威斯

4
您实际上并没有回答问题,而只是给出了更多搜索内容。现在我们需要知道“什么是采摘樱桃”和“什么是变基”。
2012年

2
我不知道为什么这个答案被否决了。当有人告诉我我以前不知道的事情时,我总是对孩子充满好奇。就像我在上面评论的那样,现在我知道了有关樱桃采摘和基地调整的信息。那不是进步/有益的吗?
pMan

2

git commit -i -m 'merge message'没有为我工作。它说:

fatal: No paths with --include/--only does not make sense.

FWIW,我通过这个相关问题来到这里,因为我收到了以下消息:

fatal: You have not concluded your merge (MERGE_HEAD exists).

我还尝试了mergetool,它说No files need merging。非常混乱!因此,MERGE_HEAD不在需要合并的文件中?

最后,我使用此技巧仅添加了修改过的文件(不想添加所有文件到我的树中,因为我想保留一些未跟踪的文件):

git ls-files -m | xargs git add

然后,我终于(!)能够提交并向上推。如果git为您提供有关这些情况下的操作的更好提示,那肯定会很好。


1

如果它在Source Tree中,则在解决冲突后,我们应将文件明确标记为已解决。选择刚解决没有冲突的文件。然后操作->解决冲突->标记为已解决。如果您有多个文件,请对所有文件执行相同的操作。立即提交。


1

看完所有评论。这是我的解决方案:
我不得不再次“添加”它,而不是提交:

$ git commit -i -m support.html "doit once for all" [master 18ea92e] support.html

1

如果您使用的是“源代码树”或其他GUI,请确保选中所有文件(合并后)。


0

有时在合并过程中,如果发生冲突并且存在需要手动解决的增量。在这种情况下,请为提到的文件修复手动分辨率。

现在,如果您发出,

git status Lib/MyFile.php

您将看到类似的输出

On branch warehouse
Your branch and 'origin/warehouse' have diverged,
and have 1 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

All conflicts fixed but you are still merging.
  (use "git commit" to conclude merge)

Changes to be committed:

    modified:   Lib/MyFile.php

由于您已经进行了提交,因此只需发出

git commit

您的提交将毫无问题地完成。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.