マージの競合を引き起こすgit stash popを元に戻す


519

私は自分のコードベースに変更を加え始めましたが、古いトピックのブランチにいることに気付きませんでした。それらを転送するために、私はそれらを隠しておき、それをマスターから離れた新しいブランチに適用したかったのです。私が使用しgit stash pop、私は新しいブランチを作成する前に、マスターに新しい変更を引っ張っていなかったことを忘れて、この新しいブランチに作業中の変更を転送します。これにより、大量のマージ競合が発生し、(popを使用していたため)変更内容が完全に失われました。

新しいブランチを正しく再作成したら、隠しておいた変更をどのように回復して適切に適用できますか?

回答:


656

結局のところ、Gitは、うまく適用されない場合に隠し場所を落とさないように十分にスマートです。次の手順で目的の状態に到達できました。

  1. マージの競合をステージング解除するには:(git reset HEAD .末尾のドットに注意してください)
  2. 競合するマージを保存するには(念のため): git stash
  3. マスターに戻るには: git checkout master
  4. 最新の変更を取得するには: git fetch upstream; git merge upstream/master
  5. 新しいブランチを修正するには: git checkout new-branch; git rebase master
  6. 隠された正しい変更を適用するには(スタックの2番目): git stash apply stash@{1}

14
ありがとうございます!#6は本当に私が探していた答えです。git stash drop#2から不要な隠し場所を取り除くための最後のステップとしてa を追加できます。
オースティンマートン2014年

2
マージされていないパスがある場合は#2には、動作しませんではなく、出力誤差は、ここで説明します:stackoverflow.com/questions/5483213/...
エティエンヌ

5
完全に当てはまるわけではありません-クリーンに適用できなかった場合、Gitはスタッシュをスタッシュリストに保持します。次のドキュメントを参照してくださいgit stash pop。「状態の適用は競合で失敗する可能性があります。この場合、状態はスタッシュリストから削除されません。競合をgit stash drop手動で解決し、後で手動で呼び出す必要があります。」(git-scm.com/docs/git-stash
キャロラインコンウェイ

4
この回答と質問がまったく同じ日に投稿された方法が
call-me、

14
@ call-meこれは、人々が実際にもっと頻繁にやるべきことだと私は思います!「質問する」フォームには、同じフォームで自分の質問に回答できるチェックボックスがあることに注意してください。これは、私が困惑している質問を作成しているときにときどき起こりますが、StackOverflowに適するように質問を調整しようとすると、解決策を見つけ出すことになります。これは少し前のことなので、ここでそうだったかどうかは覚えていませんが、それが起こったと思います。
acjay

341

幸いなことに、衝突が発生してもスタッシュ変更されgit stash popませ

したがって、心配することはありません。コードをクリーンアップして、もう一度試してください。

:あなたがその状態に戻ることができ、あなたのコードベースは前にきれいだったと言うgit checkout -f
そして、あなたが忘れてしまったもの、例えばを行うgit merge missing-branch
ことだけで、火災の後git stash pop、再び、あなたが得る同じ前矛盾スタッシュを、。

重要: stashは安全ですが、作業ディレクトリーでコミットされていない変更は安全ではありません。彼らはめちゃくちゃになることができます。


16
私が理解しているのは、単純にクリーンアップして再びポップできるが、元に戻すことはできないということです。ポップが他のコミットされていない変更と混在する場合は、手動でクリーンアップする必要があります。
haridsv 2017年

これは非常に単純な解決策であり、私にとってはうまくいきました。ローカルで変更されたすべてのものを元に戻すことができることを前提としています(スタッシュがポップされる前後に変更はありませんでした)。これはほとんどの状況で機能すると思います。これが問題であることに気付く前に起こったいくつかの追加の変更を保存する必要がある場合、ほとんどの場合、チェックアウトを強制する前にそれらのファイルをコミットできるはずです。
Project707

これは私には当てはまりませんでした。私はgit stash popそれを自動マージを試み、競合し、それを保持すると呼んだ。
Trevor Hickey

1
@TrevorHickeyこの回答の要点は、競合が発生した場合にスタッシュがそのまま維持git stash popされることであり、競合が発生しなくなるまで、必要に応じて何度でも呼び出すことができます。したがって、競合後は、はい、作業ディレクトリは混乱していますが、クリーンアップしてgit stash pop再度呼び出すことができます。
フローリ

5
最後のstashの適用を元に戻すこのコマンドは非常に便利ですgit checkout -f
Lefi Tarik

16

ここでの説明は少し複雑なので、もっと簡単なものを提供します。

  1. git reset HEAD --hard 現在のブランチに対するすべての変更を破棄します

  2. ... 必要に応じて仲介作業を行う

  3. git stash pop 準備ができたら、後で収納ボックスを再度ポップします



8
git checkout -f

以前の状態がきれいな場合、動作する必要があります。

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