Git Stash のポップ コンフリクトを元に戻す

Ankit Raj Goyal 2023年6月20日
  1. Git Stash ポップ マージの競合 - 問題
  2. Git Stash Pop with Conflicts を元に戻す - 悪いマージを中止してクリーンな状態に戻す
  3. 悪い競合を解決して Git Stash Pop を元に戻す
Git Stash のポップ コンフリクトを元に戻す

この記事の解決策とのマージ競合で git stash pop を元に戻すことができます。 不正なスタッシュ ポップ操作を中止し、クリーンな状態に戻す方法を示します。

しかし、競合を解決し、新しい適切なマージで git stash pop を元に戻す方法も示します。

Git Stash ポップ マージの競合 - 問題

ペースの速い開発者のワークフローでは、現在の状態を隠しておき、新しいアイデアが浮かんだときに他の機能にジャンプするのが一般的です。

新機能の作業が終了したら、隠した変更を git stash pop コマンドで適用します。 しかし、この前後のワークフローにより、マージの競合が発生することがあります。

このような状況では、次の 2つのいずれかを行う必要があります。

  1. 不正なマージを中止して、以前のクリーンな状態に戻ります。
  2. ファイル/ディレクトリをローカルで編集するか、リモートリポジトリからプルして、マージの競合を解決することができます。 その後、正しい変更を新しいコミットにマージできます。

両方のソリューションを見てみましょう。

Git Stash Pop with Conflicts を元に戻す - 悪いマージを中止してクリーンな状態に戻す

不正な stash pop 操作の変更を削除する場合は、次のコマンドのいずれかを使用する必要があります。 これらのメソッドは、マージの競合の原因となったすべての変更を中止し、以前の正常な状態に戻します。

git reset --merge

まず、セットアップを見てみましょう。 次のように、いくつかのファイルを含む master ブランチがあります。

マスターブランチの初期設定

次に、そこから new_branch ローカル ブランチをフォークします。 このブランチのいくつかのファイルを変更し、それらの変更をコミットします。

新しいブランチの初期設定

file1.txtfile2.txt にいくつかの変更を加えます。 次に、これらの変更を stash します。

git stash -u -m "Modify file1 and file2 in new_branch"

git stash はここでいくつかのオプションを取ります。 -u フラグを使用すると、追跡されていない変更を隠しておくことができます。

-m フラグは同じ意味を持ちます - これにより、セマンティック メッセージを stash に追加できます。

新しいブランチにスタッシュ

master ブランチの同じ file1.txtfile2.txt に変更を加えます。 これらのファイルには、masternew_branch で異なるバージョンがあります。

フォーク後にファイルマスターを変更

master ブランチに stash を適用したい場合、これらの異なるバージョンの file1file2 が競合を引き起こします。

git stash pop 競合

リポジトリを確認すると、マージの試行が不適切なため、奇妙なファイルが見つかります。

git stash pop が奇妙な動作と衝突する

reset コマンドをいくつかのオプションとともに使用して、失敗したスタッシュ ポップを元に戻すことができます。

git reset --merge

git reset は最近 --merge オプションを学習しました。 --merge オプションはデフォルトの --mixed オプションに似ていますが、マージ操作の影響を受けるファイルにのみ適用されます。

このコマンドの結果は、この例では git undo bad stash pop であることがわかります。

git リセット マージ

git checkout -f

-f フラグを渡すことで、git checkout コマンドを使用して上記と同じ結果を確認できます。

git checkout -f

引数がない場合、git checkout コマンドはデフォルトの HEAD 引数を取ります。 前回のコミットは stash pop マージの競合が発生することなく良好であったため、このコマンドはスレートを一掃します。

-f フラグは --force オプション用です。 マージされていないコミットと追跡されていないファイルを無視して、健全なリポジトリの状態を確保するのに役立ちます。

git チェックアウト強制オプション

上記の 2つの方法は、コンフリクトを完全に消去したいだけの場合に、コンフリクトのある git stash pop を元に戻すのに最適です。

しかし、新しい適切なマージでコミットを解決したい場合は、以下の方法を使用する必要があります。

悪い競合を解決して Git Stash Pop を元に戻す

競合を解決するには、すべてのブランチでファイルとディレクトリを適切に同期して編集する必要があります。

