回答:
あなたのファイルはまだコミットされていないのでbranch1
:
git stash
git checkout branch2
git stash pop
または
git stash
git checkout branch2
git stash list # to check the various stash made in different branch
git stash apply x # to select the right one
benjohnによるコメント(git stash
manページを参照):
現在追跡されていない(新しく追加された)ファイルも隠して
-u
おくには、引数を追加します。
git stash -u
-u
おくには、引数を追加しますgit stash -u
。
隠蔽、一時的なコミット、リベースはすべてやりすぎかもしれません。変更されたファイルをまだインデックスに追加していない場合は、他のブランチをチェックアウトできる可能性があります。
git checkout branch2
これは、編集しているファイルがbranch1とbranch2の間で異なっていない限り機能します。作業中の変更が保存されたままブランチ2に残ります。それらが異なる場合は、ローカルの変更を、-m
チェックアウトのオプションを使用してブランチを切り替えることによって導入された変更とマージすることを指定できます。
git checkout -m branch2
変更をインデックスに追加した場合は、最初にリセットしてこれらの変更を取り消す必要があります。(これにより、作業コピーが保持されます。ステージングされた変更が削除されるだけです。)
git reset
checkout -m
ある状況で「安全」でない場合(マージの競合が発生する可能性があります)、stashを使用するとどのような利点がありますか(たとえば、stashのポップを解除できますか)。
.orig
ませんか?
警告: git初心者向けではありません。
これは私のワークフローで十分出てきたので、ほとんど新しいgitコマンドを作成しようとしました。通常のgit stash
フローは、移動するための方法であるが、少し厄介です。私は通常、最初に新しいコミットを作成します。変更を見ていると、すべての情報が頭の中で新鮮であり、git commit
見つけたもの(通常は、作業中に発見したマスターに属するバグ修正)を開始する方がよいためです。機能ブランチ)すぐに。
また、このような状況が頻繁に発生する場合は、現在のディレクトリに加えて、常に
master
ブランチがチェックアウトされている別の作業ディレクトリを用意すると便利です。
だから私がこれを達成する方法は次のようになります:
git commit
適切なコミットメッセージですぐに変更されます。git reset HEAD~1
現在のブランチからのコミットを取り消す。時々(非同期に)、またはすぐに別のターミナルウィンドウで:
cd my-project-master
同じを共有する別のWDです .git
git reflog
私が作ったバグ修正を見つけるために。git cherry-pick SHA1
コミットの。オプションで(依然として非同期)、機能ブランチをリベース(またはマージ)してバグ修正を取得できます。通常は、PRを送信しようとして機能ブランチとWDをすでにクリーンアップしている場合です。
cd my-project
これは私が取り組んでいるメインWDです。git rebase master
バグ修正を取得します。私は中断のない機能で作業を続けることができず、この方法では、心配する必要はgit stash
何も-ingたりする前に、私のWDをきれいにすることgit checkout
になり、すべての私のバグフィックスを持って、まだ(。その後、再びチェックに機能ブランチのバックアウトを持つ)とmaster
の代わりに、私の機能ブランチに隠されています。
IMO git stash
とgit checkout
あなたには、いくつかの大きな特徴に取り組んの真ん中にあるとき本当のPIAです。
my-project-master
同じ共有.git
、それはそれのように聞こえるが。なぜgit checkout -b bugfixABC; git commit -a; git reset HEAD^ --hard
、後で(非同期で)オンmaster
になっているのgit cherry-pick <SHA1 of the commit(s) in bugfixABC
ですか?(または、git rebase --onto master feature bugfixABC
現在ブランチが存在する場所からSHA1を見つける必要を回避するためです。つまり、git reset
上記の直後に、の間、それを実行できますfeature
。)
checkout -m
です。その場合は、その方が優れています。
コミットされた変更に関するものである場合は、git-rebaseを確認する必要がありますが、VonCのコメントで指摘されているように、ローカルの変更について話しているときは、git-stashが確かにこれを行うための良い方法です。
これまでの回答は、マージの競合を解決するために多くの不必要な作業を必要とするか、または誤っていることが多い仮定を行いすぎるため、理想的ではありません。これが完璧に行う方法です。リンクは私のサイトへのリンクです。
からのすべての変更をコミットせずmy_branch
にmaster
、コミットするコミットされていない変更がありますmy_branch
。
git merge master
git stash -u
git checkout master
git stash apply
git reset
git add example.js
git commit
git checkout .
git clean -f -d
git checkout my_branch
git merge master
git stash pop
master
いずれにしても最終的にはそれを行う必要があるため、ブランチにマージすることから始めます。今が競合を解決するのに最適なタイミングです。
の-u
オプション(別名--include-untracked
)を使用git stash -u
すると、後でgit clean -f -d
内で実行したときに、追跡されていないファイルが失われるのを防ぐことができますmaster
。
後はgit checkout master
、あなたがしないことが重要であるgit stash pop
あなたは、後でこのスタッシュが必要になりますので、。で作成されたスタッシュをポップmy_branch
しgit stash
てmaster
から実行すると、後でそのスタッシュをに適用するときに、不要なマージ競合が発生しますmy_branch
。
git reset
から生じるすべてのステージを解除しますgit stash apply
。たとえば、スタッシュで変更されたが、存在しないファイルmaster
は、「削除された」という競合としてステージングされます。
git checkout .
そしてgit clean -f -d
、コミットされていない廃棄すべて:追跡されたファイルへのすべての変更、およびすべての人跡未踏のファイルとディレクトリ。それらは既にスタッシュに保存されており、そのままにしておくと、master
に切り替えたときに不要なマージの競合が発生しmy_branch
ます。
最後git stash pop
は元のに基づいているmy_branch
ため、マージの競合は発生しません。ただし、マスターにコミットした追跡されていないファイルがstashに含まれている場合、gitは「追跡されていないファイルをstashから復元できませんでした」というメッセージを表示します。この競合を解決するには、あなたの作業ツリー、その後からそれらのファイルを削除してgit stash pop
、git add .
とgit reset
。