私はマージの衝突に遭遇しました。どうすればマージを中止できますか?


2539

私は使用git pullしてマージの競合がありました:

unmerged:   _widget.html.erb

You are in the middle of a conflicted merge.

私はファイルの他のバージョンが良いこと、そして私のものは悪いことを知っているので、私の変更はすべて放棄されるべきです。これどうやってするの?


30
これは非常に古い質問ですが、マージ全体を中止してマージしていたブランチをマージせずに残しますか、それとも、この1つのファイルを大きなマージの一部として無視して、他のすべてのファイルを次のようにマージしますか?正常?私にとって、あなたのタイトルは前者を意味し、あなたの質問団体は後者を望んでいます。答えは物事を明確にすることなく、両方を行います。
rjmunro 2013年

自動マージが失敗したと言って、コミット時に同様のケースを受け取りました。競合を修正して、結果をコミット:[rejected] gh-pages -> gh-pages (non-fast-forward)
Chetabahana

4
グウィン、ここで承認済みの回答を選択すると役立つ場合があります。上位投票の1つは、最新のソリューションのいくつかよりも安全性が少し低いため、他のソリューションを強調するのに役立つと思います:)
Amicable

回答:


2222

あなたpullが失敗したので、HEAD(ではなくHEAD^)あなたのブランチの最後の「有効な」コミットです:

git reset --hard HEAD

もう1つ必要なのは、それらの変更が変更を上書きできるようにすることです。

古いバージョンのgitでは、「それら」のマージ戦略を使用できました。

git pull --strategy=theirs remote_branch

しかし、このメッセージで説明されているように、これは削除されました。リンクに記載されているように、代わりに次のようにします。

git fetch origin
git reset --hard origin

49
ハードリセットを行う代わりに、次のようにすることで、より細かいレベルに戻すことができ ます。- git fetch origin > git reset origin (soft reset, your changes are still present) -> git checkout file_to_use_their_version_of another_file (steamroll your own changes back to match the origin)git pullをこれ以上使用しません。私の最新のコードと原点との戦いであるので、原点はいつもいつも、私に勝つ必要があるgit fetchgit rebase origin。これにより、実際にはマージと競合がほとんど発生しなくなります。
クジャイ

7
同意する。最初にフェッチしてから、アップストリームの変更(git log ..@{upstream}またはgit diff ..@{upstream})を調べることも好きです。その後、あなたのように、私は私の仕事をリベースします。
Pat Notz

162
より最近の回答で述べたように、バージョン1.6.1以降では、「git reset --merge」を使用することが可能です
Matt Ball

5
私は使用git merge -X theirs remote_branchの代わりgit pull --strategy=theirs remote_branchとしてtheirsのオプションのように見えるrecursive
MLT

14
git merge --abortはるかに好ましいです。
Daniel Cassidy

1956

gitバージョンが1.6.1以上の場合は、を使用できますgit reset --merge

また、@ Michael Johnsonが言及しているように、gitのバージョンが1.7.4以上の場合は、も使用できますgit merge --abort

いつものように、マージを開始する前に、コミットされていない変更がないことを確認してください。

gitのマージmanページ

git merge --abort に相当 git reset --mergeMERGE_HEAD存在場合です。

MERGE_HEAD マージの進行中に存在します。

また、マージ開始時のコミットされていない変更について:

マージを開始する前にコミットしたくない変更がある場合は、マージのgit stash前とマージのgit stash pop終了後または中止した後の変更のみ。


3
興味深い-しかし、マニュアルは私を怖がらせます。いつ使用するのが適切ですか?いつオプションを指定する必要があり<commit>ますか?#GitMoment:-o
conny

1
通常は、最初からマージをやり直す場合に使用します。私はオプションのコミットを自分で指定する必要がなかったので、デフォルト(オプションの<commit>なし)で十分です。
カール

44
この回答の投票数が増えることを願っています!この時点で、多くの場合、これは最も適切なソリューションのようです。
Jay Taylor

1
コミットされていない変更があっても、gitはマージ前の状態を復元できました。いいね!
T3rm1 14年

2
git merge --abort同義語git reset --mergeですか?名前は確かにもっと理にかなっていますが、同じ機能を持っていますか?
Tikhon Jelvis 14

518
git merge --abort

現在の競合解決プロセスを中止し、マージ前の状態を再構築してください。

マージの開始時にコミットされていないワークツリーの変更があった場合、 git merge --abortこれらの変更を再構築できない場合があります。したがって、git mergeを実行する前に、常に変更をコミットまたは隠しておくことをお勧めします。

git merge --abortが存在するgit reset --merge場合 と同等MERGE_HEADです。

http://www.git-scm.com/docs/git-merge


16
これはgit v1.7.4以降で利用可能です。これはgit reset --mergeのエイリアスです。
マイケルジョンソン

162

とてもシンプルです。

git merge --abort

このタイプの問題が発生してgit statusコマンドを実行すると、Git自体に解決策が表示されます。

