351

gitを使ってこんなものを作りました

git clone
git checkout {a rev number tree rev before} (here I started to be in a detached head state)
//hacking
git commit
//hacking
git commit
(some commit where made on origin/master)
git pull (which does complete because there was some error due to the fact that I'm no more on master)

頭を外した状態でもコミットできると言われたので、そうしました。しかし、今度は、切り離されたヘッドブランチとローカルマスターブランチをマージしてから、一連の変更をオリジン/マスターにプッシュしたいと思います。

だから私の質問は、マスターブランチを実際の状態(切り離されたヘッド)とどのようにマージできるかということです

4

11 に答える 11

589

現在の場所にブランチを作成し、マスターに切り替えてマージします。

git branch my-temporary-work
git checkout master
git merge my-temporary-work
于 2011-08-19T16:19:56.340 に答える
128

あなたはこのようなことをすることができます。

# Create temporary branch for your detached head
git branch tmp

# Go to master
git checkout master

# Merge in commits from previously detached head
git merge tmp

# Delete temporary branch
git branch -d tmp

さらに簡単になります

git checkout master
git merge HEAD@{1}

ただし、これには、間違えた場合に、切り離されたヘッドで行われたコミットを回復するのが少し難しくなる可能性があるというわずかな危険があります。

于 2011-08-19T16:22:07.333 に答える
34

これは私がしたことです:

基本的に、はdetached HEAD名前のない新しいブランチと考えてください。他のブランチと同じように、このブランチにコミットできます。コミットが完了したら、それをリモートにプッシュします。

したがって、最初に行う必要があるのは、これdetached HEADに名前を付けることです。あなたはこれにいる間、あなたはそれを好きに簡単に行うことができますdetached HEAD

git checkout -b some-new-branch

これで、他のブランチと同じようにリモートにプッシュできます。

detached HEAD私の場合、 (現在)で行ったコミットとともに、このブランチをマスターに早送りしたいとも思いましたsome-new-branch。私がしたのは

git checkout master

git pull # To make sure my local copy of master is up to date

git checkout some-new-branch

git merge master // This added current state of master to my changes

もちろん、後でそれをにマージしましたmaster

それについてです。

于 2015-10-21T21:59:13.363 に答える
21

あなたはただすることができますgit merge <commit-number>またはgit cherry-pick <commit> <commit> ...

Ryan Stewartが提案したように、現在のHEADからブランチを作成することもできます。

git branch brand-name

または単にタグ:

git tag tag-name
于 2011-08-19T16:20:02.317 に答える
13

または、commit-idをブランチにチェリーピックすることもできます。

<commit-id> made in detached head state

git checkout master

git cherry-pick <commit-id>

一時的なブランチやマージはありません。

于 2020-07-16T19:37:04.620 に答える
7

デタッチされたHEADの場合、名前付きブランチが更新されないことを除いて、コミットは通常どおりに機能します。コミットされた変更でマスターブランチを更新するには、現在の場所に一時ブランチを作成し(このように、一時ブランチには、デタッチされたHEADで行ったすべてのコミットされた変更が含まれます)、マスターブランチに切り替えて、一時ブランチを次のようにマージします。マスター。

git branch  temp
git checkout master
git merge temp
于 2016-10-30T22:51:33.750 に答える
4

ほぼ全員が、一時的なブランチを作成するソリューションを提案しているようです。ここで、この「切り離された状態でコミットされた」問題が発生するたびに、通常は1回のコミット後に検出されることを認める必要があります。そして、その1つの小さなコミットのために1つのブランチ全体を作成します-あまりにも聞こえますよね?特に、すでに多くのブランチの間を飛び回っているプロジェクトでは。

それでは簡単な方法は何ですか?コミットハッシュを使用してください!

どうすれば入手できますか?

  1. を実行しますgit log。次のようなものが表示されます。
commit 10bf8fe4d17bb7de59586a7abb6db321f0786bb3 (HEAD)
Author: Someone <someone@something.com>
Date:   So/me/day SO:ME:TI:ME 

    A commit message that doesn't mean much

commit a3cd1cedf1962916cdc2945f2bd2b271ec8b919d (origin/master, master)
Author: Someone <someone@something.com>
Date:   Some/other/day SOME:OTHER:TIME 

    Another commit message that doesn't mean much

commit 1bfabbe09c70419070fe29ff1ed276c0207bbe10
Author: Someone <someone@something.com>
Date:   Thu Jul 8 08:38:12 2021 +0530

    Enough reading the example, focus on the answer!! 

さて、それは通常の場合のように見えますが、あなたがそうするとき、git pushそれは「すべてが最新である」と言うでしょう。

注意深い人は、それが「最新」ではないことに気付くでしょう。HEADマスター以外の場所です。

  1. それで、次は何ですか?ハッシュの最初の文字をコピーするだけ10bf8fe4d1です。そして、最初に、を実行しgit checkout masterます。masterこれにより、ブランチに移動します。そして今、あなたはすでにハッシュをコピーしているので。あなたはすることができますgit merge <hash>git log今すぐやる

そしてVOILA:

commit 10bf8fe4d17bb7de59586a7abb6db321f0786bb3 (HEAD -> master)
Author: Someone <someone@something.com>
Date:   S/om/eday SO:ME:TI:ME 

    A commit message that doesn't mean much

commit a3cd1cedf1962916cdc2945f2bd2b271ec8b919d (origin/master)
Author: Someone <someone@something.com>
Date:   Some/other/day SOME:OTHER:TIME 

    Another commit message that doesn't mean much

commit 1bfabbe09c70419070fe29ff1ed276c0207bbe10
Author: Someone <someone@something.com>
Date:   Thu Jul 8 08:38:12 2021 +0530

    Enough reading the example, focus on the answer!! 

今、HEAD適切な場所にあるようです。

誰かが「ハッシュがない場合はどうなりますか?ぶら下がっているコミットについて何も知らず、ただ実行しただけです」と尋ねるかもしれませんgit checkout master。心配しないでください、私はあなたをカバーしてもらいました。コミットハッシュは次の2つの場所にあります。

  1. あなたがしたときgit checkout master、あなたはgitこのように警告していました
Warning: you are leaving 1 commit behind, not connected to
any of your branches:

  10bf8fe A commit message that doesn't mean much

If you want to keep it by creating a new branch, this may be a good time
to do so with:

 git branch <new-branch-name> 10bf8fe

Switched to branch 'master'

あなたはあなたの宝物を見ることができます(hash)、そうですか?

  1. あなたがそれを見つけることができないと私に言わないでください。そこにあります。しかし、本当にできない場合は、を行うことができますgit reflog。次のように表示されます。
a3cd1ce (HEAD -> master, origin/master) HEAD@{0}: checkout: moving from 10bf8fe4d17bb7de59586a7abb6db321f0786bb3 to master
10bf8fe HEAD@{1}: commit:  A commit message that doesn't mean much

探していた宝物があることがわかります...ハッシュ。

これは、ダングリングコミットを使用してデタッチ状態で発生する可能性のあるすべてのシナリオをカバーしていると思います。次回は気をつけて!

于 2021-07-08T09:02:56.800 に答える
3

簡単な修正は、そのコミット用の新しいブランチを作成し、それにチェックアウトすることですgit checkout -b <branch-name> <commit-hash>

このようにして、行ったすべての変更がそのブランチに保存されます。残りのコミットからマスターブランチをクリーンアップする必要がある場合は、必ず実行してgit reset --hard masterください。

これにより、ブランチを書き直すことになりますので、これらの変更で誰かを邪魔しないように注意してください。切り離されたHEAD状態のより良い図については、この記事を必ず参照してください 。

于 2018-05-07T12:42:05.870 に答える
3

実際のチェックアウト-ブランチ

git merge{{commit-hash}}

于 2021-02-03T21:46:37.180 に答える
1

おそらく最善の解決策ではありませんが(履歴を書き換えます)、実行することもできますgit reset --hard <hash of detached head commit>

于 2016-05-24T19:44:41.820 に答える
0

私がチェックアウトを行ってヘッドが外れたとき、gitは実際にそのような場合に何をすべきかを教えてくれます:

git switch -c \<new-branchname>

結果は、ヘッドをデタッチする前と同じようにマスターを離れ、デタッチされたヘッド状態での作業中に行われたすべてのコミットを含む新しいブランチを残します。

詳細を再現/テスト/理解するには:

  1. 2つのコミットでtestrepoを作成します。
~/gittest$ git log --oneline 
17c34c0 (HEAD -> master) 2
5975930 1
  1. 前のコミットをチェックアウト1

~/gittest$ git checkout 5975930

このドイツ語のメッセージが表示されます

Hinweis:Wechslezu'5975930'。

Sie befinden sich im Zustandeines'losgelöstenHEAD'。Siekönnensichumschauen、experimentelleÄnderungenvornehmenund diese committen、undSiekönnenallemöglichenCommits、die Sie in diesem Zustand machen、ohne Auswirkungen auf irgendeinen Branch verwerfen、indem Sie zu einem ander

Wenn Sie einen neuen Brancherstellenmöchten、um Ihre erstellten Commits zu behalten、könnenSiedas(jetztoderspäter)durch Nutzung von'switch' mit der Option-ctun。Beispiel:

git switch -c \<neuer-Branchname>

Oder um dieseOperationrückgängigzumachen:git switch-

SiekönnendiesenHinweisausschalten、indem Sie die Konfigurationsvariable'advice.detachedHead'auf'false'setzen。

HEAD ist jetzt bei 5975930 1

これは英語に次のように翻訳されます:

注:「5975930」に変更してください。

あなたは「切り離されたHEAD」の状態にあります。周りを見回し、実験的な変更を加えてコミットすることができます。また、別のブランチに切り替えることで、ブランチに影響を与えることなく、この状態で行った可能性のあるコミットを破棄できます。

作成したコミットを保持するために新しいブランチを作成する場合は、-cオプションを指定して「switch」を使用することで(現在または後で)それを行うことができます。例:

git switch -c <new-branch-name>.

または、この操作を元に戻すには:gitswitch-。

このヒントをオフにするには、構成変数「advice.detachedHead」を「false」に設定します。

HEADは現在59759301にあります

www.DeepL.com/Translator(無料版)で翻訳)

于 2021-06-01T15:43:48.090 に答える