351

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

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

所以我的问题是如何将主分支与我的实际状态(分离头)合并

4

11 回答 11

589

在你所在的地方创建一个分支,然后切换到 master 并合并它:

git branch my-temporary-work
git checkout master
git merge my-temporary-work
于 2011-08-19T16:19:56.340 回答
128

你可以做这样的事情。

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

但这有一个轻微的危险,如果你确实犯了错误,恢复在分离头上所做的提交可能会有点困难。

于 2011-08-19T16:22:07.333 回答
34

这就是我所做的:

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

所以你需要做的第一件事就是给它detached HEAD一个名字。你可以很容易地做到这一点,同时在这个detached HEAD

git checkout -b some-new-branch

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

就我而言,我还想快进这个分支以掌握我在detached HEAD(now 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 current state of master to my changes

当然,我后来将它合并到master.

就是这样。

于 2015-10-21T21:59:13.363 回答
21

你可以做git merge <commit-number>git cherry-pick <commit> <commit> ...

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

git branch brand-name

或者只是一个标签:

git tag tag-name
于 2011-08-19T16:20:02.317 回答
13

或者,您可以将提交 ID 挑选到您的分支上。

<commit-id> made in detached head state

git checkout master

git cherry-pick <commit-id>

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

于 2020-07-16T19:37:04.620 回答
7

在分离 HEAD 的情况下,提交工作正常,除了没有命名分支得到更新。要使用您提交的更改更新主分支,请在您所在的位置创建一个临时分支(这样临时分支将拥有您在分离的 HEAD 中所做的所有提交更改),然后切换到主分支并将临时分支与大师。

git branch  temp
git checkout master
git merge temp
于 2016-10-30T22:51:33.750 回答
4

我看到几乎每个人都提出了一个正在创建临时分支的解决方案。现在,需要承认,每当出现这种“以分离状态提交”的问题时,通常会在一次提交后检测到。并为那个微不足道的提交创建一个完整的分支 - 听起来太多了,对吧?尤其是在你已经在太多分支之间跳来跳去的项目中。

那有什么简单的方法呢?使用提交哈希!

我怎么得到它?

  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它会说“一切都是最新的”。

细心的人会发现它不是“最新的”。HEAD在主人以外的地方。

  1. 那么,接下来呢?只需复制 hash 的初始字符即可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 mastergit曾这样警告过你
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

你看到那里有你正在寻找的宝藏......哈希。

我想这涵盖了在带有悬空提交的分离状态下可能发生的所有可能场景。下次注意!!

于 2021-07-08T09:02:56.800 回答
3

一个简单的解决方法是为该提交创建一个新分支并签出它:git checkout -b <branch-name> <commit-hash>.

这样,您所做的所有更改都将保存在该分支中。如果您需要从剩余提交中清理您的主分支,请务必运行git reset --hard master.

有了这个,您将重写您的分支,因此请确保不要因这些更改而打扰任何人。请务必查看这篇文章,以更好地说明 分离的 HEAD状态。

于 2018-05-07T12:42:05.870 回答
3

结帐实际分支

git 合并 {{提交哈希}}

于 2021-02-03T21:46:37.180 回答
1

也许不是最好的解决方案,(将重写历史)但你也可以这样做git reset --hard <hash of detached head commit>

于 2016-05-24T19:44:41.820 回答
0

当我结帐导致头部分离时,git实际上告诉我在这种情况下该怎么做:

git switch -c \<new-branchname>

结果像分离头和新分支之前一样离开主分支,其中包含在分离的头状态下工作时所做的所有提交。

要更详细地重现/测试/理解:

  1. 创建一个包含两个提交的 testrepo:
~/gittest$ git log --oneline 
17c34c0 (HEAD -> master) 2
5975930 1
  1. 签出上一个提交 1

~/gittest$ git checkout 5975930

这条德语消息出现

Hinweis: Wechsle zu '5975930'。

Sie befinden sich im Zusand eines 'losgelösten HEAD'。Sie können sich umschauen, Experimentelle Änderungen vornehmen und diese committen, und Sie können alle möglichen Commits, die Sie in diesem Zusand machen, ohne Auswirkungen auf irgendeinen Branch verwerfen, indem Sie zu einem anderen Branch wechseln。

Wenn Sie einen neuen Branch erstellen möchten, um Ihre erstellten Commits zu behalten, können Sie das (jetzt oder später) durch Nutzung von 'switch' mit der Option -c tun。贝斯皮尔:

git switch -c \<neuer-Branchname>

Oder um diese Operation rückgängig zu machen: git switch -

Sie können diesen Hinweis ausschalten, indem Sie die Konfigurationsvariable 'advice.detachedHead' auf 'false' setzen。

HEAD ist jetzt bei 5975930 1

翻译成英语为:

注意:更改为“5975930”。

您处于“分离的 HEAD”状态。您可以环顾四周,进行实验性更改并提交它们,您可以放弃在此状态下所做的任何可能的提交,而不会通过切换到另一个分支来影响任何分支。

如果你想创建一个新的分支来保留你创建的提交,你可以通过使用带有 -c 选项的'switch'来做到这一点(现在或以后)。例子:

git switch -c <new-branch-name>.

或者撤销这个操作:git switch -.

您可以通过将配置变量“advice.detachedHead”设置为“false”来关闭此提示。

HEAD 现在是 5975930 1

(用www.DeepL.com/Translator翻译(免费版))

于 2021-06-01T15:43:48.090 回答