web-dev-qa-db-ja.com

gitで複数のスタッシュを組み合わせる方法

これは、過去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}競合がある場所。

56
sscirrus

作業ツリーで変更されたファイルと競合しない場合にのみスタッシュを適用できます。そのため、まず、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}になることに注意してください。

43
Andrew Marshall

少し複雑ですが、これはほとんど常に機能します:

  1. 最初のスタッシュをポップ

    $ git stash pop
    
  2. 最初のスタッシュからの変更を一時的にコミットします

    $ git add . && git commit -am 'WIP'
    
  3. 2番目のスタッシュをポップ

    $ git stash pop
    
  4. 一時的なコミットを元に戻し、導入した変更を保持します

    $ git reset --soft HEAD^
    
96
bkeepers

より良い方法は、git stash show -p stash@{whatever} > stash-{whatever}.diffを使用してから、それぞれにgit applyを使用することです。

12
siride

私は同様の問題を抱えていて、このように解決しました。

git stash popを使用して、いずれかのスタッシュを適用します。次に、git diff -p > ../stash.diffを使用してこのスタッシュのパッチを作成します。次に、作業ツリーをリセット(または変更を再度スタッシュ)し、git stash pop stash@{1}で他のスタッシュをポップします。この時点でパッチを適用すると、2つの異なるスタッシュを「マージ」できます。

おそらく、解決すべき競合がいくつかあるでしょう。すべてがうまくいけば、隠された変更をドロップできます。

2
Henridv