私はgit pull
を使い、マージの衝突がありました:
unmerged: _widget.html.erb
You are in the middle of a conflicted merge.
私はそのファイルの他のバージョンが良いこと、そして私のものが悪いことを知っているので私のすべての変更は放棄されるべきです。これどうやってするの?
あなたのpull
は失敗したので、HEAD
(HEAD^
ではない)があなたのブランチに対する最後の "有効な"コミットです:
git reset --hard HEAD
あなたが望む他の部分はそれらの変更があなたの変更を上書きするようにすることです。
古いバージョンのgitでは、 "theirs"マージ戦略を使うことができました。
git pull --strategy=theirs remote_branch
しかし、 このメッセージはJunio Hamanoによる (Gitメンテナ)で説明されているように、これはその後削除されました。 リンク で述べたように、代わりにこれを行います。
git fetch Origin
git reset --hard Origin
Gitのバージョンが1.6.1以上の場合は、git reset --merge
を使用できます。
また、@ Michael Michaelが述べているように、gitのバージョンが1.7.4以上の場合は、git merge --abort
を使用することもできます。
いつものように、マージを開始する前に、コミットされていない変更がないことを確認してください。
git merge --abort
が存在する場合、git reset --merge
はMERGE_HEAD
と同じです。
マージが進行中のときは、MERGE_HEAD
が存在します。
また、マージ開始時のコミットされていない変更について
マージを開始する前にコミットしたくない変更がある場合は、マージの前にそれらをgit stash
、マージの終了または中止の後にgit stash pop
を実行するだけです。
git merge --abort
現在の競合解決プロセスを中止し、マージ前の状態を再構築します。
マージの開始時にコミットされていない作業ツリーの変更があった場合、
git merge --abort
はこれらの変更を再構築できないことがあります。そのため、git mergeを実行する前に、常に変更内容をコミットまたは隠蔽することをお勧めします。
git merge --abort
が存在する場合、git reset --merge
はMERGE_HEAD
と同等です。
git reset
が必要だと思います。
git revert
はsvn revert
とは非常に異なる意味を持つことに注意してください - Subversionでは、取り消しは(コミットされていない)変更を破棄し、ファイルをリポジトリから現在のバージョンに戻しますが、git revert
はコミットを元に戻します。
git reset
はsvn revert
と同等のことをするべきです。つまり、不要な変更を破棄します。
この特定のユースケースでは、本当にマージを中止するのではなく、特定の方法で競合を解決するだけです。
別の方法でリセットしてマージを実行する必要も特にありません。競合は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
とても簡単です。
git merge --abort
このような問題に遭遇してgit statusコマンドを実行すると、Git自体が解決策を示します。
git status
これが人々に役立つことを願っています。
コメントはgit reset --merge
がgit merge --abort
のエイリアスであることを示唆しているため、git merge --abort
が存在する場合、git reset --merge
はMERGE_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
は、説明したシナリオと同様のシナリオではるかに強力であり、一般的にマージに失敗しました。
そして、あなたがマージの衝突になってしまい、コミットするものがなくても、下記のすべてのコマンドを適用した後にまだマージエラーが表示されている場合、
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
それが役立つことを願っています!
Git 1.6.1.3から git checkout
はマージの両側からチェックアウトすることができました:
git checkout --theirs _widget.html.erb
作業コピーの状態を保持する代替手段は、次のとおりです。
git stash
git merge --abort
git stash pop
これはSubversionでマージすることに似ているので、私は一般的にこれに対して忠告します。
このようなシナリオでは、git fetch
とgit pull
を実行し、その後、上流ブランチがマスターブランチではないことに気付きました。
git reset -merge
ローカルの変更をリセットせずに元に戻りました。
私は次のことがうまくいったことを見つけました(単一のファイルをマージ前の状態に戻します):
git reset *currentBranchIntoWhichYouMerged* -- *fileToBeReset*