これは、いくつかのコマンドを使用してローカルで行うことも、リモート リポジトリから取得することもできます。 両方のソリューションを見ていきます。

競合を Git に解決する 失敗したスタッシュ ポップを元に戻す - ローカル ブランチの場合

上記と同じ設定があります。 しかし今回は、mainnew_branch の間の競合を解決し、stash を再適用して目的の結果を取得します。

最初に、スタッシュ ポップの競合を引き起こすファイルの変更を削除します。 フォーク後に masterfile1file2 に加えた変更が問題を引き起こしました。

file1file2 に悪い変更を加えたコミットの前に、master をコミットに reset します。

git reset <good_commit_hash>

git reset bad commit

git checkout HEAD .

また、checkout コマンドで作業領域をロールバックします。 末尾のドット . に注意してください。これにより、すべてのファイルが選択され、すべての競合が確実に解決されます。

以下を使用することもできます。

git reset HEAD file1.txt file2.txt

この場合、関連する 2つのファイルが file1.txtfile2.txt であることがわかっているためです。

この形式では、git checkout コマンドは作業領域を HEAD に合わせて設定します。これは競合のない最後の適切なコミットです。

git チェックアウト ヘッド

master ブランチからコミットが削除されていることがわかります。

不適切なコミットがローカル セットアップに失敗しました

これで、隠した変更を正常に適用できました。

git stash pop

git グッド スタッシュ ポップ

successful resolve apply stash

Git Undo Bad Stash Pop - リモート リポジトリからプルして競合を解決する

リモート リポジトリが最も健全でない状態になるようにワークフローが設定されている場合は、リモートからプルすることで悪い stash の競合を解決できます。

まず、このソリューションの具体的なユース ケースを設定しましょう。

健全なリモート

リモートの背後にあるローカル マスター

ローカル リモートがリモート メインより 1 コミット遅れていることがわかります。 リモートマスターを追跡する新しいローカルブランチを作成し、いくつかの変更を隠しているとします。

git fetch --all

git switch -c new_branch_tracking_remote_master origin/master

ローカル ブランチ トラッキング リモート マスター

このブランチにいくつかの変更を隠しておきます。

git stash -m "Change file5.txt in local branch"

スタッシュ ローカル トラッキング リモート マスター

ここで、これらの変更を新しいローカル ブランチで行う必要があることに気付きました。 local master から新しい local branch をフォークします。

git checkout master

git branch local_branch_2

ローカル マスターからの新しいフォーク

このブランチはコミットが 1つ遅れており、file5.txt ファイルがありません。 ここでスタッシュをポップすると、不適切なマージ競合が発生します。

悪い git pop リモート ワークフロー

この場合、競合を解決するために、リモート マスターをローカル マスターにプルします。 まず、リモート リポジトリをフェッチする必要があります。

git fetch --all

次に、ローカル マスターリモート マスターとマージします。

git merge origin/master

リモートからローカル マスターをプル

最新の変更をプルすることで、ローカル マスターがリモート マスターと同期していることがわかります。 また、重要な file5.txt が含まれていることもわかります。

更新されたローカル マスター

更新された local master で、ローカル ブランチ local_branch_2rebase します。

まず、ローカル ブランチを checkout します。

git checkout local_branch_2

次に、ローカル マスターで rebase します。

git rebase master

これにより、local_branch_2 が健全になり、隠した変更を受け取る準備が整います。

マスターのローカルをリベース

隠した変更を適用します。

git stash pop

今回は、隠した変更が正常に適用されていることがわかります。

git stash pop 成功のリモート設定

競合を解決し、隠した変更を正常にマージしました。

success git stash pop リモート セットアップ

資力:

  1. https://melvingeorge.me/blog/abort-git-stash-process-if-merge-conflicts-git
  2. https://www.theserverside.com/video/How-to-easily-merge-and-resolve-git-stash-pop-conflicts
  3. https://melvingeorge.me/blog/abort-git-stash-process-if-merge-conflicts-git
  4. https://newbedev.com/git-stash-blunder-git-stash-pop-and-ended-up-with-merge-conflicts
  5. https://stackoverflow.com/questions/4778882/how-to-launch-and-edit-a-file-from-git-using-notepad

関連記事 - Git Stash