マージの競合を解決した後、どうやってマージを終了しますか?


282

Git Community Book の基本的なブランチとマージのセクションを読みました。

したがって、私はそれに従って、1つのブランチを作成しますexperimental

その後私は:

  1. 試験的なブランチに切り替えます(git checkout試験的)
  2. たくさんの変更を加える
  3. コミット(git commit -a)
  4. マスターブランチに切り替える(git checkout master)
  5. 変更を加えてコミットします
  6. 実験に切り替えます(git checkout experimental)
  7. マージマスターを試験運用版に変更(git merge master)
  8. いくつかの競合がありますが、解決した後、「git add myfile」を実行しました

  9. そして今、私は立ち往生しています、私はマスターに戻ることができません

私がする時

 $ git checkout master
error: Entry 'res/layout/my_item.xml' would be overwritten by merge. Cannot merge.

そして私はしました:

$ git rebase --abort

進行中のリベースはありませんか?

そして私はしました:

$  git add res/layout/socialhub_list_item.xml
$ git checkout master
error: Entry 'res/layout/my_item.xml' would be overwritten by merge. Cannot merge.

masterブランチに戻るにはどうすればよいですか?


競合を修正し、追加を実行してから、でコミットを実行しようとするとgit commit gf2n.cpp -m "Hand merge gf2n.cpp due to conflicts"、結果はになりfatal: cannot do a partial commit during a merge.ます。そしてもちろん、「部分的なコミット」はgit manページのどこにも文書化または議論されていないようです。git merge修正後にa を実行するPlease, commit your changes before you can merge.と、What a broken ass tool ...
jww

2
明示的なパスを使用したgit commitについては、「説明」のマンページに「3。commitコマンドの引数としてファイルをリストすることにより、コミットはインデックスでステージングされた変更を無視し、代わりにリストされたファイルの現在の内容を記録します(すでにGitに認識されている必要があります)。 -only 'オプション。マージメッセージが、commitコマンドの動作方法を読んだと想定し、その説明の「部分的」という単語の意味を認識していないと思われる誰かによって書かれたと確信しています。 @jww
jthill

1
では、なぜそのケーススタディは理解のために注意深く読む価値があるのに、マンページでは理解できないのでしょうか?@jww
jthill

1
まあ、gitを使用するには、取得する準備ができている以上に、読解力が必要です。あなたがそうであると確信しているよりも、私はおそらくそれがgitのせいだとさらに確信が持てません。
jthill 2016

1
Git 2.12(2017年第1四半期)では、すぐにを実行するだけですgit merge --continue以下の私の回答を
VonC

回答:


267

マージ中に競合が発生した場合、手動でマージコミットを完了する必要があります。競合するファイルを編集して実行git addし、解決済みとしてマークするという最初の2つのステップを実行したようです。最後に、実際にとのマージをコミットする必要がありgit commitます。その時点で、ブランチを再び切り替えることができます。


「git gui&」を使用してコミットを行うと、ブランチの状態が「マージ」していないことに気付かない場合があります。「gitステータス」をフォローアップすると、ブランチのステータスが正しいことを確認できます。
トニーアシュワース2015

4
git commit -am "your commit message"追加とコミットを同時に実行してみてください。
vaheeds