git status

これが人々の役に立つことを願っています。


97

git reset必要だと思います。

つまりgit revert、たとえば、svn revertSubversionでは元に戻すと、(コミットされていない)変更が破棄され、ファイルがリポジトリから現在のバージョンに戻されます。git revert「アンドゥ」はコミット。

git reset 同等のことを行う必要があります svn revert必要があります。つまり、不要な変更を破棄します。


76

この特定の使用例では、実際にマージを中止するのではなく、特定の方法で競合を解決します。

リセットして別の戦略でマージを実行する必要も特にありません。競合はgitによって正しく強調表示されており、反対側の変更を受け入れる要件は、この1つのファイルに対してのみです。

競合するマージされていないファイルの場合、gitはインデックス内のファイルの共通のベースバージョン、ローカルバージョン、リモートバージョンを利用できるようにします。(これは、によって3方向差分ツールで使用するために読み込まれる場所ですgit mergetool。)を使用git showして表示できます。

# common base:
git show :1:_widget.html.erb

# 'ours'
git show :2:_widget.html.erb

# 'theirs'
git show :3:_widget.html.erb

リモートバージョンをそのまま使用して競合を解決する最も簡単な方法は、次のとおりです。

git show :3:_widget.html.erb >_widget.html.erb
git add _widget.html.erb

または、git> = 1.6.1の場合:

git checkout --theirs _widget.html.erb

5
ヒントをありがとう。しかし、これは貧弱なgitユーザーインターフェイスの小片ではありませんか?
ピーター

@ピーター:私は確信していません。希望する結果は、シンプルなオプションを備えたいくつかの基本的なコマンドで達成できます。どのような改善を提案しますか?
CBベイリー

10
git 1.6.1コマンドは意味があり、良いと思います。それがまさに私が望んでいたことです。1.6.1より前のソリューションは洗練されておらず、マージ解決プロセスから切り離すべきgitの他の部分に関する知識が必要だと思います。しかし、新しいバージョンは素晴らしいです!
Peter

67

のようなシナリオの場合、私はとgit fetchを実行git pullしましたが、上流のブランチがマスターブランチではないことに気づきました。これにより、不要な競合が発生しました。

git reset --merge 

これは、ローカルの変更をリセットせずに元に戻りました。


45

コメントは、git reset --mergeがのエイリアスであることを示唆していgit merge --abortます。a が存在git merge --abortする場合にのみ同等であることは注目に値します。これはgit help for mergeコマンドで読むことができます。git reset --mergeMERGE_HEAD

git merge --abortは、MERGE_HEADが存在する場合のgit reset --mergeと同等です。

マージが失敗した後、がないMERGE_HEAD場合、失敗したマージはで元に戻すことができますgit reset --mergeが、必ずしもで元に戻すことはできませんgit merge --abortそれらは同じものの古い構文と新しい構文だけではありません

個人的にはgit reset --merge、説明したシナリオと同様のシナリオで非常に強力であり、マージは一般的に失敗しました。


2
ここで「マージの失敗」とは実際には何を意味するのでしょうか?競合または他の何かとマージしますか?または言い換えると、MERGE_HEADが存在しないのはいつですか。私のフォローアップの質問は、「git reset --merge」のより良い使用法を理解するためにあります。
Ewoks、2015

@Ewoksはgit stash apply私のためにマージ競合の原因となったが、git merge --abort一方で助けにはならなかったgit reset --mergeでした。
ニッツェル2018

27

マージの競合が発生し、コミットするものがない場合でも、マージエラーが表示されます。以下のすべてのコマンドを適用した後、

git reset --hard HEAD
git pull --strategy=theirs remote_branch
git fetch origin
git reset --hard origin

削除してください

.git \ index.lock

ファイル[リカバリの場合は他の場所にカットアンドペースト]し、必要なバージョンに応じて以下のコマンドのいずれかを入力します。

git reset --hard HEAD
git reset --hard origin

お役に立てば幸いです!!!


19

作業コピーの状態を保存する別の方法は次のとおりです。

git stash
git merge --abort
git stash pop

次のコミットでブランチの関係を破棄するので、Subversionでマージするのと同じような効果があるので、一般的にはこれはお勧めしません。


このアプローチは、git-svnブランチに誤ってマージしたときに便利であることがわかりました。スカッシュマージまたはチェリーピックは、git-svnトラッキングブランチを使用する場合に適しています。事実、私の解決策は、事後マージをスカッシュマージに変換します。
Alain O'Dea

質問に対する最良の回答
Fouad Boukredine


3

以下が機能することがわかりました(単一のファイルをマージ前の状態に戻します)。

git reset *currentBranchIntoWhichYouMerged* -- *fileToBeReset*

-5

ソースツリー

マージをコミットしないので、別のブランチをダブルクリックします(つまり、チェックアウトすることを意味します)。sourcetreeがすべての変更の破棄について尋ねてきたら、同意します:)

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