そのため、リポジトリでいくつかの作業を行いましたが、コミットしようとすると、現在どのブランチにもいないことに気付きます。
これはサブモジュールで作業しているときによく起こりますが、私はそれを解決することができますが、プロセスは退屈であり、これを行うにはもっと簡単な方法がなければならないと考えていました。
変更を維持しながらブランチに戻る簡単な方法はありますか?
コミットしていない場合:
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
これは私を助けた
git checkout -b newbranch
git checkout master
git merge newbranch
git branch -d newbranch
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 branch newbranch
git checkout master
git merge newbranch
または、サブモジュールをセットアップして、デフォルトの分離ヘッド状態ではなく、ブランチをチェックアウトすることもできます。
追加するために編集:
1つの方法は、-bフラグでサブモジュールを追加するときに、サブモジュールの特定のブランチをチェックアウトすることです。
git submodule add -b master <remote-repo> <path-to-add-it-to>
別の方法は、サブモジュールのディレクトリに移動してチェックアウトすることです
git checkout master
私は最近、この問題に再び遭遇しました。私が最後にサブモジュールを使って作業してからgitについてもっと学んでからしばらくして、コミットしたいブランチをチェックアウトするだけで十分であることに気付きました。 Gitは、隠していない場合でも作業ツリーを保持します。
git checkout existing_branch_name
新しいブランチで作業したい場合、これはあなたのために働くはずです:
git checkout -b new_branch_name
作業ツリーで競合がある場合、チェックアウトは失敗しますが、それは非常に珍しいことであり、発生した場合は、それを隠してポップし、競合を解決できます。
受け入れられた回答と比較すると、この回答は2つのコマンドの実行を節約します。とにかく実行にそれほど時間がかかりません。したがって、現在受け入れられている回答より奇跡的に多くの(または少なくとも近い)賛成を得ない限り、私はこの回答を受け入れません。
次の方法が機能する場合があります。
git rebase HEAD master
git checkout master
これにより、現在のHEAD変更がマスターの上にリベースされます。その後、ブランチを切り替えることができます。
別の方法は、最初にブランチをチェックアウトすることです:
git checkout master
その後、GitはデタッチされたコミットのSHA1を表示する必要があります。
git cherry-pick YOURSHA1
または、最新のものをマージすることもできます。
git merge YOURSHA1
異なるブランチからのコミットをすべて表示するには(確実にそれらを確認するため)、git reflog
を実行します。
2012年にbabayに言ったのは知っています。誰かがブランチに参加してコミットしていないことに気付かないとは思いませんでした。これはちょうど私に起こったので、私は間違っていたことを認めなければならないと思いますが、これが私に起こるまで2016年までかかったことを考えると、あなたはそれが実際にありそうもないと主張することができます。
とにかく、新しいブランチを作成することは私の意見ではやり過ぎです。あなたがしなければならないのは:
git checkout some-branch
git merge commit-sha
他のブランチをチェックアウトする前にcommit-shaをコピーしなかった場合は、次を実行して簡単に見つけることができます。
git reflog
この状況に陥る1つの方法は、リモートブランチからリベースを実行した後です。この場合、新しいコミットはHEAD
によってポイントされますが、master
はそれらをポイントしません。他のブランチをリベースする前の場所を指します。
以下を実行することで、これを新しいmaster
にコミットさせることができます。
git branch -f master HEAD
git checkout master
これはmaster
を強制的に更新してHEAD
を指すようにし(master
を使用せずに)、master
に切り替えます。