ローカルの変更を破棄せずにgit switchブランチ


181

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

ローカルの変更を破棄せずに gitにブランチを強制的に切り替えるにはどうすればよいですか。

返事を待つ間、私はこれについて素朴な方法で行くつもりですが、これが私に以前に起こったことがないと言った場合、私は嘘をついているので正しい手順があるかどうか知りたいです...

  • バックアップがリポジトリを変更しました
  • git reset --hard
  • git checkout right-branch
  • 変更を復元
  • git commit -m "changes"

回答:


342

あなたがどれだけ進んでいるか、そしてあなたがそれらに望むブランチに応じて、たくさんの異なる方法があります。

古典的な間違いを考えてみましょう:

$ 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 saveor git stash push1、または/のgit stash省略形である単なるプレーンを実行します。savepush

    $ git stash
    

    これは、奇妙な非分岐yメソッドを使用してコードをコミットします(はい、実際にはいくつかのコミットを行います)。コミットはどのブランチにも「オン」ではありませんが、リポジトリに安全に保存されるようになったため、ブランチを切り替えて、スタッシュを「適用」できます。

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

    すべてがうまく行き、結果が気に入ったらgit stash drop、隠しておくべきです。これにより、ブランチ以外の奇妙なコミットへの参照が削除されます。(それらはまだリポジトリー内にあり、緊急時に取得できることもありますが、ほとんどの目的で、それらがその時点でなくなったと考える必要があります。)

このapplyステップでは、Gitの強力な基礎となるマージ機構を使用して、隠された変更をマージします。ブランチマージを実行するときに使用するのと同じ種類の処理です。つまり、誤って作業していたブランチが、意図していたブランチと十分に異なる場合、「マージの競合」が発生する可能性があります。したがって、Git自体がマージの競合を検出しなかった場合でも、スタッシュが適切に適用されていると想定する前に、結果を注意深く検査することをお勧めします

多くの人がを使用していますgit stash pop。これはの省略形ですgit stash apply && git stash drop。それはそれで問題ありませんが、アプリケーションが混乱して、この道を進みたくないと決めた場合、隠しておくことは簡単にはできません。そのため、満足した場合のみ、apply結果を個別に検査することをお勧めしdropます。(もちろん、これは別のコーヒー休憩を取り、あなたがやっていたことを忘れて戻ってきて、間違ったことをすることができる別のポイントを導入するので、それは完全な治療法ではありません。)


1save内にはgit stash save、新たなスタッシュを作成するための古い動詞です。Gitバージョン2.13では、新しい動詞が導入され、より一貫性をpop保ち、作成コマンドにオプションを追加できるようになりました。Gitバージョン2.16は古い動詞を正式に非推奨にしました(ただし、私がこれを編集しているときの最新リリースであるGit 2.23では引き続き機能します)。


3
現在のブランチにコミットせずに別のブランチに切り替えて(たとえば、変更が完了していないなど)、後で切り替えて続行したい場合はどうなりますか?
stt106 2017年

@ stt106:まだコミットする必要がありますが、これと他の回答のgit stashように、コミットを行うことができます。これにより、コミット(通常の配置ではstashエントリごとgit stash2つのコミットが取得されます)がブランチ上にありません。ただし、非常に短期間の特別な場合を除いて、通常は通常のコミットを行うことを好みます。次のことができますgit reset --softまたはgit reset --mixed後で、または使用git commit --amendそのブランチで作業をするとき、あなたがしている背中、脇にそれを突き出すします。(最新のGitではgit worktree add、さらに優れたソリューションであるを使用することもできます。)
torek

「これは成功するか、不平を言うでしょう。」チェックアウトを行う際の成功またはエラーの理由はどれですか?
nanocv


<a>ブランチで上記のステップに切り替えて変更を行うと、ローカルのすべての変更が失われ、<b>ブランチに移動してすべての変更をプッシュしたいと思います。git stashを実行して他のブランチに移動すると、<b>ブランチのすべてのファイルがプルされ、ローカルの変更が失われます
Mukul Munjal

38

git stashを使用する

git stash

変更をスタックにプッシュします。引き戻したい時は

 git stash apply

個々のアイテムを引き出すこともできます。スタッシュを完全に吹き飛ばすには:

 git stash clear

7
最後のコマンドはたぶんgit stash drop; git stash clearこのコマンドのセットに関係のない可能性があるスタッシュを含め、スタッシュスタック全体を一掃します。
Leland

15
  • git stash コミットされていない変更を保存するには
  • git stash list 保存されているコミットされていないスタッシュを一覧表示するには
  • git stash apply stash@{x} ここで、xは0、1、2の場合があります。

4

次のいずれかを実行できます。

  • git stash変更を保留するために使用するか、

  • 別のブランチを作成して変更をそこにコミットし、そのブランチを作業ディレクトリにマージします

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.