私は自分のブランチにいくつかの変更を加えましたが、そのブランチに必要な他の変更をすべて隠していたのを忘れていました。私が欲しいのは、隠しておいた変更を現在の変更とマージする方法です。
これを行う方法はありますか?
便宜上、結局私は最終的にあきらめて最初に現在の変更をコミットし、次に私の隠された変更をコミットしましたが、私は一挙にそれらを取り入れることを望んでいました。
私は自分のブランチにいくつかの変更を加えましたが、そのブランチに必要な他の変更をすべて隠していたのを忘れていました。私が欲しいのは、隠しておいた変更を現在の変更とマージする方法です。
これを行う方法はありますか?
便宜上、結局私は最終的にあきらめて最初に現在の変更をコミットし、次に私の隠された変更をコミットしましたが、私は一挙にそれらを取り入れることを望んでいました。
回答:
コミットされていない変更がインデックスに追加された場合(つまり、を使用して「ステージング」された場合git add ...
)、git stash apply
(そしておそらく、git stash pop
)実際に適切なマージが行われることを発見しました。衝突がない場合、あなたは黄金です。そうでない場合は、通常どおりで解決するgit mergetool
か、エディタで手動で解決します。
明確にするために、これは私が話しているプロセスです:
mkdir test-repo && cd test-repo && git init
echo test > test.txt
git add test.txt && git commit -m "Initial version"
# here's the interesting part:
# make a local change and stash it:
echo test2 > test.txt
git stash
# make a different local change:
echo test3 > test.txt
# try to apply the previous changes:
git stash apply
# git complains "Cannot apply to a dirty working tree, please stage your changes"
# add "test3" changes to the index, then re-try the stash:
git add test.txt
git stash apply
# git says: "Auto-merging test.txt"
# git says: "CONFLICT (content): Merge conflict in test.txt"
...これはおそらくあなたが探しているものです。
git add
最初に実行します。
git stash apply --force
何かあったらいいのになあ。
git add .
、git stash apply
そして、git reset
コミットを加えることなく、私の作業の変更やマージにスタッシュを適用します。
実行中git stash pop
またはgit stash apply
本質的にはマージです。stashで変更されたファイルが作業コピーでも変更されない限り、現在の変更をコミットする必要はありませんでした。その場合、次のエラーメッセージが表示されます。
error: Your local changes to the following files would be overwritten by merge:
file.txt
Please, commit your changes or stash them before you can merge.
Aborting
その場合、1ステップで現在の変更にスタッシュを適用することはできません。git rebase
本当に2つのコミットが必要ない場合は、変更をコミットし、stashを適用して再度コミットし、2つのコミットを押しつぶすことができますが、それだけの価値があるほど面倒かもしれません。
git commit --amend
ます。
私が欲しいのは、隠された変更を現在の変更とマージする方法です
これを行う別のオプションを次に示します。
git stash show -p|git apply
git stash drop
git stash show -p
最後に保存されたスタッシュのパッチが表示されます。git apply
それを適用します。マージが完了したら、マージされたスタッシュをで削除できますgit stash drop
。
git stash pop
ます。マージが問題なく適用される場合に、なぜこれを実行しないのかわかりません...
git stash show -p --no-color | git apply --3way
(--3way
=パッチが失敗した場合、3者間マージにフォールバック)。
git stash show -p
差分を作成しますます。したがって、これはOPが行った作業ファイルの変更を上書きします。
git stash show -p
によってマージされgit apply
ます。
私がこれを行う方法は、git add
次にこれを最初にすることgit stash apply <stash code>
です。これが最も簡単な方法です。
@Brandanによって提案されたように、これは私が回避するために必要なことです
error: Your local changes to the following files would be overwritten by merge:
file.txt
Please, commit your changes or stash them before you can merge.
Aborting
このプロセスに従ってください:
git status # local changes to `file`
git stash list # further changes to `file` we want to merge
git commit -m "WIP" file
git stash pop
git commit -m "WIP2" file
git rebase -i HEAD^^ # I always use interactive rebase -- I'm sure you could do this in a single command with the simplicity of this process -- basically squash HEAD into HEAD^
# mark the second commit to squash into the first using your EDITOR
git reset HEAD^
そして、への完全にマージされたローカル変更が残り、file
さらに作業/クリーンアップを実行するか、単一の適切なコミットを行う準備が整います。または、マージされたコンテンツfile
が正しいことがわかっている場合は、適切なメッセージを書き込んでスキップできますgit reset HEAD^
。
たぶん、ブランチから(difftoolを介して)マージするのは最悪の考えではありません...はい...ブランチ!
> current_branch=$(git status | head -n1 | cut -d' ' -f3)
> stash_branch="$current_branch-stash-$(date +%yy%mm%dd-%Hh%M)"
> git stash branch $stash_branch
> git checkout $current_branch
> git difftool $stash_branch
別のオプションは、ローカルのコミットされていない変更の別の「git stash」を実行してから、2つのgit stashを結合することです。残念ながら、gitには2つのスタッシュを簡単に組み合わせる方法がないようです。したがって、1つのオプションは、2つの.diffファイルを作成して両方に適用することです。少なくとも、追加のコミットではなく、10ステップのプロセスは必要ありません:|