Git Stash のポップ コンフリクトを元に戻す
- Git Stash ポップ マージの競合 - 問題
- Git Stash Pop with Conflicts を元に戻す - 悪いマージを中止してクリーンな状態に戻す
- 悪い競合を解決して Git Stash Pop を元に戻す
この記事の解決策とのマージ競合で git stash pop
を元に戻すことができます。 不正なスタッシュ ポップ操作を中止し、クリーンな状態に戻す方法を示します。
しかし、競合を解決し、新しい適切なマージで git stash pop
を元に戻す方法も示します。
Git Stash ポップ マージの競合 - 問題
ペースの速い開発者のワークフローでは、現在の状態を隠しておき、新しいアイデアが浮かんだときに他の機能にジャンプするのが一般的です。
新機能の作業が終了したら、隠した変更を git stash pop
コマンドで適用します。 しかし、この前後のワークフローにより、マージの競合が発生することがあります。
このような状況では、次の 2つのいずれかを行う必要があります。
- 不正なマージを中止して、以前のクリーンな状態に戻ります。
- ファイル/ディレクトリをローカルで編集するか、リモートリポジトリからプルして、マージの競合を解決することができます。 その後、正しい変更を新しいコミットにマージできます。
両方のソリューションを見てみましょう。
Git Stash Pop with Conflicts を元に戻す - 悪いマージを中止してクリーンな状態に戻す
不正な stash pop 操作の変更を削除する場合は、次のコマンドのいずれかを使用する必要があります。 これらのメソッドは、マージの競合の原因となったすべての変更を中止し、以前の正常な状態に戻します。
git reset --merge
まず、セットアップを見てみましょう。 次のように、いくつかのファイルを含む master
ブランチがあります。
次に、そこから new_branch
ローカル ブランチをフォークします。 このブランチのいくつかのファイルを変更し、それらの変更をコミットします。
file1.txt
と file2.txt
にいくつかの変更を加えます。 次に、これらの変更を stash
します。
git stash -u -m "Modify file1 and file2 in new_branch"
git stash
はここでいくつかのオプションを取ります。 -u
フラグを使用すると、追跡されていない変更を隠しておくことができます。
-m
フラグは同じ意味を持ちます - これにより、セマンティック メッセージを stash に追加できます。
master
ブランチの同じ file1.txt
と file2.txt
に変更を加えます。 これらのファイルには、master
と new_branch
で異なるバージョンがあります。
master
ブランチに stash を適用したい場合、これらの異なるバージョンの file1
と file2
が競合を引き起こします。
リポジトリを確認すると、マージの試行が不適切なため、奇妙なファイルが見つかります。
reset
コマンドをいくつかのオプションとともに使用して、失敗したスタッシュ ポップを元に戻すことができます。
git reset --merge
git reset
は最近 --merge
オプションを学習しました。 --merge
オプションはデフォルトの --mixed
オプションに似ていますが、マージ操作の影響を受けるファイルにのみ適用されます。
このコマンドの結果は、この例では git undo bad stash pop であることがわかります。
git checkout -f
-f
フラグを渡すことで、git checkout
コマンドを使用して上記と同じ結果を確認できます。
git checkout -f
引数がない場合、git checkout
コマンドはデフォルトの HEAD
引数を取ります。 前回のコミットは stash pop マージの競合が発生することなく良好であったため、このコマンドはスレートを一掃します。
-f
フラグは --force
オプション用です。 マージされていないコミットと追跡されていないファイルを無視して、健全なリポジトリの状態を確保するのに役立ちます。
上記の 2つの方法は、コンフリクトを完全に消去したいだけの場合に、コンフリクトのある git stash pop を元に戻すのに最適です。
しかし、新しい適切なマージでコミットを解決したい場合は、以下の方法を使用する必要があります。
悪い競合を解決して Git Stash Pop を元に戻す
競合を解決するには、すべてのブランチでファイルとディレクトリを適切に同期して編集する必要があります。
これは、いくつかのコマンドを使用してローカルで行うことも、リモート リポジトリから取得することもできます。 両方のソリューションを見ていきます。
競合を Git に解決する 失敗したスタッシュ ポップを元に戻す - ローカル ブランチの場合
上記と同じ設定があります。 しかし今回は、main
と new_branch
の間の競合を解決し、stash を再適用して目的の結果を取得します。
最初に、スタッシュ ポップの競合を引き起こすファイルの変更を削除します。 フォーク後に master
の file1
と file2
に加えた変更が問題を引き起こしました。
file1
と file2
に悪い変更を加えたコミットの前に、master
をコミットに reset
します。
git reset <good_commit_hash>
git checkout HEAD .
また、checkout
コマンドで作業領域をロールバックします。 末尾のドット .
に注意してください。これにより、すべてのファイルが選択され、すべての競合が確実に解決されます。
以下を使用することもできます。
git reset HEAD file1.txt file2.txt
この場合、関連する 2つのファイルが file1.txt
と file2.txt
であることがわかっているためです。
この形式では、git checkout
コマンドは作業領域を HEAD
に合わせて設定します。これは競合のない最後の適切なコミットです。
master
ブランチからコミットが削除されていることがわかります。
これで、隠した変更を正常に適用できました。
git stash pop
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 fetch --all
次に、ローカル マスター
をリモート マスター
とマージします。
git merge origin/master
最新の変更をプルすることで、ローカル マスター
がリモート マスターと同期していることがわかります。 また、重要な file5.txt
が含まれていることもわかります。
更新された local master
で、ローカル ブランチ local_branch_2
を rebase
します。
まず、ローカル ブランチを checkout
します。
git checkout local_branch_2
次に、ローカル マスターで rebase
します。
git rebase master
これにより、local_branch_2
が健全になり、隠した変更を受け取る準備が整います。
隠した変更を適用します。
git stash pop
今回は、隠した変更が正常に適用されていることがわかります。
競合を解決し、隠した変更を正常にマージしました。
資力:
- https://melvingeorge.me/blog/abort-git-stash-process-if-merge-conflicts-git
- https://www.theserverside.com/video/How-to-easily-merge-and-resolve-git-stash-pop-conflicts
- https://melvingeorge.me/blog/abort-git-stash-process-if-merge-conflicts-git
- https://newbedev.com/git-stash-blunder-git-stash-pop-and-ended-up-with-merge-conflicts
- https://stackoverflow.com/questions/4778882/how-to-launch-and-edit-a-file-from-git-using-notepad