Git:「現在どのブランチにもありません。」変更を維持しながらブランチに戻る簡単な方法はありますか?


201

だから私はリポジトリでいくつかの作業をしました、そしてコミットしようとしているとき、私は現在どのブランチにもいないことに気付きます。

これはサブモジュールで作業するときによく起こりますが、解決することはできますが、プロセスは面倒で、これを行う簡単な方法があるはずだと考えていました。

変更を維持しながらブランチに戻る簡単な方法はありますか?

回答:


213

コミットしていない場合:

git stash
git checkout some-branch
git stash pop

コミットしてから何も変更していない場合:

git log --oneline -n1 # this will give you the SHA
git checkout some-branch
git merge ${commit-sha}

コミットして追加の作業を行った場合:

git stash
git log --oneline -n1 # this will give you the SHA
git checkout some-branch
git merge ${commit-sha}
git stash pop

16
これは、すでにコミットしている場合は役に立ちません。質問では指定されていなかったため、反対投票はありません。
ディーンではなく

24
すでにコミットしている場合:行ったコミットのハッシュ(git showまたはを使用git rev-parse HEAD)をメモし、ブランチに切り替えてからgit cherry-pick、コミットハッシュを続けます。
araqnid 2012年

7
コミットされた場合、最後のコミットのハッシュを取得します。目的のブランチをチェックアウトしますgit merge _hash_
Daniel

本当に注意してください。変更をコミットし、次の手順を実行した場合...「ブランチとオリジン/マスターが分岐しています」というメッセージが表示されます。
thinkanotherone

1
@thinkanotheroneすでに変更をコミットしている場合は、何も隠しておく必要はなく、別のブランチをチェックアウトすることは世界の終わりではありません。作成したコミットはまだそこにあり、を使用してそのブランチにマージできますgit merge <hash-of-the-commit-you-just-made>
エリックB

160

これは私を助けました

git checkout -b newbranch
git checkout master
git merge newbranch
git branch -d newbranch

25
すでに複数のコミットを行っている場合は、これを行う必要があります。
ベンジャミンオークス

試したことはありませんが、うまくいくようです。しかし、それはありそうもないシナリオだと思います。ほとんどの人は、コミットして承認済みの回答を使用してそれを修正する前に、ブランチにいないことに気付くと思います。
エリックB

49
あなたは驚かれることでしょう。
エリック

@ErikBブランチにいないようなものがあることさえ知りませんでした。この回答は私にとって非常に役に立ちました。
Konstantin Schubert、

2
GITの初心者として遭遇する他のほとんどすべてとは異なり、素敵な答えは、実際に入力して機能しただけです。newbranchは任意の名前であり、コミットハッシュで置き換えることを意図していないことを指摘したいと思います
Toni Leigh

22
git checkout master

これは次のような結果になります。

Warning: you are leaving 2 commits behind, not connected to
any of your branches:

1e7822f readme
0116b5b returned to clean django

If you want to keep them by creating a new branch, this may be a good time to do so with:
git branch new_branch_name 1e7822f25e376d6a1182bb86a0adf3a774920e1e

それで、やってみましょう:

git merge 1e7822f25e376d6a1182bb86a0adf3a774920e1e

私は試しませんでしたが、うまくいくようです。git gcこれらの2つのコマンドを実行する間に実行すると、コミットは失われますが、git gc自動的に実行しない限り、これはかなりリスクのないアプローチになるはずです。私はまだbabayの答えで行きますが、もしあなたが2つの追加のコマンドを書くことから自分を救いたければ、私はこれが行く方法だと思います。
エリックB

私はある時点でマスターブランチを離れていましたが、それは完全にはわかりません。変更をコミットしましたが、マスターに変更はありませんでした。これらの指示により、masterブランチに変更が加えられ、すべてがうまくいきました。
Matti Jokipii 2013

+1コミットを残して別のブランチをチェックアウトすることに不安を感じていました。このメッセージを見て、自信を持ってそれを実行できるようになりました。
J-Dizzle 2015年

11

ここで別の道を離れる

git branch newbranch
git checkout master 
git merge newbranch 

3
@ErikB彼は複数のコミットを行った可能性があります。その場合は、babayの回答を参照してください。
ベンジャミンオークス

@BenjaminOakesそうかもしれませんが、これらのgitコマンドは有効ではありません。
エリックB

