ローカルの変更を破棄せずにgitのブランチを切り替える 質問する

ローカルの変更を破棄せずにgitのブランチを切り替える 質問する

さて、ある日、大量の変更を加えてコミットしようとしたときに、間違ったブランチで作業していたことに気付いたとします。

ローカルの変更を破棄せずに、 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

  1. まだを持っていない場合develop、方法は簡単です:

    $ git checkout -b develop
    

    これにより、現在の場所から始まる新しいdevelopブランチが作成されます。これでコミットでき、新しいものがすべて に反映されますdevelop

  2. ありますdevelop何もせずに Git で切り替えられるかどうかを確認します。

    $ git checkout develop
    

    これは成功するか、エラーが出るかのどちらかです。成功した場合は素晴らしいです! コミットするだけです。成功しない場合 ( error: Your local changes to the following files would be overwritten ...) でも、まだ多くのオプションがあります。

    おそらく最も簡単なのはgit stash(私より先にクリックした他の回答者全員がpost言ったように) 、git stash saveまたはgit stash push1、または単に/git stashの短縮形を実行することです。savepush

    $ git stash
    

    これは奇妙な非ブランチ方式を使用してコードをコミットします (はい、実際にいくつかのコミットを行います)。コミットはどのブランチにも「存在しない」ものの、リポジトリに安全に保存されるので、ブランチを切り替えて、スタッシュを「適用」できます。

    $ git checkout develop
    Switched to branch 'develop'
    $ git stash apply
    

    すべてがうまくいって、結果に満足したら、git stash dropstash を実行してください。これにより、奇妙な非ブランチ コミットへの参照が削除されます。(それらはまだリポジトリ内に残っており、緊急時には取得できる場合もありますが、ほとんどの場合、その時点で削除されたと見なす必要があります。)

この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 ではまだ動作します)。

おすすめ記事