gitの「ブランチなし」からファイルとコミットを救出する


11

別のプロジェクトのgitサブモジュールにあるいくつかのファイルの作業を開始しました。ただし、これはgitサブモジュールであるため、「マスター」をチェックアウトせず、ヘッドをチェックアウトし、フォルダー内のすべてのファイルを「ブランチなし」に配置しました。

これらのファイルに誤って変更を加えたので、プロジェクトの「サブブランチなし」のサブモジュールで作業していることがわかりました。

それらのファイルをブランチ(マスターなど)に入れて、救出できるようにするにはどうすればよいですか?

回答:


28

git reflog「失われた」コミットの検索に使用できます。

$ cd submodule_dir
$ git reflog          # Find the commit
$ git checkout master
$ git cherry-pick $SHA_OF_MISSING_CMMIT

うん、これはうまくいった!git merge $COMMIT_SHA一度行ったことを除いて、私は他のブランチにいました。
Xeoncross、

3

「ブランチなし」状態は、デタッチされたヘッドと呼ばれます。これは、HEAD refがどのブランチにもアタッチされておらず、コミットを直接指しているため、これと呼ばれます。現在のHEADコミットを指すブランチにHEADをアタッチするには、を使用しますgit checkout -b branchname

既存のブランチを安全に更新して、次のシーケンスでHEADでのコミットを含めることができます。

git branch temp
git checkout branchname
git merge temp
git branch -d temp

または、同様にHEAD@{1}、一時ログを作成する必要がないようにreflog表記を使用します。

git checkout branchname
git merge HEAD@{1}

マージをすぐに行わない場合は、一時的なブランチを使用することをお勧めします。

HEADでのコミットを指すように既存のブランチを強制的に上書きする場合は、を使用できますgit branch -f branchname && git checkout branchname。HEADでのコミットがブランチ名の現在のヒントに基づいていない場合、これは通常回避したいブランチ名への非早送りの変更になります(リライト履歴と見なされます)。


この回答は、HEADがまだ最後のコミット(ブランチではなかった)を指していると想定していることに注意してください。それ以降にHEADを移動していて、何が起こったのかがわかった場合は、reflogで失われたコミットを探す必要がある場合があります(mipadiの回答を参照)。
LarsH 2018年

1

以前の回答に追加するには:

切り離されたHEADにいる間、タグを追加できます。

git tag <some-tag>

これにより、タグがコミットに追加されgitk、他のツールで表示できるようになります。

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