@ErikB間違いなく真実です。:)バベイの答えは、アレックスがやろうとしていたことの有効な形です。
ベンジャミンオークス

9

または、サブモジュールをセットアップして、デフォルトの切り離されたヘッド状態ではなく、ブランチをチェックアウトすることもできます。

追加するように編集:

1つの方法は、-bフラグを使用してサブモジュールを追加するときに、サブモジュールの特定のブランチをチェックアウトすることです。

git submodule add -b master <remote-repo> <path-to-add-it-to>

もう1つの方法は、サブモジュールディレクトリに移動してチェックアウトすることです。

git checkout master

1
その方法を教えてもらえますか?
エリックB

既存のサブモジュールをこのデフォルトのブランチモードで更新する方法はありますか?gitmodulesおそらく更新?
ヘルツェルギネス

@HertzelGuinness本当にそうではありません。サブモジュールは特定のコミットshaでチェックアウトされます。ブランチは単にshaへのポインタであり、それが指すshaは変更できます。チェックアウトされたサブモジュールの状態を凍結しないため、これは役に立ちません。ブランチをチェックアウトすることは、サブモジュールに変更を加える場合に便利です。
アビゼルン

5

この状況に陥る1つの方法は、リモートブランチからリベースを実行した後です。この場合、新しいコミットがで指されHEADますがmaster、それらを指していない-それはあなたが他のブランチをリベースする前にそれがあったどこを指しています。

あなたはこれをあなたの新しいmasterものにすることができます:

git branch -f master HEAD
git checkout master

これによりmasterHEAD(あなたを入れずにmaster)を指すように強制的に更新され、次にに切り替わりますmaster


必要に応じて完全に機能しました。私はすでにファイルをステージングしてコミットしましたが、上記のエラーのためにプッシュできませんでした。上記の2行のコードは完全に正常に動作し、期待どおりに私のコードをプッシュしました。
invinciblemuffi

4

私は最近再びこの問題に遭遇しました。私が最後にサブモジュールを操作してからしばらく経ちましたが、gitについてさらに学んだので、コミットしたいブランチをチェックアウトするだけで十分であることに気付きました。Gitは、隠しておかなくても作業ツリーを保持します。

git checkout existing_branch_name

新しいブランチで作業したい場合、これはあなたのために働くはずです:

git checkout -b new_branch_name

作業ツリーで競合がある場合、チェックアウトは失敗しますが、それは非常に珍しいはずであり、それが発生した場合、それを隠しておき、ポップして競合を解決できます。

受け入れられた回答と比較して、この回答は2つのコマンドの実行を節約します。実行にそれほど時間がかかりません。したがって、現在受け入れられている回答よりも奇跡的に多くの投票(または少なくとも近い)が得られない限り、私はこの回答を受け入れません。


2

次の方法が機能する場合があります。

git rebase HEAD master
git checkout master

これにより、現在のHEADの変更がマスターの上にリベースされます。その後、ブランチを切り替えることができます。


別の方法は、最初にブランチをチェックアウトすることです:

git checkout master

次に、Gitは分離されたコミットのSHA1を表示するはずです。次に、それらをチェリーピックできます。例:

git cherry-pick YOURSHA1

または、最新のものをマージすることもできます:

git merge YOURSHA1

さまざまなブランチからのすべてのコミットを確認するには(確実にコミットするため)、次のコマンドを実行しますgit reflog


0

2012年にbabayに言ったのは知っていますが、誰かがブランチにいてコミットしていないことを誰かが気付かない可能性は低いと思いました。これはたまたま私に起こったことなので、私が間違っていたことを認めざるを得ないのではないかと思いますが、これが私に起こるまでに2016年までかかったことを考えると、それは実際はありそうもないことであると主張できます。

とにかく、新しいブランチを作成することは私の意見では行き過ぎです。あなたがしなければならないすべてはです:

git checkout some-branch
git merge commit-sha

他のブランチをチェックアウトする前にcommit-shaをコピーしなかった場合は、次のコマンドを実行して簡単に見つけることができます。

git reflog

それは一人の男性にとっては珍しい(ありそうもない)問題です。それは2012年以来私には起こりませんでした。しかし、可能性をgit-usersの量に掛ければ...それは非常にありそうです。それは誰かに毎日起こるかもしれません。:)
バベイ2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.