web-dev-qa-db-ja.com

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

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

これはサブモジュールで作業しているときによく起こりますが、私はそれを解決することができますが、プロセスは退屈であり、これを行うにはもっと簡単な方法がなければならないと考えていました。

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

184
Erik B

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

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
189
araqnid

これは私を助けた

git checkout -b newbranch
git checkout master
git merge newbranch
git branch -d newbranch
154
babay
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
22
m_messiah

ここから別の道を離れる

git branch newbranch
git checkout master 
git merge newbranch 
11
Observer

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

追加するために編集:

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

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

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

git checkout master
9
Abizern

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

git checkout existing_branch_name

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

git checkout -b new_branch_name

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

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

4
Erik B

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

git rebase HEAD master
git checkout master

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


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

git checkout master

その後、GitはデタッチされたコミットのSHA1を表示する必要があります。

git cherry-pick YOURSHA1

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

git merge YOURSHA1

異なるブランチからのコミットをすべて表示するには(確実にそれらを確認するため)、git reflogを実行します。

2
kenorb

2012年にbabayに言ったのは知っています。誰かがブランチに参加してコミットしていないことに気付かないとは思いませんでした。これはちょうど私に起こったので、私は間違っていたことを認めなければならないと思いますが、これが私に起こるまで2016年までかかったことを考えると、あなたはそれが実際にありそうもないと主張することができます。

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

git checkout some-branch
git merge commit-sha

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

git reflog
0
Erik B

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

以下を実行することで、これを新しいmasterにコミットさせることができます。

git branch -f master HEAD
git checkout master

これはmasterを強制的に更新してHEADを指すようにし(masterを使用せずに)、masterに切り替えます。

0
Ian