これは、過去2週間にわたるブランチfrontend
のパイプラインです。
| Stash@{3}
はStash@{1}
(2つの小さなコミットを除く)
|小さなコミット
|小さなコミット
| 2週間前に巨大なバルクコミットがリベースされ、Stash@{1}
私の作業ツリーは現在きれいです。Stash@{1}
は、2週間前の一般的な開発コードのバルクコミットの内容です(最初は隠しておくべきでした)。このコミットは取り消され、スタッシュに移動しました。Stash@{3}
は、Stash@{1}
(コミットされた2、3の変更を除く)。
この2つのスタッシュを作業ツリーで結合して、この膨大な作業プールから多数のコミットを作成する必要があります。
git stash apply stash@{1}
その後、私が試した:
git stash apply stash@{3}
git stash show -p | git stash apply stash@{3}
しかし、どちらの場合も「ダーティワーキングツリー」になります。この作業を一緒にマージするにはどうすればよいですか?なぜならstash@{3}
の方が新しいので、stash@{1}
競合がある場所。
作業ツリーで変更されたファイルと競合しない場合にのみスタッシュを適用できます。そのため、まず、git status
に変更されたファイルがないことを確認します。それから:
git stash apply stash@{1}
git commit -a
# Enter your commit message
git stash apply stash@{3}
その後、新しいコミットを作成するか、前のコミットを修正して結合します。各適用後にマージの競合を解決する必要がある場合があります。
また、apply
ではなくgit stash pop
を使用することに決めた場合は、最初のものがポップオフされてからstash@{3}
がstash@{2}
になることに注意してください。
少し複雑ですが、これはほとんど常に機能します:
最初のスタッシュをポップ
$ git stash pop
最初のスタッシュからの変更を一時的にコミットします
$ git add . && git commit -am 'WIP'
2番目のスタッシュをポップ
$ git stash pop
一時的なコミットを元に戻し、導入した変更を保持します
$ git reset --soft HEAD^
より良い方法は、git stash show -p stash@{whatever} > stash-{whatever}.diff
を使用してから、それぞれにgit apply
を使用することです。
私は同様の問題を抱えていて、このように解決しました。
git stash pop
を使用して、いずれかのスタッシュを適用します。次に、git diff -p > ../stash.diff
を使用してこのスタッシュのパッチを作成します。次に、作業ツリーをリセット(または変更を再度スタッシュ)し、git stash pop stash@{1}
で他のスタッシュをポップします。この時点でパッチを適用すると、2つの異なるスタッシュを「マージ」できます。
おそらく、解決すべき競合がいくつかあるでしょう。すべてがうまくいけば、隠された変更をドロップできます。