Gitのデタッチヘッドを修正しますか?

2012年04月19日に質問されました。  ·  閲覧回数 1.6M回  ·  ソース

Daniel picture
2012年04月19日

リポジトリで作業をしていると、ファイルにローカルな変更があることに気づきました。 もう欲しくないので、新しいコピーをチェックアウトできると思ってファイルを削除しました。 私はGitと同等のことをしたかった

svn up .

git pullはうまくいかなかったようです。 ランダムに検索すると、誰かが勧めるサイトにたどり着きました。

git checkout HEAD^ src/

srcは、削除されたファイルを含むディレクトリです)。

今、私は頭が外れていることがわかりました。 どうすれば元に戻すことができますか?

回答

ralphtheninja picture
2012年04月19日
2307

ヘッドが切り離されているということは、ブランチに参加していないことを意味します。履歴内の1つのコミット(この場合、HEADの前のコミット、つまりHEAD ^)をチェックアウトしました。

切り離されたHEADに関連する変更を削除する場合

あなたはあなたがいたブランチをチェックアウトする必要があるだけです、例えば

git checkout master

次回ファイルを変更して、インデックス内の状態に復元する場合は、最初にファイルを削除するのではなく、削除するだけです。

git checkout -- path/to/foo

これにより、ファイルfooがインデックス内の状態に復元されます。

切り離されたHEADに関連付けられた変更を保持したい場合

  1. git branch tmp実行します-これにより、変更がtmpという新しいブランチに保存されます。
  2. git checkout master実行します
  3. 行った変更をmasterに組み込みたい場合は、 masterブランチからgit merge tmpを実行します。 git checkout master実行した後、 masterブランチにいるはずです。
Toni Gamez picture
2013年12月10日
492

失いたくないファイルを変更した場合は、それらをプッシュできます。 私はそれらをデタッチモードでコミットしました。その後、一時的なブランチに移動して、後でマスターに統合できます。

git commit -m "....."
git branch my-temporary-work
git checkout master
git merge my-temporary-work

抽出元:

切り離された頭で行われたコミットをどうするか

tanius picture
2013年06月11日
165

一時的なブランチを作成しないソリューション。

このモードですでに何かを変更し、オプションで変更を保存したい場合に、切り離されたHEAD状態を終了(「修正」)する方法:

  1. 保持したい変更をコミットします。 デタッチされたHEAD状態で行った変更のいずれかを引き継ぐ場合は、それらをコミットします。 お気に入り:

    git commit -a -m "your commit message"
    
  2. 保持したくない変更は破棄します。 ハードリセットは、切り離されたHEAD状態で行ったコミットされていない変更を破棄します。

    git reset --hard
    

    (これがないと、ステップ3は失敗し、デタッチされたHEAD内の変更されたコミットされていないファイルについて不平を言います。)

  3. あなたのブランチをチェックしてください。 前に作業したブランチをチェックアウトして、デタッチされたHEAD状態を終了します。次に例を示します。

    git checkout master
    
  4. コミットを引き継ぎます。 別の質問への私の回答に示されチェリーピッキングによって、切り離されたHEAD状態で行ったコミットを引き継ぐことができます。

    git reflog
    git cherry-pick <hash1> <hash2> <hash3> …
    
Razan Paul picture
2016年08月29日
135

分離されたヘッドとは、次のことを意味します。

  1. あなたはもうブランチにいません、
  2. 履歴内の単一のコミットをチェックアウトしました

変更がない場合:次のコマンドを適用してマスターに切り替えることができます

  git checkout master

保持したい変更がある場合:

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

git branch  temp
git checkout master
git merge temp
Philippe Gerber picture
2014年08月03日
67

これは、私が頭を離れていて、すでにいくつかの変更を加えていることに気付いた直後に行ったことです。

私は変更をコミットしました。

$ git commit -m "..."
[detached HEAD 1fe56ad] ...

コミットのハッシュ(1fe56ad)を思い出しました。 それから私は私がいたはずのブランチをチェックアウトしました。

$ git checkout master
Switched to branch 'master'

最後に、コミットの変更をブランチに適用しました。

$ git cherry-pick 1fe56ad
[master 0b05f1e] ...

これは一時的なブランチを作成するよりも少し簡単だと思います。

mojuba picture
2015年01月02日
65

変更を加えた後、頭が離れていることに気付いた場合は、次の操作を実行できます。stash-> checkout master-> stash pop:

git stash
git checkout master   # Fix the detached head state
git stash pop         # Or for extra safety use 'stash apply' then later 
                      #   after fixing everything do 'stash drop'

何も起こらなかったように、コミットされていない変更と通常の「アタッチされた」HEADがあります。

MarianD picture
2019年09月28日
63

HEADはポインターであり、直接的または間接的に特定のコミットを指します

Attached HEADは、あるブランチにアタッチされている(つまり、ブランチを指している)ことを意味します。
分離されたHEADは、どのブランチにも接続されていないことを意味します。つまり、何らかのコミットを直接指します。

enter image description here

言い換えると:

  • コミットを直接指している場合、HEADは切り離されています。
  • 間接的にコミットを指している場合(つまり、ブランチを指している場合、ブランチはコミットを指している場合)、HEADがアタッチされます。

HEADが取り付けられている/取り外されている状況をよりよく理解するために、上の写真の4つ組に至るまでの手順を示しましょう。

リポジトリの同じ状態から始めます(すべての象限の画像は同じです):

enter image description here


ここで、 git checkoutを実行します—個々の画像で異なるターゲットを使用します(それらの上のコマンドは、それらのコマンドのみ適用することを強調するために淡色表示

enter image description here


これらのコマンドを実行したの状況は次のとおりです。

enter image description here

ご覧のとおり、HEADはgit checkoutコマンドのターゲットを指します—ブランチ(4つ組の最初の3つの画像)、または(直接)コミット(4つ組の最後の画像)を指します。

作業ディレクトリの内容も、適切なコミット(スナップショット)に準拠するように変更されます。つまり、コミットが(直接的または間接的に)HEADによってポイントされます。


だから今、私たちはこの答えの始めと同じ状況にあります:

enter image description here

larsks picture
2012年04月19日
42

gitで特定のコミットをチェックアウトすると、ヘッド

特定のファイルに変更を加え、それらを単に破棄したい場合は、次のようにcheckoutコマンドを使用できます。

git checkout myfile

これにより、コミットされていない変更が破棄され、ファイルが現在のブランチの先頭にある状態に戻ります。 すでにコミットした変更を破棄する場合は、 resetコマンドを使用することをお勧めします。 たとえば、これによりリポジトリが前のコミットの状態にリセットされ、後続の変更はすべて破棄されます。

git reset --hard HEAD^

ただし、リポジトリを他の人と共有している場合、 git resetは混乱を招く可能性があります(リポジトリ履歴の一部が消去されるため)。 すでに他の人と変更を共有している場合は、通常、代わりにgit revertます。これにより、「アンチコミット」が生成されます。つまり、問題の変更を「元に戻す」新しいコミットが作成されます。

GitBookに詳細があります。

Mike picture
2015年11月21日
27

「切り離されたヘッド状態」では一時ブランチにいるので、 git checkout -を使用するだけで、最後に行っていたブランチに移動します。

Timo picture
2017年12月06日
8

@Philippe Gerberの答えをさらに明確にするために、ここにあります:

git cherry-pick

この場合、 cherry-pick前にgit checkout masterが必要です。 さらに、 detached head commitでのみ必要です。