3
git commit動作します。そして、それを使用して、デフォルトのマージコミットメッセージを入力するのが最善です。メッセージを上書きするので、 `git commit -am 'は避けます
Arijoon

1
お試しくださいgit push
アルパー、

以下のシナリオでこの状況が発生しました-> XブランチとYブランチをマージしました。次に、Yブランチで何か間違ったことをしたので、それを修正してから、Yブランチでの変更を「修正」しました。修正のため、gitは新しいコミットを作成しませんでした。Xブランチと更新されたYブランチをマージすると、競合が発生しました。ところでこの答えをありがとう。
ドガ

157

マージの競合を解決した後、どうやってマージを終了しますか?

Git 2.12(2017年第1四半期)では、より自然なコマンドを使用できます。

git merge --continue

Jeff King()によるcommit c7d227d(2016年12月15日)を参照してください。commit 042e290commit c261a87commit 36​​7ff69 参照してくださいpeff
により(2016年12月14日)のクリス・パッカム(cpackham
(合併によりJunio C浜野- gitster-05f6e1bコミット 2016年12月27日)

2.12リリースノートを参照してください。

merge:「追加--continue」の同義語としてオプション「をgit commit

マージを完了することでマージを「継続」できるオプションを「git merge」に教え--continueます。
競合を解決した後にマージを完了する従来の方法は、「git commit」を使用することです。
現在、「git rebase」や「git cherry-pick」などのコマンドで「--continue」オプションを使用すると、そのようなオプションを「git merge」に追加しても一貫したUIが表示されます。


これが2017年第1四半期の2.12で最近どのように追加されたかについてコメントを投稿する準備をしていましたが、それからあなたの回答の最初の行を読み直しました。バージョン2.10ではオプションが見つからなかったのも不思議ではありません。
cjsimon 2017年

1
私はgit merge --continueを試しましたが、Git Bashはそれをコマンドとして認識できませんでした。しかし、うまくいったのはgit commit -m "Commit message"
Mimi

2
@ミミOKですが、Git 2.12以降を使用していますか?
VonC

@VonCあなたは正しいです、私は古いバージョンのGitを使用しています!
ミミ

23

マージ/リベース中にスタックする場合はいつでもできます

git reset --hard

作業を最後のコミットの状態に復元します。これにより、作業ツリーからの変更が失われるため、マージ前にローカルで変更を行っていた場合、その後変更されます。そのため、ローカルで変更を行っている場合はマージを開始しないことをお勧めします。:)


15
義務的な警告:git reset --hardコミットされていない変更を破棄します
ジェフリーヘイル

2
git merge --abort何も失うリスクがないだけではないのですか?
アレクサンダージョージ

11

ただ git commitそれ。

オプションgit abortで:
マージの競合に遭遇しました。どうすればマージを中止できますか?

onマージを使用して作業を簡単にするには、kdiff3をインストールして、それをmergetoolとして構成します。手順:http : //doodkin.com/2016/05/29/git-merge-easy-github-this-branch-has-conflicts-that-must-be-resolved-use-the-command-line/

そのページにはこのビデオが含まれています:https : //www.youtube.com/watch?v=Cc4xPp7Iuzo


11

commandを使用して2つのブランチをマージする場合は常にgit merge brancha branchb、2つの可能性があります。

  1. 一方のブランチ(branchaといいます)は、コミット履歴をたどることで、もう一方のブランチ(branchbと言います)から到達できます。

    2.しかし、2つのブランチが古いポイントで分岐した場合、gitは新しいスナップショットを作成し、それを指す新しいコミットを追加します。したがって、マージするブランチ間に競合がない場合、gitは新しいコミットをスムーズに作成します。

git log2つの競合しないブランチをマージした後、実行してコミットを確認します。

ここで、マージするブランチ間にマージの競合がある場合に興味深いケースに戻ります。私はこれをhttps://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Mergingのページから引用しています

Gitは新しいマージコミットを自動的に作成していません。競合を解決する間、プロセスを一時停止しました。マージの競合後、どのファイルがマージされていないかを確認したい場合は、git status


したがって、マージの競合がある場合は、競合を解決してから、ステージング領域に加えた変更を追加して から、競合のためにgitによって一時停止されgit add filenameたコマンドgit commitを使用して変更をコミットする必要があります。クエリ。詳細については、上記のリンクもご覧ください。ご不明な点がございましたら、以下にコメントしてください。サポートさせていただきます。


7

競合を手動で解決した後の次の手順は次のとおりです。

  1. git add。
  2. git status(これにより、自動マージ手順を続行するために必要なコマンドが表示されます)
  3. [コマンドGitは示唆して、例えばgit merge --continuegit cherry-pick --continuegit rebase --continue]

16
gitマージはありません
Hola Soy Edu Feliz Navidad

@HolaSoyEduFelizNavidadこれは不正解です。競合後のZie git出力:error: Failed to merge in the changes. Patch failed at 0001 ADD: _type to styleguide The copy of the patch that failed is found in: .git/rebase-apply/patch When you have resolved this problem, run "git rebase --continue". If you prefer to skip this patch, run "git rebase --skip" instead. To check out the original branch and stop rebasing, run "git rebase --abort".
Timidfriendly

5
リベースがあります
Soy Edu Feliz Navidad

git merge --continue、これは私がやろうとしていることですが、結果はになりerror: unknown option 'continue'ます。git-mergemanページにリストされていないので、あなたの答えが間違っていると確信しています。使用しているGitのバージョンは何ですか?使用していgit version 1.8.5.2 (Apple Git-48)ます。MacPortsでも試しましたgit version 2.9.3
jww 2016

1
単純なマージのためのgit 2.10では、コマンドはgit commit
非常に

2

マージの競合は、両方をマージしようとしている2つのブランチが同じファイルの同じ部分を変更したときに発生します。との競合のリストを生成できgit statusます。

競合する行が検出されると、Gitは影響を受けるファイルのコンテンツを、競合するコンテンツの両側を示す視覚的なインジケーターで編集します。

<<<<<<< HEAD
conflicted text from HEAD
=======
conflicted text from merging_branch
>>>>>>> merging_branch

競合するファイルを修正してマージする準備ができたら、実行git addgit commitてマージコミットを生成するだけです。コミットが行わgit pushれると、ブランチが変更されます。

参照記事:Gitマージ


2

すべてのファイルを追加したら、次のステップは " git commit」です。

"git status"は何をすべきかを提案します:まだ追加されていないファイルが下部にリストされ、それらがすべて完了したら、上部にコミットを提案し、現在のブランチのマージステータスを説明します。


1

最初に明確にしたいのは、ブランチ名は特定のコミットの単なるエイリアスであることです。コミットとは、プル、プッシュマージなどを行うときにgitが機能することです。各コミットには一意のIDがあります。

$ git mergeを実行すると、実際に起こっていることは、gitが現在のブランチを参照先のブランチがオンになっているコミットに高速転送しようとすることです(つまり、両方のブランチ名が同じコミットを指します)。このシナリオはgitにとって最も簡単です新しいコミットがないため、対処する必要があります。マスターがあなたのブランチが落ち着いているリリパッドにジャンプすることを考えてください。--no-ffフラグを設定することが可能です。その場合、コードの競合があったかどうかに関係なく、gitは新しいコミットを作成します。

マージしようとしている2つのブランチ(通常、コミット履歴が過去に共通のコミットを共有している2つのブランチ)の間にコードの競合がある場合、早送りは機能しません。競合するファイルの両方のブランチで同じ行が変更されない限り、gitはファイルを自動的にマージできる場合があります。この場合、gitは競合するファイルをマージし、自動的にコミットします。$ git diff --cachedを実行すると、gitの動作をプレビューできます。または、-no-commitフラグをmergeコマンドに渡すことができます。これにより、追加してコミットする必要がある変更されたファイルがインデックスに残ります。ただし、これらのファイルを$ git diffして、マージが変更する内容を確認できます。

3番目のシナリオは、gitが自動的に解決できない競合がある場合です。この場合、それらを手動でマージする必要があります。私の意見では、これは、araxis mergeやp4merge(無料)のようなマージテイクで行うのが最も簡単です。どちらの方法でも、各ファイルを1つずつ実行する必要があります。マージが行き詰まっているように見える場合は、$ git merge --continueを使用して、少しずつ動かしていきます。Gitは、続行できないかどうか、また続行できる場合はその理由を教えてください。ある時点でマージをごまかしたと感じた場合は、$ git merge --abortを実行できます。マージを元に戻すと、最初からやり直すことができます。完了すると、マージした各ファイルは変更されたファイルになり、追加してコミットする必要があります。$ gitステータスでファイルの場所を確認できます。マージしたファイルをまだコミットしていない場合。マージを完了するには、これを行う必要があります。


0

遅いかもしれません。git HEADが更新されていないため、問題が発生しています。この賞賛はそれを解決するでしょうgit reset HEAD

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