1. ホーム
  2. ギット

[解決済み】Gitで現在の変更を別のブランチにコミットする方法【重複あり

2022-03-23 20:26:18

質問

時々、自分の作業ディレクトリに変更を加えることがありますが、その変更は現在のブランチとは別のブランチにコミットする必要があることに気づきます。これは、新しいことを試したりテストをしたりするときに、事前に新しいブランチを作成するのを忘れてしまい、かといって汚いコードを master ブランチにコミットしたくはないという場合によく起こります。

だから コミットされていない変更 (あるいはインデックスに保存されている変更) を、現在のブランチとは別のブランチにコミットするにはどうしたらいいのでしょうか?

解決方法は?

他のブランチをチェックアウトしてからコミットするという提案は、ローカルの変更を考慮した上でチェックアウトが可能である場合にのみ有効です。そうでない場合、あなたは最も一般的な 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

そしてもちろん、この作業には少しばかり手間がかかることを忘れずに、次回はこれを避けるために、プロンプトに現在のブランチ名を入れて $(__git_ps1) PS1 環境変数で バッシュラック ファイルに記述します。(例えば BashでGit のドキュメントを参照してください)。