[解決済み】ローカルでの変更を破棄せずにgitでブランチを切り替える。
質問
さて、ある日たまたまたくさんの修正を行い、それをコミットしようとしたときに、間違ったブランチで作業していたことに気づいたとします。
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
.
-
もし、あなたが を持っていない a
develop
を使うことができますが、この方法は簡単です。$ git checkout -b develop
これは、新しい
develop
ブランチは、あなたが今いるところから始まります。 今すぐ これでコミットすることができ、新しいものはすべてdevelop
. -
あなたは があります。 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
は
save
で
git stash save
は、新しいスタッシュを作成するための古い動詞です。 Git バージョン 2.13 では、新しい動詞を導入して
pop
と、作成コマンドにオプションを追加するためです。 Git バージョン 2.16 では、古い動詞は正式に非推奨となりました (ただし、この記事を編集している時点の最新リリースである Git 2.23 ではまだ動作します)。
関連
-
[解決済み] Git で直近のローカルコミットを取り消すには?
-
[解決済み] Gitブランチをローカルやリモートで削除するには?
-
[解決済み] リモートのGitブランチをチェックアウトするには?
-
[解決済み] 現在のGit作業ツリーからローカル(未追跡)ファイルを削除する方法
-
[解決済み] Git で、ステージされていない変更を破棄するにはどうしたらいいですか?
-
[解決済み] 新しいローカルブランチをリモートの Git リポジトリにプッシュし、それを追跡するにはどうすればよいのでしょうか?
-
[解決済み】"git pull" でローカルファイルを強制的に上書きするには?
-
[解決済み] Git で最新のコミットを新しいブランチに移動する
-
[解決済み】既存のGitブランチをリモートブランチに追従させる?
-
[解決済み】ローカルのGitブランチの名前を変更するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】ローカルにない作業がリモートに含まれているため、アップデートが拒否された
-
[解決済み] git pull リモートブランチがリモートの参照先を見つけることができない
-
[解決済み] git rebase fatal: 必要なリビジョンは1つです。
-
[gitコミット失敗の解決] 現在のブランチの先端が後ろにあるため、更新が拒否されました。
-
git push reports an error ! [リモート拒否] master -> master (受信前のフックが拒否されました)
-
git revert + git rebase 一度に複数のコミット_本然233的博客程式员息信网_git revert Multiple
-
[解決済み] VSTS Git Fetch Failed with exit code: 128
-
[解決済み] GitのFETCH_HEADとはどういう意味ですか?
-
[解決済み] 新しいBitbucketでリポジトリを削除するにはどうすればよいですか?
-
[解決済み] 現在のブランチにコミットされていない変更がある場合、別のブランチをチェックアウトする