在分离的 HEAD 中进行提交应该怎么办?

407

使用 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)

因为它告诉我,即使在分离的 HEAD 状态下,我仍然可以提交,所以我这样做了。但现在我想合并我的分离 HEAD 分支和本地主分支,然后将我的一堆更改推送到 origin/master。

所以我的问题是如何将主分支与我的当前状态(分离的 HEAD)合并。


可能是重复的问题:Git:HEAD已经消失,想将其合并到主分支(master) - Karl Bielefeldt
1
如果您能够添加一个提交树的截图(在gitk或SourceTree中显示分离头上的提交实际上是什么样子),那将使这个问题更好。 - florisla
很遗憾,目前我不能提供,但如果您能提供一个,我会很高兴在这里看到它。即使只是一张草图,也会让它更清晰明了。 - benzen
12个回答

671

在当前位置创建一个分支,然后切换到主分支并将其合并:

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

22
如何避免将来脱离头部? - ycomp
8
合并我的临时工作时,出现“已经是最新版本”的提示,感觉很奇怪。 - Robert Sinclair
15
不要忘记使用“git branch -d my-temporary-work”删除我的临时工作。 - Captain Lepton
6
“Detached head”(分离的头)是指当你编辑旧提交的文件并在没有分支引用的情况下提交这些更改时发生的情况。为了避免出现分离的头,请勿检出旧提交。如果您仍希望获得该提交中的所有文件,但作为一个新的提交,则可以从该提交中检出目录,而不是该提交本身。 参见此答案 - lucidbrot
@WestMountain 你可以随时使用 git reflog 命令来查看你的 HEAD 指向的位置。在那里找到你感兴趣的提交 ID,然后使用 git checkout <commit> 或者 git checkout -b <branch name> <commit> 从那个提交点开始创建一个新的分支。 - undefined
显示剩余4条评论

148

你可以像这样做。

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

但是这种方法存在一定的风险,如果出现错误,恢复分离头部提交所做的更改会稍微困难一些。


5
我知道这已经过去好几年了,但感谢您提供的答案。我没有认为自己已经完成搜索,因为我不想留下一个临时分支,而这个答案中有删除它的命令。 - Jeremy Pridemore
10
如果你决定使用命令 git merge HEAD@{1},你应该通过使用 git reflog 来确保它是你想要使用的。 - Michael Stramel
4
能够合并HEAD@{1}救了我的命,因为我已经预先检出了主分支。 - juil

40

这是我所做的:

基本上,把 detached HEAD 想象成一个没有名称的新分支。您可以像任何其他分支一样提交到该分支。完成提交后,您希望将其推送到远程。

因此,您需要做的第一件事是给这个 detached HEAD 起一个名称。您可以在处于这个 detached HEAD 的状态下轻松地实现它:

git checkout -b some-new-branch

现在你可以像其他分支一样将其推送到远程。

在我的情况下,我还想将此分支与我在“分离的 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 the current state of master to my changes

当然,我后来将它合并到 master 分支。

就这样了。


2
这个答案对我有用,而其他的则没有。git checkout -b new-branch 对我有效。其他建议要求使用 git branch new-branch,但那样会让我仍然处于分离头状态,新分支也无法捕捉到我的更改。 - Jesse Patel
1
@JessePatel 这是因为你只使用 "git branch new-branch" 命令创建了一个分支,你需要通过执行 "git checkout new-branch" 命令将 HEAD(当前所在的位置)移动到该分支。而 "git checkout -b new-branch" 命令中的 "-b" 标志表示在将 HEAD 移动到该分支之前创建一个新的分支,相当于一次执行两个命令。 - Postermaestro

24

你可以使用 git merge <commit-number>git cherry-pick <commit> <commit> ... 命令来实现。

如Ryan Stewart所建议的,你还可以从当前HEAD创建一个分支:

git branch brand-name

或者只是一个标签:

git tag tag-name

您可以通过命令 git rev-parse HEAD 在分离的 HEAD 上找到您的提交编号。 - KOGI

17

另外一种方法是将提交的id精选到您的分支上。

<commit-id> 处于游离 HEAD 状态

git checkout master

git cherry-pick <commit-id>

没有临时分支,也没有合并。


13
我看到几乎每个人都建议创建一个临时分支的解决方案。现在,必须承认,每当出现“以分离状态提交”的问题时,通常是在提交后检测到的。为了那仅有的一次提交就创建一个完整的分支 - 听起来太过繁琐了吧?特别是在您已经在众多分支中跳转的项目中。
那么,有什么简单的方法呢?使用提交哈希值!
如何获取哈希值?
1. 进行 `git log` 命令,您会看到类似以下内容的信息:
commit 10bf8fe4d17bb7de59586a7abb6db321f0786bb3 (HEAD)
Author: Someone <someone@something.com>
Date:   So/me/day SO:ME:TI:ME 

    A commit message that doesn't mean much

