回答:
コミットしていない場合:
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 show
またはを使用git rev-parse HEAD
)をメモし、ブランチに切り替えてからgit cherry-pick
、コミットハッシュを続けます。
git merge _hash_
git merge <hash-of-the-commit-you-just-made>
。
これは私を助けました
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 gc
これらの2つのコマンドを実行する間に実行すると、コミットは失われますが、git gc
自動的に実行しない限り、これはかなりリスクのないアプローチになるはずです。私はまだbabayの答えで行きますが、もしあなたが2つの追加のコマンドを書くことから自分を救いたければ、私はこれが行く方法だと思います。
ここで別の道を離れる
git branch newbranch
git checkout master
git merge newbranch
または、サブモジュールをセットアップして、デフォルトの切り離されたヘッド状態ではなく、ブランチをチェックアウトすることもできます。
追加するように編集:
1つの方法は、-bフラグを使用してサブモジュールを追加するときに、サブモジュールの特定のブランチをチェックアウトすることです。
git submodule add -b master <remote-repo> <path-to-add-it-to>
もう1つの方法は、サブモジュールディレクトリに移動してチェックアウトすることです。
git checkout master
gitmodules
おそらく更新?
この状況に陥る1つの方法は、リモートブランチからリベースを実行した後です。この場合、新しいコミットがで指されHEAD
ますがmaster
、それらを指していない-それはあなたが他のブランチをリベースする前にそれがあったどこを指しています。
あなたはこれをあなたの新しいmaster
ものにすることができます:
git branch -f master HEAD
git checkout master
これによりmaster
、HEAD
(あなたを入れずにmaster
)を指すように強制的に更新され、次にに切り替わります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