1. ホーム
  2. ギット

[解決済み】ローカルでの変更を破棄せずにgitでブランチを切り替える。

2022-04-02 04:56:54

質問

さて、ある日たまたまたくさんの修正を行い、それをコミットしようとしたときに、間違ったブランチで作業していたことに気づいたとします。

git に強制的にブランチを切り替えさせるには ローカルの変更を破棄せずに .

返信を待つ間、おそらく素朴な方法で行くことになると思いますが、今までこんなことがなかったと言えば嘘になるので、正しい手順があれば教えていただきたいです...。

  • 変更したレポのバックアップ
  • git reset --hard
  • git checkout right-branch
  • 変更点の復元
  • git commit -m "changes"

解決方法は?

どの程度進んでいるのか、どの枝に配置したいのかによって、さまざまな方法があります。

典型的な失敗例を挙げてみましょう。

$ git checkout master
... pause for coffee, etc ...
... return, edit a bunch of stuff, then: oops, wanted to be on develop

では、まだコミットしていない次のような変更をしたいと思います。 master にある。 develop .

  1. もし、あなたが を持っていない a develop を使うことができますが、この方法は簡単です。

    $ git checkout -b develop
    
    

    これは、新しい develop ブランチは、あなたが今いるところから始まります。 今すぐ これでコミットすることができ、新しいものはすべて develop .

  2. あなたは があります。 a develop . Git が何もせずに切り替えられるかどうか見てみましょう。 を実行します。

    $ git checkout develop
    
    

    これは成功するか、文句を言われるかのどちらかです。 もし成功すれば、素晴らしいことです。 ただ をコミットします。 そうでない場合 ( error: Your local changes to the following files would be overwritten ... ), you まだ は、多くの選択肢を持っています。

    最も簡単なのは、おそらく git stash (他の回答者の皆さんもそうですが をクリックするのを先越されました。 ポスト と言っています)。 実行する 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 をスタッシュします。 これにより、ブランチでない奇妙なコミットへの参照が削除されます。 (これらはまだリポジトリに残っており、緊急時には取り出すことができますが、ほとんどの場合、この時点で削除されたと考えるべきでしょう)。

その apply ステップでは、隠した変更をマージします。このとき、Git の強力なマージ機構、つまりブランチマージをするときに使うものと同じものを使います。 これは、誤って作業していたブランチが、作業するつもりだったブランチと十分に異なっていた場合に、quot;merge conflict"が発生する可能性があることを意味します。 ですから、以下のようにするとよいでしょう。 結果をよく確認する スタッシュがきれいに適用されたと思い込む前に。 たとえGit自身がマージの衝突を検出しなかったとしてもです。

多くの人が git stash pop の略称です。 git stash apply && git stash drop . しかし、このままでは、アプリケーションの不具合が発生し、このままではいけないと思ったときに、簡単に隠し場所を取り戻せないことになります。 そのため、私は別の apply は、結果を検査する。 drop 満足したときだけ。 (もちろん、ここでまたコーヒー休憩を取り、何をしていたのか忘れ、戻って来てから いけない ということで、完璧な治療法ではありません)。


1 savegit stash save は、新しいスタッシュを作成するための古い動詞です。 Git バージョン 2.13 では、新しい動詞を導入して pop と、作成コマンドにオプションを追加するためです。 Git バージョン 2.16 では、古い動詞は正式に非推奨となりました (ただし、この記事を編集している時点の最新リリースである Git 2.23 ではまだ動作します)。