マージ後のコミット時のGitエラー-致命的:マージ中に部分的なコミットを実行できません


280

私はgit pull紛争で終わったを実行しました。私は衝突を解決し、すべてが順調です(私はmergetoolも使用しました)。

解決したファイルをコミットするとgit commit file.php -m "message"、エラーが発生します。

fatal: cannot do a partial commit during a merge.

以前に同じ問題があり-a、コミットでの使用は完全に機能しました。すべての変更をコミットしたくないので、これは完璧な方法ではないと思います。個別のコメントで個別にファイルをコミットしたい。どうやってやるの?gitを使用すると、マージ後にユーザーがファイルを個別にコミットできないのはなぜですか?私はこの問題に対する満足のいく答えを見つけることができませんでした。


5
そして、ご存知のように、git perform "full commit"を検索しても、ほとんど何も役に立ちません。Gitのmanページからの関連文書は1つもありません。これはとても悲惨なツールです。
jww

6
@Torek-Gitによって作成された別の混乱について話します...競合が回避されるように別のブランチから競合するファイルをチェックアウトし、このブランチに追加してコミットするのが難しいのはなぜですか?そして、WTFは部分的なコミットですか?ドキュメントが見つかりません...ユーザーは以下の推測を試さなければなりません...
jww

どうやってやったの?私は対立していて何もできない
Niklas R.

回答:


441

commitコマンドに「-i」を追加すると、この問題が解決することがわかりました。-iは基本的に、コミットする前に追加のファイルをステージングするように指示します。あれは:

git commit -i myfile.php

18
どういうStage additional files意味ですか?
jcalfee314 2014年

9
gitでの@ jcalfee314ステージングは​​、コミット用にファイルを準備することです。この特定のケースでは、コミットする前にコマンドラインを介してファイルをステージングします。-iフラグは、主にマージを完了するときに使用されます。コミットフラグの詳細については、こちらをご覧ください
MikaelHalen 2014年

4
@ jcalfee314私がチェックマニュアルを参照して、それが言う「のうちコミット行う前にも、これまで、舞台のパスの内容は、コマンドラインで指定した内容を上演した。あなたは競合のマージを締結されていない限り、これはあなたが望むものは通常ではありません」。私の推測では、この状況では、ステージングエリアにで解決できない何らかの矛盾がgit addあり、git commit失敗します。追加-iすると、gitに追加とコミットを同時に行うように指示します。理由はまだわかりませんが、理にかなっているようです。
JonSlowCN 2015

5
私のような初心者の場合、引用符なしのスペースを含むメッセージを試行すると、この同じエラーが発生します。例えば。[git commit -m one two three]正解:[git commit -m "one two three"]
Skychan

2
@Skychanのコメントは私にとってチケットでした。
tehbeardedone

106
git commit -am 'Conflicts resolved'

これでうまくいきました。これも試すことができます。


1
すごい、私はこれを知りませんでした!
JeanValjean

11
これにより、変更されたすべてのファイルがコミットに追加されます。ステージングさていないファイルで、望ましくない場合があります。ユーザーは「a」フラグを
省略

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
動作しました

14

-mgitマージの競合を解決するときにgit commitでを忘れたときに、これが発生しました。

git commit "commit message"

する必要があります

git commit -m "commit message"

2
ああああ!また忘れた!
user2705463 2016年

9

エラーメッセージが示すように、マージ後に部分的なコミットを行うことはできません。file.phpコミットする代わりに、すべての変更をコミットする必要があります。

これは動作するはずです。

git commit -m "Fixing merge" 

おかげで助けになりました
Narendra Pandey 2017

