さて、ある日、大量の変更を加えてコミットしようとしたときに、間違ったブランチで作業していたことに気付いたとします。
ローカルの変更を破棄せずに、 git にブランチを切り替えるよう強制するにはどうすればよいでしょうか。
おそらく、返事を待つ間、素朴な方法で対処するつもりですが、これまでこのようなことが起きたことがないと言ったら嘘になるので、正しい手順があるかどうか知りたいです...
- 変更されたリポジトリをバックアップする
git reset --hard
git checkout right-branch
- 変更を復元する
git commit -m "changes"
ベストアンサー1
どのくらい進んでいるか、どのブランチに配置したいかに応じて、さまざまな方法があります。
典型的な間違いを例に挙げてみましょう。
$ git checkout master
... pause for coffee, etc ...
... return, edit a bunch of stuff, then: oops, wanted to be on develop
そこで、まだ にコミットしていないこれらの変更をmaster
に反映させたいと考えていますdevelop
。
まだを持っていない場合
develop
、方法は簡単です:$ git checkout -b develop
これにより、現在の場所から始まる新しい
develop
ブランチが作成されます。これでコミットでき、新しいものがすべて に反映されますdevelop
。があります。
develop
何もせずに Git で切り替えられるかどうかを確認します。$ git checkout develop
これは成功するか、エラーが出るかのどちらかです。成功した場合は素晴らしいです! コミットするだけです。成功しない場合 (
error: Your local changes to the following files would be overwritten ...
) でも、まだ多くのオプションがあります。おそらく最も簡単なのは
git stash
(私より先にクリックした他の回答者全員がpost言ったように) 、git stash save
またはgit stash push
、1、または単に/git stash
の短縮形を実行することです。save
push
$ git stash
これは奇妙な非ブランチ方式を使用してコードをコミットします (はい、実際にいくつかのコミットを行います)。コミットはどのブランチにも「存在しない」ものの、リポジトリに安全に保存されるので、ブランチを切り替えて、スタッシュを「適用」できます。
$ git checkout develop Switched to branch 'develop' $ git stash apply
すべてがうまくいって、結果に満足したら、
git stash drop
stash を実行してください。これにより、奇妙な非ブランチ コミットへの参照が削除されます。(それらはまだリポジトリ内に残っており、緊急時には取得できる場合もありますが、ほとんどの場合、その時点で削除されたと見なす必要があります。)
このapply
ステップでは、ブランチのマージを行うときに使用するのと同じ種類の Git の強力な基礎マージ機構を使用して、スタッシュされた変更のマージを行います。つまり、誤って作業していたブランチが、作業しようとしていたブランチと十分に異なる場合、「マージ競合」が発生する可能性があります。そのため、Git 自体がマージ競合を検出しなかった場合でも、スタッシュが適切に適用されたと想定する前に、結果を注意深く検査することをお勧めします。
多くの人が を使用しますgit stash pop
。これは の省略形ですgit stash apply && git stash drop
。これは、ある程度は問題ありませんが、アプリケーションの結果が混乱し、このパスに進みたくないと判断した場合、スタッシュを簡単に取り戻すことができないことを意味します。そのため、満足できる場合にのみapply
、 を分離して結果を検査することをお勧めしますdrop
。(もちろん、これにより、もう一度コーヒーブレイクを取って何をしていたかを忘れ、戻ってきて間違ったことをしてしまうという別の問題が発生するため、完璧な解決策ではありません。)
1 insave
は、git stash save
新しいスタッシュを作成するための古い動詞です。Git バージョン 2.13 では、pop
作成コマンドとの一貫性を高め、より多くのオプションを追加するために、新しい動詞が導入されました。Git バージョン 2.16 では、古い動詞は正式に非推奨になりました (ただし、この記事を編集している時点での最新リリースである Git 2.23 ではまだ動作します)。