GITは最後に切り離されたHEADを復元します


85

プロジェクトに大きな問題があります。これがシナリオです。GITの下にxcodeプロジェクトがあります。今日、最後のコミットでいくつかのテストが失敗したことに気付いたので、前のコミットをチェックしました。SourceTreeを使用しましたが、これは警告です

そうすることで、作業コピーが「切り離されたHEAD」になります。つまり、ブランチに参加しなくなります。この後にコミットしたい場合は、ブランチを再度チェックアウトするか、新しいブランチを作成することをお勧めします。これでよろしいですか?

私は一日中働き、最後にすべてをコミットしました。だから私は開発ブランチでの作業をマージする必要があったので、開発ブランチをチェックアウトすると...私の作業はすぐに消えました:(

HEADを切り離すのが間違っていて、Sourcetreeが警告してくれたのは知っていますが、作業を復元する方法はありますか?


ここで非常に同じ問題に関連するスレッドと、それがここでどのように発生するかに関する技術。
RBT 2017

回答:


254

と入力するとgit reflogHEADポイントされたリビジョンの履歴が表示されます。あなたの切り離された頭はそこにあるはずです。それを見つけたら、git checkout -b my-new-branch abc123またはgit branch my-new-branch abc123abc123切り離されたHEADのSHA-1はどこにありますか)を実行して、切り離されたヘッドを指す新しいブランチを作成します。これで、自由にそのブランチをマージできます。

一般に、デタッチされたヘッドで作業した後にブランチをチェックアウトすると、Gitは、必要に応じて回復できるように、デタッチされたヘッドからのコミットを通知する必要があります。SourceTreeを使ったことがないので、そのメッセージを中継するかどうかはわかりません。ただし、そのメッセージが表示された場合は、それを使用してコミットを検索し、そのコミットからブランチを再度使用git checkout -bまたはgit branch作成できるはずです。


4
ブライアンありがとう。あなたは私の日を救った。
ムザミル2013

ブライアン、あなたは私のライブを救った!ありがとう!
cldrr 2014年

私はgitを初めて使用します。fatal: A branch named 'mybranch' already exists.既存のブランチに追加する方法を取得していますか?
ラメシュムルゲサン2015

1
ブライアンに感謝するすべての人のためのPSAとして:失いたくない仕事をしている場合は、数時間ごとにリモート(githubなど)にプッシュしてください。隕石があなたのコンピュータに落ちたとき、あなたはあなたがしたことをうれしく思うでしょう。まだ共同編集者と共有する準備ができていない場合は、今のところ誰も知らないブランチに配置し、後でマスターにリベースします。
MatrixManAtYrService 2018

1
また、消えたばかりの1つの失われたコミットであり、そこで見つけた場合は、でそれを戻すことができますgit cherry-pick e5b2f7b。ここe5b2f7bで、コミットのSHA-1はそこにあります。
エイディン

10

Sourcetreeでは、GUIを使用してこれを行うことができます。

まず、コマンド履歴でメッセージを探して「失われた」コミットを見つけます(表示:コマンド出力の表示)。コミット後に失われたのは、おそらくコマンド「SwitchingBranch」にあります。そのメッセージに、1234567コミットIDのコミットコメントが表示されることを願っています。

そのコミットIDを次のステップに進めます。

上部のツールバーの[ブランチ]ボタンを押すと、特定のコミットを指定できる[新しいブランチ]ダイアログが表示されます。そのコミットIDをそこに入れ、新しいブランチ名を指定し、[ブランチの作成]をクリックすると、失われたコミットで新しいブランチを取得する必要があります。

ここに画像の説明を入力してください


実際に動作します。コミットIDが正しいコメントが表示されていることを確認してください。
ハマドカーン2015

@blalondこんにちは、あなたの答えを読んだ後、少し質問があります:SourceTreeで前のコミットをダブルクリックすると(チェックアウトするために)、これがヘッドの分離を引き起こすのと同じメッセージが表示されるので、疑問に思いますgitを使用して以前のリビジョンに簡単にロールバックできると人々が言うとき、それはどういう意味ですか?次に、特定のコミットにロールバックするにはどうすればよいですか?ありがとう