そのままの状態で働いた
Shashank Bodkhe

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を指すポインターを、指定したcommit(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
おかげで、残念ながらこれは私にはうまくいきませんでした。厄介なことに、マージをコミットする前に、ビュープライベートとマージをコミットする必要がありました。
コクシー、2015

3

Xcodeのソース管理のみを使用して、これを完全に異なるアプローチで解決しました。

背景:別のチームが(Beanstalk経由で)リモートGitリポジトリに変更をプッシュしました。私の側では、.xcodeprojファイルは別のディレクトリにあり、変更は反映されませんでした。後でコミットしようとすると、Xcodeでツリーの競合エラーが発生しました。

ツリーの競合のスクリーンショット

Xcodeを使用して修正するのはほとんど不可能なので、.xcodeprojファイルをGitサーバーからダウンロードしたバージョンに置き換えました。その結果、Xcodeプロジェクトは解消されたように見えましたが、破損したプルからのすべての更新が変更として表示され、コミットのためにステージングされていました。

これらすべてのModと追加ファイルを確認してください

しかし、コミットしようとすると、「致命的:マージ中に部分的なコミットを実行できない」という同じエラーが表示されます。

これが私が問題を解決した方法です...(今、私は新人プログラマーであることを理解しているので、理解が足りない可能性があります...しかし、私の無知が私にこれを行う別の方法を見つけるようにしました。)最初に、マスターを複製しましたセカンダリブランチにブランチし、そのブランチに切り替えます。次に、作業コピーを作成し、そのディレクトリを元のプロジェクトディレクトリの外のその作業コピーに配置しました。(これが必要かどうかはわかりませんが、他のトラブルシューティングテクニックを読んでいるときに行いました。)次に、ブランチをマスターに切り替え、ステージングファイル(コミットへの変更)がすべてなくなっていることに気付きました。すべてのファイルが相手によって行われた最新の変更に更新されたことを確認するために、ThirdBranchという新しいブランチを作成し、すべてのファイルを複製しました。それをGitサーバーにプッシュし、Beanstalkにマスターブランチのサーバーバージョンを、先ほどプッシュした(行ごとに)ThirdBrachブランチと比較させ、相手によるすべての変更がXcodeに存在するようにしました。これは、私のマスターリポジトリとGitマスターリポジトリが同じであることを意味し、Xcodeのみを使用して問題を解決したことを確認しました。

私が今説明したことを超えて、どうやって私に尋ねないでください...そして、私が残したギャップを確かに埋めます。私はこれに新しいので、すべてを理解していません。おそらく、経験豊富なプログラマーが無関係な情報を関連性のある情報から分離し、この手法をより明確に再現できるため、これが私がこれを投稿している理由の1つです。

これは、重複した質問に対する重複した回答です:失敗したXcode Git Mergeがスタックしています


2
重複した回答を投稿しないでください。根本的な問題は同じかもしれませんが、あなたの答えはより具体的な問題に対するものであり、この一般的な質問に対する答えを曇らせます。この場合、元の回答にリンクする質問へのコメントの方が適切だと思います。
Fookatchu

2

マージ中、Gitはさまざまな理由で親ブランチを追跡したいと考えています。あなたがしたいことはgitがそれを見るのでマージではありません。おそらく、手動でリベースまたはチェリーピックを行います。


1
以前はリベースやチェリーピックを使用したことがなく、今はマニュアルを読んだだけなので、競合をマージした後、「git rebase master」は何を提案しますか?
pMan 2011

1
これは並列ワークフローです。stackoverflow.com/questions/804115/git-rebase-vs-git-mergeを参照してください。 基本的に、「マージ」を個別のコミットにしたい場合は、代わりにソースブランチをターゲットブランチの最後にリベースします。
トールジョー

1
個々のファイルをgitで追加し、-aなしでコミットします。
Peter DeWeese

4
実際に質問に答えるのではなく、単に検索するためにさらに多くを与えるだけです。ここで、「チェリーピッキングとは」と「リベースとは」を知る必要があります。
ftrotter

2
なぜこの回答は反対票が投じられたのでしょうか。知らないことを誰かに言われたとき、私はいつも子供の好奇心を持っていました。上記でコメントしたように、今ではチェリーピックとリベースについて知っています。それは進歩的/役に立ちませんでしたか?
pMan 2013年

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

ソースツリーにある場合、競合が解決された後、ファイルを解決済みとして明示的にマークする必要があります。競合が解決されたばかりのファイル選択します。次に、アクション->競合の解決->解決済みとマークします。複数のファイルがある場合は、すべてに対して同じことを行います。今すぐコミットします。


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

そしてあなたのコミットは問題なく行われます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.