ChatGPT解决这个技术问题 Extra ChatGPT

如何处理在分离的头脑中进行的提交

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

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

我可以在这种状态下添加提交树的屏幕截图(分离头上的提交实际上看起来像在 gitk 或 SourceTree 中的样子),这将使这个问题变得更好。
不幸的是,我现在不能,但如果你能提供,我会很高兴在这里看到它。就算是平局也会更清楚

R
Ryan Stewart

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

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

未来如何避免人头分离?
我这样做了,发现自己领先了 5 次提交。在那种情况下,你只是做 git push origin 吗?
奇怪,我得到“已经是最新的”。合并我的临时工作时
不要忘记使用“git branch -d my-temporary-work”删除我的临时工作
@ycomp“分离头”发生在您编辑旧提交的文件然后提交没有分支的文件以稍后引用此新提交时。为避免分离头,不要签出旧的提交。如果您仍然想要那里的所有文件,但作为新提交,那么您可以从提交中签出目录,而不是提交本身。 See this answer
C
CB Bailey

你可以做这样的事情。

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

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


我知道这是几年后的事了,但感谢您的回答。我不认为自己在这里用接受的答案完成了搜索,因为我不想离开一个临时分支,而这个答案有删除它的命令。
如果您决定使用命令 git merge HEAD@{1},您可能应该使用 git reflog 确保这是您想要使用的命令
能够合并 HEAD@{1} 挽救了我的生命,因为我已经抢先签出了 master。
M
MrConorAE

这就是我所做的:

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

因此,您需要做的第一件事就是为这个 detached HEAD 命名。在此 detached HEAD 上,您可以轻松地做到这一点:

git checkout -b some-new-branch

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

就我而言,我还想将此分支与我在 detached HEAD(现在的 some-new-branch)中所做的提交一起快进到 master。我所做的只是:

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

就是这样。


这个答案对我有用,而其他人没有。 git checkout -b new-branch 为我工作。其他建议需要 git branch new-branch,但这让我仍然处于分离状态,新分支没有接受我的更改。
@JessePatel 那是因为您只使用“git branch new-branch”创建一个分支,您必须通过执行“git checkout new-branch”将 HEAD(您正在查看/工作的当前位置)移动到该分支。 “git checkout -b new-branch”中的“-b”标志意味着您在将 HEAD 移动到该分支之前创建了一个分支。就像两个命令合二为一。
A
Arnaud Le Blanc

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

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

git branch brand-name

或者只是一个标签:

git tag tag-name

您可以通过 git rev-parse HEAD 在分离的头部找到您的提交号
N
Nate Wilson

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

<commit-id> made in detached head state

git checkout master

git cherry-pick <commit-id>

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


R
Razan Paul

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

git branch  temp
git checkout master
git merge temp

p
paradocslover

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

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

我怎么得到它?

做一个 git 日志。你会看到这样的东西:

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 不是主服务器。

那么,接下来呢?只需复制哈希 10bf8fe4d1 的初始字符即可。首先,做一个 git checkout master。这会将您移动到主分支。现在因为你已经复制了哈希。你可以做一个 git merge 。现在做一个 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。”别担心,我帮你搞定了。您可以在两个地方找到提交哈希:

当你做 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),对吗?

别告诉我你找不到。它就在那里。但如果你真的不能,那么你可以做一个 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

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

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


N
Nesha Zoric

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

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

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


A
Alexandre Pelagaggi

结帐实际分支

git 合并 {{提交哈希}}


r
rookie

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


S
Simeon

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

git switch -c \<新分支名称>

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

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

创建一个包含两个提交的 testrepo:

~/gittest$ git log --oneline 17c34c0 (HEAD -> master) 2 5975930 1

签出上一个提交 1

~/gittest$ git checkout 5975930

这条德语消息出现

注意:更改为“5975930”。您处于“分离的 HEAD”状态。您可以环顾四周,进行实验性更改并提交它们,您可以放弃在此状态下所做的任何提交,而不会通过切换到另一个分支来影响任何分支。如果你想创建一个新的分支来保留你创建的提交,你可以通过使用带有 -c 选项的'switch'来做到这一点(现在或以后)。示例: git switch -c \ 或撤消此操作: git switch - 您可以通过将配置变量 'advice.detachedHead' 设置为 'false' 来关闭此提示。 HEAD 现在是 5975930 1

翻译成英语为:

注意:更改为“5975930”。您处于“分离的 HEAD”状态。您可以环顾四周,进行实验性更改并提交它们,并且您可以放弃在此状态下所做的任何可能的提交,而不会通过切换到另一个分支来影响任何分支。如果你想创建一个新的分支来保留你创建的提交,你可以通过使用带有 -c 选项的'switch'来做到这一点(现在或以后)。示例:git switch -c <新分支名称>。或者撤销这个操作:git switch -.您可以通过将配置变量“advice.detachedHead”设置为“false”来关闭此提示。 HEAD 现在是 5975930 1

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