デタッチされたヘッドで行われたコミットをどうするか


279

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)

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

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



この状態のコミットツリーのスクリーンショット(デタッチされたヘッドでのコミットが実際にgitkまたはSourceTreeでどのように見えるか)を追加できます。これにより、この質問がさらによくなります。
florisla

残念ながら現時点ではできませんが、ご提供いただける場合は、こちらで確認させていただきます。それが引き分けでなければならない場合でも、それはそれをより明確にします
ベンゼン

回答:


476

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

git branch my-temporary-work
git checkout master
git merge my-temporary-work

12
将来、ヘッドの取り外しをどのように回避しますか?
ycomp 2016年

私はこれをしました、そして、5つのコミットによって起源より先に自分自身を見つけました。その場合、git push originを実行するだけですか?
Winnemucca

5
奇妙なことに、「すでに最新の状態です」と表示されます。my-temporary-workをマージするとき
Robert Sinclair

10
「git branch -d my-temporary-work」を使用してmy-temporary-workを削除することを忘れないでください
レプトン船長2017

5
@ycomp "detached head"は、古いコミットのファイルを編集してから、ブランチなしでそれらをコミットして、後でこの新しいコミットを参照するときに発生します。ヘッドの分離を避けるために、古いコミットをチェックアウトしないでください。そこからすべてのファイルが必要な場合は、新しいコミットとして、コミット自体ではなく、コミットからディレクトリをチェックアウトできます。この回答を参照してください
lucidbrot 2017

96

このようなことができます。

# 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}

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


4
これは数年後のことですが、この回答に感謝します。一時的なブランチを残したくなかったので、ここで承認された回答で自分が検索を完了したとは考えていませんでした。
ジェレミープライドモア2014年

8
コマンドを使用するgit merge HEAD@{1}場合は、おそらくそれを使用して使用するコマンドであることを確認する必要がありますgit reflog
Michael Stramel

3
HEAD @ {1}をマージできることで、マスターを事前に事前にチェックアウトしていたので、私の命が救われました。
2016

奇妙なことに、「すでに最新の状態です」と表示されます。tmpをマージするとき(ただし、ファイルは異なります)
Robert Sinclair '22

18

これは私がやったことです:

基本的には、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

それだけです。


1
他の人がしなかったところ、この答えは私にとってはうまくいった。git checkout -b new-branch私のために働いた。他の提案でgit branch new-branchはが必要でしたが、それでも私はまだ切り離されたままで、新しいブランチは私の変更を受け入れませんでした。
ジェシーパテル

17

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

Ryan Stewartによって提案されているように、現在のHEADからブランチを作成することもできます。

git branch brand-name

または単にタグ:

git tag tag-name

あなたは、あなたによって切り離さ頭に番号をコミット見つけることができますgit rev-parse HEAD
コギ

6

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

git branch  temp
git checkout master
git merge temp

3

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

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

これでブランチを書き直すので、これらの変更でだれにも邪魔しないようにしてください。デタッチされたHEAD状態のより良い図解については、この記事を必ずご覧ください 。


1

たぶん、最善の解決策ではないかもしれませんが(履歴を書き換えるでしょう)、そうすることもできますgit reset --hard <hash of detached head commit>

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.