私は自分の作業ディレクトリに変更を加えることがありますが、これらの変更は現在のものとは異なるブランチでコミットされるべきであることを実感します。これは通常、私が新しいことを試したりテストをしたりしたときに新しいブランチを作成するのを忘れたときに起こりますが、ダーティコードをマスターブランチにコミットしたくはありません。
それでは、 コミットされていない変更(またはインデックスに格納されている変更)を現在のブランチとは別のブランチにコミットするにはどうすればよいですか。
他の答えは、他のブランチをチェックアウトしてからコミットすることを提案するもので、ローカルの変更を考慮してチェックアウトが可能な場合にのみ機能します。そうでなければ、あなたはgit stash
の最も一般的なユースケースにいます:
git stash
git checkout other-branch
git stash pop
最初のstash
はあなたの変更を隠し(基本的には一時的なコミットを行います)、その後のstash pop
はそれらを再適用します。これによりgitはマージ機能を利用することができます。
あなたが隠し場所を破ろうとするとき、あなたはマージ衝突に遭遇するならば...次のステップはそれらの衝突が何であるかによって異なります。隠された変更がすべて他のブランチに実際に属している場合は、単にそれらをソートする必要があります - それは間違ったブランチに変更を加えた結果です。
一方で、あなたが本当にめちゃくちゃにしていて、あなたの作業ツリーが2つのブランチのための変更の混合を持っていて、そして衝突があなたが元のブランチに戻したいものだけにあるなら、あなたはいくらかの作業を保存できます。いつものように、これを行う方法はたくさんあります。これは、ポップして競合が発生した後から始まるものです。
# Unstage everything (warning: this leaves files with conflicts in your tree)
git reset
# Add the things you *do* want to commit here
git add -p # or maybe git add -i
git commit
# The stash still exists; pop only throws it away if it applied cleanly
git checkout original-branch
git stash pop
# Add the changes meant for this branch
git add -p
git commit
# And throw away the rest
git reset --hard
あるいは、これが起こることを前もって認識している場合は、単に現在のブランチに属するものをコミットしてください。いつでも戻ってそのコミットを修正できます。
git add -p
git commit
git stash
git checkout other-branch
git stash pop
そしてもちろん、これには少し手間がかかりますが、次回は、bashrcのPS1に$(__git_ps1)
を追加して、現在のブランチ名をプロンプトに表示することで回避することを忘れないでください。 (例えばBashの Git docsを見てください。)
新しいブランチを作成してそれに切り替えるだけです。変更をコミットしてください。
git branch dirty
git checkout dirty
// And your commit follows ...
あるいは、既存のブランチ(単にgit checkout <name>
)をチェックアウトすることもできます。ただし、衝突がない場合に限ります(編集されたすべてのファイルのベースは現在のブランチと同じです)。それ以外の場合は、メッセージが表示されます。
git checkout my_other_branch
git add my_file my_other_file
git commit -m
そしてあなたのコミットメッセージを入力してください。