不在任何分支上 + git提交 + 当不在任何分支时检出。我是否丢失了我的更改?

41
当我提交变更时,我并没有在任何分支上。我没有注意到消息,然后切换到了另一个分支。
我该如何检索我的变更?由于没有要合并的分支,因此我无法进行合并或切换。

你还有提交时的控制台输出吗?它包含了提交的SHA1吗?如果是的话,你就拥有了提交对象,这就是你所需要的。 - rlc
4
我不知道你怎么可能在一个分支里... - Ignacio Vazquez-Abrams
3
@Ignacio,不在分支上的最常见情况是当您检出一个提交时,它不是分支的顶部。 - CharlesB
4
@Ignacio: 这非常有用!你可以在不移动任何分支指针的情况下在提交历史记录中跳转,特别是在尝试找到适合 git bisect 的好提交时非常有用。"detached HEAD" 是这种状态的名称,因为 HEAD 直接指向一个提交,而不是通过特定引用间接指向它。 - Mark Longair
这回答了您的问题吗?在分离HEAD状态下创建的git提交发生了什么? - mkrieger1
7个回答

74

您可以使用git reflog获取在“无分支”(即分离的HEAD)状态下执行的提交哈希,并将其合并到您当前所在的分支中(例如主分支)。

类似于git merge HEAD@{1}这样的命令。

您还可以使用git rebase -i并从reflog中“选择”想要的提交。


12

我提交了一些工作后处于类似的状态:

Lilith:Manager KelSolaar$ git status

目前未在任何分支上。

我执行了git log以查看我的最后一个提交哈希:

Lilith:Manager KelSolaar$ git log

commit 49984303037e970d637161c3154b7fd7d6ae3a43 Author: KelSolaar Date: Wed Oct 5 22:41:31 2011 +0100

Introduce new "QObject" components category and rename existing ones to "Def

接着我检出了我的主分支:

Lilith:Manager KelSolaar$ git checkout master

上一个 HEAD 的位置是 4998430... 引入新的“QObject”组件类别,并将现有的重命名为“Default”和“QWidget”。

切换到分支“master”

最后,我使用提交哈希合并:

Lilith:Manager KelSolaar$ git merge 49984303037e970d637161

更新 141bc69..4998430

快进

src/manager/component.py | 2 +-

...


10

git checkout - 将会切换回上一个分支:

Thu Feb 21 12:50 AM /src/test ((08f84f4...)) $ git checkout master

Warning: you are leaving 1 commit behind, not connected to
any of your branches:

  08f84f4 Fix everything

Switched to branch 'master'

Thu Feb 21 12:50 AM /src/test (master) $ git checkout -

HEAD is now at 08f84f4... Fix everything

Thu Feb 21 12:50 AM /src/test ((08f84f4...)) $

2
我认为这是最好的答案。另外值得一提的是,你可以使用 git branch 命令来检查你当前所在的分支。 - Adam Fowler
这是用最简单的方法回答问题。git checkout -(只是再次强调它) - N8TRO

2

您的提交并没有丢失,您可以要求git向您显示隐藏的提交,并将它们放回到一个临时分支中进行恢复。

请参见此答案以获取指导。


2
在这种情况下,这比那更容易,因为reflog将具有提交-manojlds的答案描述了这一点。 - Mark Longair

2

使用“git reflog”命令可以显示您的git命令历史记录结果的提交哈希值。然后,您可以使用“git co hash”命令,在找到正确的提交后为其设置/创建一个分支。


0

例子

Branches list

这里,我只有一个本地分支:main。其他分支都来自远程仓库。

尝试切换到某个提交

Click to checkout

信息:

message

这是因为它是一个提交,而不是一个分支。我点击了取消

正在创建一个新的分支

Creating a new branch

尝试将新分支“checkout”到提交

checkout to the new branch

相同的结果

result 1

将分支重置到此提交

reset branch to this commit

弹出窗口

enter image description here

结果

result - reset branch

尝试使用main分支(先前,检出到主分支)进行相同的操作

reset main to a commit

结果:

enter image description here

所以,在我的情况下,期望的行为是“重置”,而不是“检出”

我可以将分支重置到任何提交。


-5

你永远不会“不在任何分支上”。你可能曾经在名为master的分支上,但是当你提交时,你一定在某个分支上。所以那个提交就在某个地方。

使用git log查看历史记录。你可以使用git reset回到过去(包括可选地保留工作目录中的更改)。


13
这是错误的 - 你不能在一个分支上。这种状态被称为“分离头指针(detached HEAD)”,因为HEAD指向一个特定提交的哈希值,而不是分支名称。使用分离头指针产生的任何提交都不会推进分支的末端,但仍然可以通过引用日志(reflog)一段时间内访问它们。 - Mark Longair
不是真的。现在"$ git status"给我的是"# Not currently on any branch."(而不是通常的"# On branch master"),接着是"# Changes to be committed:"等等。 - weronika

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接