web-dev-qa-db-ja.com

マージ競合が発生しました。マージを中止するにはどうすればいいですか。

私はgit pullを使い、マージの衝突がありました:

unmerged:   _widget.html.erb

You are in the middle of a conflicted merge.

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

2199
Gwyn Morfey

あなたのpullは失敗したので、HEADHEAD^ではない)があなたのブランチに対する最後の "有効な"コミットです:

git reset --hard HEAD

あなたが望む他の部分はそれらの変更があなたの変更を上書きするようにすることです。

古いバージョンのgitでは、 "theirs"マージ戦略を使うことができました。

git pull --strategy=theirs remote_branch

しかし、 このメッセージはJunio Hamanoによる (Gitメンテナ)で説明されているように、これはその後削除されました。 リンク で述べたように、代わりにこれを行います。

git fetch Origin
git reset --hard Origin
1956
Pat Notz

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

また、@ Michael Michaelが述べているように、gitのバージョンが1.7.4以上の場合は、git merge --abortを使用することもできます。

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

git mergeのmanページから

git merge --abortが存在する場合、git reset --mergeMERGE_HEADと同じです。

マージが進行中のときは、MERGE_HEADが存在します。

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

マージを開始する前にコミットしたくない変更がある場合は、マージの前にそれらをgit stash、マージの終了または中止の後にgit stash popを実行するだけです。

1766
Carl
git merge --abort

現在の競合解決プロセスを中止し、マージ前の状態を再構築します。

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

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

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

440
ignis

git resetが必要だと思います。

git revertsvn revertとは非常に異なる意味を持つことに注意してください - Subversionでは、取り消しは(コミットされていない)変更を破棄し、ファイルをリポジトリから現在のバージョンに戻しますが、git revertはコミットを元に戻します。

git resetsvn revertと同等のことをするべきです。つまり、不要な変更を破棄します。

83
David Precious

この特定のユースケースでは、本当にマージを中止するのではなく、特定の方法で競合を解決するだけです。

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

競合のあるマージされていないファイルの場合、gitはインデックス内のファイルの共通ベース、ローカルおよびリモートバージョンを利用可能にします。 (これは、git mergetoolによって3方向差分ツールで使用するために読み取られる場所です。)それらを表示するには、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
74
CB Bailey

とても簡単です。

git merge --abort

このような問題に遭遇してgit statusコマンドを実行すると、Git自体が解決策を示します。

git status

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

58

コメントはgit reset --mergegit merge --abortのエイリアスであることを示唆しているため、git merge --abortが存在する場合、git reset --mergeMERGE_HEADとのみ同等であることに注意してください。これは、マージコマンドのgitヘルプで読むことができます。

git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present.

マージに失敗した後、MERGE_HEADがない場合、失敗したマージはgit reset --mergeで元に戻すことができますが、必ずしもgit merge --abortではなく、同じものに対する古い構文と新しい構文のみ

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

33
Martin G

そして、あなたがマージの衝突になってしまい、コミットするものがなくても、下記のすべてのコマンドを適用した後にまだマージエラーが表示されている場合、

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

それが役立つことを願っています!

21
Nirav Mehta

Git 1.6.1.3から git checkout はマージの両側からチェックアウトすることができました:

git checkout --theirs _widget.html.erb
17
Alain O'Dea

作業コピーの状態を保持する代替手段は、次のとおりです。

git stash
git merge --abort
git stash pop

これはSubversionでマージすることに似ているので、私は一般的にこれに対して忠告します。

15
Alain O'Dea

このようなシナリオでは、git fetchgit pullを実行し、その後、上流ブランチがマスターブランチではないことに気付きました。

git reset -merge 

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

1
naamadheya

私は次のことがうまくいったことを見つけました(単一のファイルをマージ前の状態に戻します):

git reset *currentBranchIntoWhichYouMerged* -- *fileToBeReset*
1