如何处理分离头中的提交

时间:2011-08-19 16:17:16

标签: git git-checkout

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

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

11 个答案:

答案 0 :(得分:393)

创建一个分支,然后切换到master并合并它:

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

答案 1 :(得分:77)

你可以这样做。

# 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 temproary branch
git branch -d tmp

更简单的是

git checkout master
git merge HEAD@{1}

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

答案 2 :(得分:17)

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

根据Ryan Stewart的建议,你也可以从当前的HEAD创建一个分支:

git branch brand-name

或只是一个标签:

git tag tag-name

答案 3 :(得分:12)

这就是我所做的:

基本上,将detached HEAD视为一个没有名称的新分支。您可以像任何其他分支一样提交到此分支。完成提交后,您需要将其推送到遥控器。

所以你需要做的第一件事是给这个detached HEAD一个名字。在detached HEAD

上,你可以轻松地做到这一点
git checkout -b some-new-name

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

在我的情况下,我还希望快速转发此分支以及我在detached 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 current state of master to my changes

当然,我稍后将其合并到master

就是这样。

答案 4 :(得分:6)

如果是分离的HEAD,则提交工作正常,除了没有更新命名分支。要使用已提交的更改更新主分支,请在您所在的位置创建临时分支(这样临时分支将具有您在分离的HEAD中所做的所有已提交的更改),然后切换到主分支并将临时分支与主人。

git branch  temp
git checkout master
git merge temp

答案 5 :(得分:4)

或者,您可以将commit-id挑选到分支上。

<commit-id> made in detached head state

git checkout master

git cherry-pick <commit-id>

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

答案 6 :(得分:2)

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

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

有了这个,你将重写你的分支,所以一定不要打扰任何有这些变化的人。请务必查看本文,以便更好地说明detached HEAD州。

答案 7 :(得分:2)

结帐实际分支

git merge {{commit-hash}}

答案 8 :(得分:1)

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

答案 9 :(得分:0)

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

<块引用>

git switch -c \<new-branchname>

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

要重现/测试/了解更多细节:

  1. 创建一个包含两次提交的测试仓库:
<块引用>
~/gittest$ git log --oneline 
17c34c0 (HEAD -> master) 2
5975930 1
  1. 签出之前的提交 1
<块引用>

~/gittest$ git checkout 5975930

显示这条德语消息

<块引用>

Hinweis:Wechsle zu '5975930'。

Sie befinden sich im Zustand 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 Zustand 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 Comits 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 配置变量 'advice.detachedHead' auf 'false' setzen。

HEAD ist jetzt bei 5975930 1

翻译成英文为:

<块引用>

注意:更改为“5975930”。

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

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

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

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

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

HEAD 现在是 5975930 1

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

答案 10 :(得分:0)

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

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

我如何得到它?

  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 不是 master。

  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

你看到了你正在寻找的宝藏......哈希。

我想这涵盖了在带有悬空提交的分离状态下可能发生的所有可能情况。下次小心!!