5

デタッチされたHEADの変更を保持せず、最新のブランチコミットに移動する場合は、以下のコマンドを直接使用します。

git checkout - 

注:切り離されたHEADのすべての変更を削除します。


OPは彼らの仕事を続けるように要求しました。これは元の質問に答えるものではありません。それをブランチに保持するオプションを追加するだけで、この回答が役立ちます。
manuelvigarcia

1

私の同僚はちょうどこの状況にありました。彼の場合、デタッチされたヘッドにコミットがあり(R-Studioで動作します)、ツールは、これとそのSHA参照を使用してブランチを作成できることを警告しました...ただし、唯一のオプションは「閉じる」でした。 --duh !! それは情報ボックスでした-彼らは対話を閉じ、永遠に情報を失いました...

reflogコマンドのおかげで、変更が失われていないことがわかりました。しかし、私たちの場合、はgit branch期待どおりに機能しませんでした...または着信git pullが何らかの理由でそれを台無しにしました。reflogから新しく作成されたブランチへの変更を釣り上げる必要がありました。

 git cherry-pick 0b823d42..3cce27fc

これにより、必要なすべてのコミットがブランチに配置されました。その後、develop問題なくブランチをマージできます。

これが誰かにとって有益である場合に備えて、「チェックアウト」(ブランチシフトを識別する)でマークされた間のコミットを調べることによって、で切り離されたヘッドのコミットreflogを識別しました。

e09f183b HEAD@{3}: pull: Fast-forward
b5bf3e1d HEAD@{4}: checkout: moving from lost_changes to develop
b5bf3e1d HEAD@{5}: checkout: moving from 3cce27fca50177a288df0252f02edd5da5ee64fd to lost_changes
3cce27fc HEAD@{6}: commit: add statistics
417a99a4 HEAD@{7}: commit: add test
0b823d42 HEAD@{8}: commit: new utility class
d9ea8a63 HEAD@{9}: checkout: moving from develop to d9ea8a635d4c2349fcb05b3339a6d7fad5ae2a09
b5bf3e1d HEAD@{10}: pull: Fast-forward

私たちが望んでいたものはなかったHEAD@{8}HEAD@{6}(両方を含みます)。だから私たちはそれらを手に入れました:

git cherry-pick 0b823d42..3cce27fc

次に、通常のマージ解決と最終コミットにより、失われたと思われる分離ヘッド作業をホストするブランチlost_changesが残りました。今回はそれを開発にマージするのが早送りでした。


0

このシナリオを試してみたところ、gitが最後のコミットのSHA-1を教えてくれました。

vors@localhost:~/git-test$ git checkout master 
Warning: you are leaving 1 commit behind, not connected to
any of your branches:

  ec600e6 333

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 ec600e6eb2473dd4f3732539c5c1fa5829f631b7

Switched to branch 'master'

このメッセージを見ましたか?


番号。または多分私は注意を払っていません。Timemachineのバックアップを探しています;(
IgnazioC 2013

1
@IgnazioCバックアップを確認する必要はありません。私の答えを見ましたか?git reflog必要なものを表示する必要があります。
ブライアンキャンベル

0

変更しない限り、取り外したヘッドで問題ありません。

コミットを元に戻したい場合は、特定のブランチでgitrevertを使用できます

切り離されたヘッドを処理してコミットを実行する場合。新しいブランチを作成します(後でマージします)。


うん!私たちはルールを知っています。しかし、同僚が離れた頭から離れて、それらのコミットを離れるとき、彼らはルールではなく答えを求めます。
manuelvigarcia

0
  1. まず、実行git reflogして履歴を表示します。
  2. 最も古いリビジョンがリストの最後になります。
  3. git checkout -b temp e35d2b3ここを使用して目的のコミットに切り替えます。e35dd23はコミットのハッシュ値です。
  4. それでおしまい。ここで、gitaddを実行します。等....

それがあなたの問題を解決するならば、答えとしてそれを受け入れてください。それ以外の場合は、コメントを共有してください。

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