如何处理分离头中的提交

ben*_*zen 249 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)
Run Code Online (Sandbox Code Playgroud)

因为它告诉我,当我处于一个独立的头状态时,我仍然可以犯下这样做.但现在我想要合并我的分离头分支和我的本地主分支,然后将我的一堆更改推送到origin/master.

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

Rya*_*art 435

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

git branch my-temporary-work
git checkout master
git merge my-temporary-work
Run Code Online (Sandbox Code Playgroud)

  • 不要忘记使用"git branch -d my-temporary-work"删除我的临时工作 (10认同)
  • 如何在将来避免分离头? (9认同)
  • 奇怪的是,我得到"已经是最新的".合并我的临时工作时 (3认同)
  • 当您编辑旧提交的文件,然后提交不带分支的文件以供以后引用此新提交时,会发生@ycomp“分离头”。为避免头过大,请勿签出旧提交。如果您仍然希望从那里获取所有文件,但是作为新的提交,则可以从提交中检出目录,而不是从提交本身中检出目录。[查看此答案](/sf/answers/676981301/) (3认同)

CB *_*ley 84

你可以这样做.

# 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
Run Code Online (Sandbox Code Playgroud)

更简单的是

git checkout master
git merge HEAD@{1}
Run Code Online (Sandbox Code Playgroud)

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

  • 如果您决定使用命令`git merge HEAD @ {1}`,您可能应该确保使用`git reflog`来使用它. (8认同)
  • 我知道这是多年以后,但谢谢你的回答.我不认为自己在这里用已接受的答案进行搜索,因为我不想留下临时分支,这个答案有删除它的命令. (4认同)
  • 能够合并HEAD @ {1}已经挽救了我的生命,因为我已经预先检查了大师. (3认同)

Arn*_*anc 17

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

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

git branch brand-name
Run Code Online (Sandbox Code Playgroud)

或者只是一个标签:

git tag tag-name
Run Code Online (Sandbox Code Playgroud)


par*_*ver 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!! 
Run Code Online (Sandbox Code Playgroud)

现在,虽然它看起来像一个正常的情况,但是当你这样做时git push它会说“一切都是最新的”。

细心的人会发现它不是“最新的”。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!! 
Run Code Online (Sandbox Code Playgroud)

现在,它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'

Run Code Online (Sandbox Code Playgroud)

你可以看到你的宝藏(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
Run Code Online (Sandbox Code Playgroud)

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

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


Bhu*_*han 12

这就是我做的:

基本上,把它想象detached HEAD成一个没有名字的新分支.您可以像任何其他分支一样提交到此分支.完成提交后,您需要将其推送到遥控器.

所以你需要做的第一件事是给它detached HEAD一个名字.你可以轻松地做到这一点detached HEAD:

git checkout -b some-new-name
Run Code Online (Sandbox Code Playgroud)

现在你可以像任何其他分支一样将它推送到远程.

在我的情况下,我也希望快速转发这个分支以及我在detached HEAD(现在some-new-branch)提交的提交.我所做的只是

git checkout master
Run Code Online (Sandbox Code Playgroud)

git pull # To make sure my local copy of master is up to date

git checkout some-new-branch
Run Code Online (Sandbox Code Playgroud)

git merge master // This added current state of master to my changes

当然,我后来合并了master.

就是这样.

  • 这个答案对我有用,而其他人则没有。`git checkout -b new-branch` 对我有用。其他建议要求使用 `git branch new-branch`,但这让我仍然处于分离状态,新分支没有接受我的更改。 (2认同)

Nat*_*son 12

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

<commit-id> made in detached head state

git checkout master

git cherry-pick <commit-id>

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


Raz*_*aul 6

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

git branch  temp
git checkout master
git merge temp
Run Code Online (Sandbox Code Playgroud)


小智 5

如果您处于这种情况(提交被分离),我将给出适当的步骤,直到推送。分离的意思是当您的提交不与任何分支关联时,​​它仅与“分离头”状态关联。

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

git branch temporaryWork
Run Code Online (Sandbox Code Playgroud)

然后去结帐掌握,这样你就可以合并那个“临时工作”。请考虑检查分支名称列表,以避免出现一些错误

git checkout master
git merge temporaryWork
Run Code Online (Sandbox Code Playgroud)

而git会说你的文件可能有冲突,回去查看你的代码文本编辑器,删除你不需要的代码。

并提交该更改

git add .
git commit -am "merging temporaryWork" 
Run Code Online (Sandbox Code Playgroud)

然后删除“临时工作”

get branch -d temporaryWork
Run Code Online (Sandbox Code Playgroud)

并将其推送到github。

git push origin master
Run Code Online (Sandbox Code Playgroud)