commit a3cd1cedf1962916cdc2945f2bd2b271ec8b919d (origin/master, master)
Author: Someone <someone@something.com>
Date:   Some/other/day SOME:OTHER:TIME 

    Another commit message that doesn't mean much

commit 1bfabbe09c70419070fe29ff1ed276c0207bbe10
Author: Someone <someone@something.com>
Date:   Thu Jul 8 08:38:12 2021 +0530

    Enough reading the example, focus on the answer!! 

现在,尽管它看起来像一个普通的情况,但当你执行git push时,它会显示“Everything up-to-date”。

仔细的人会发现这并不是“up-to-date”。HEAD在主分支之外。

  1. 那么,接下来呢?只需复制哈希的初始字符10bf8fe4d1。首先,执行git checkout master,这将把您移动到master分支。现在,由于您已经复制了哈希值,您可以执行git merge <hash>。现在执行git log

然后,您会看到:

commit 10bf8fe4d17bb7de59586a7abb6db321f0786bb3 (HEAD -> master)
Author: Someone <someone@something.com>
Date:   S/om/eday SO:ME:TI:ME 

    A commit message that doesn't mean much

commit a3cd1cedf1962916cdc2945f2bd2b271ec8b919d (origin/master)
Author: Someone <someone@something.com>
Date:   Some/other/day SOME:OTHER:TIME 

    Another commit message that doesn't mean much

commit 1bfabbe09c70419070fe29ff1ed276c0207bbe10
Author: Someone <someone@something.com>
Date:   Thu Jul 8 08:38:12 2021 +0530

    Enough reading the example, focus on the answer!! 

现在,HEAD 看起来已经放置在正确的位置了。

有人可能会问:“如果我没有哈希值呢?我对悬空提交一无所知,只是执行了 git checkout master。” 不用担心,我给你准备好了。你可以在两个地方找到提交哈希值:

  1. 当你执行 git checkout master 时,git 会像这样警告你
Warning: you are leaving 1 commit behind, not connected to
any of your branches:

  10bf8fe A commit message that doesn't mean much

If you want to keep it by creating a new branch, this may be a good time
to do so with:

 git branch <new-branch-name> 10bf8fe

Switched to branch 'master'

你能看到你的宝藏(hash),对吧?

  1. 别告诉我你找不到它。它就在那儿。但如果你真的找不到,那么可以使用git reflog命令。它会展示类似这样的信息:
a3cd1ce (HEAD -> master, origin/master) HEAD@{0}: checkout: moving from 10bf8fe4d17bb7de59586a7abb6db321f0786bb3 to master
10bf8fe HEAD@{1}: commit:  A commit message that doesn't mean much

你看,这里是你一直在寻找的宝藏... 哈希值。
我猜这包含了在分离状态下和悬挂提交时可能发生的所有情况。下次要小心!!

7

如果处于分离的HEAD状态,提交操作与正常情况下相同,但没有任何命名分支会被更新。为了将提交的更改更新到主分支,需要在当前位置创建一个临时分支(这样临时分支将包含你在分离的HEAD中所做的所有提交更改),然后切换到主分支并将临时分支与主分支合并。

git branch  temp
git checkout master
git merge temp

5

如果您处于分离的提交状态,我将为您提供适当的步骤,直到推送。分离的意思是您的提交与任何分支都没有关联,它仅与“分离的头”状态相关联。

首先,您必须创建一个新分支,分离的提交将自动与新分支关联。

git branch temporaryWork

并前往结帐以掌握,这样您就可以合并那个“temporaryWork”。请考虑检查分支名称列表,以避免出现一些错误。

git checkout master
git merge temporaryWork

Git 会提示你的文件可能存在冲突,回到代码文本编辑器查看并删除不需要的代码。

然后提交这个更改。

git add .
git commit -am "merging temporaryWork" 

然后删除“temporaryWork”

get branch -d temporaryWork

将其推送到 Github。
git push origin master

因为你没有像我见过的其他例子那样在存储库里留下分支垃圾,所以我点赞了。这是一个简单的步骤,但很少有答案提到它。 - undefined

3
一个简单的解决方法就是创建一个新的分支并切换到它:git checkout -b <branch-name> <commit-hash>。这样,您所做的所有更改都将保存在那个分支中。如果您需要清理主分支中的残留提交,请务必运行 git reset --hard master
通过这种方式,您将重写您的分支,因此请确保不会因这些更改而打扰任何人。请务必查看本文章以获得有关"分离 HEAD"状态的更好说明。:detached HEAD

3

检出实际分支

合并提交{{commit-hash}}


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