使用 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。
所以我的问题是如何将主分支与我的实际状态(分离头)合并
在你所在的地方创建一个分支,然后切换到 master 并合并它:
git branch my-temporary-work
git checkout master
git merge my-temporary-work
你可以做这样的事情。
# 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
确保这是您想要使用的命令
这就是我所做的:
基本上,将 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
,但这让我仍然处于分离状态,新分支没有接受我的更改。
你可以只做 git merge <commit-number>
或 git cherry-pick <commit> <commit> ...
正如 Ryan Stewart 所建议的,您还可以从当前 HEAD 创建一个分支:
git branch brand-name
或者只是一个标签:
git tag tag-name
git rev-parse HEAD
在分离的头部找到您的提交号
或者,您可以将提交 ID 挑选到您的分支上。
<commit-id> made in detached head state
git checkout master
git cherry-pick <commit-id>
没有临时分支,没有合并。
在分离 HEAD 的情况下,提交工作正常,除了没有命名分支得到更新。要使用您提交的更改更新主分支,请在您所在的位置创建一个临时分支(这样临时分支将拥有您在分离的 HEAD 中所做的所有提交更改),然后切换到主分支并将临时分支与大师。
git branch temp
git checkout master
git merge temp
我看到几乎每个人都提出了一个正在创建临时分支的解决方案。现在,需要承认,每当出现这种“以分离状态提交”的问题时,通常会在一次提交后检测到。并为那个微不足道的提交创建一个完整的分支 - 听起来太多了,对吧?尤其是在你已经在太多分支之间跳来跳去的项目中。
那有什么简单的方法呢?使用提交哈希!
我怎么得到它?
做一个 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
瞧:
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
你看到那里有你正在寻找的宝藏......哈希。
我想这涵盖了在带有悬空提交的分离状态下可能发生的所有可能场景。下次注意!!
一个简单的解决方法是为该提交创建一个新分支并签出它:git checkout -b <branch-name> <commit-hash>
。
这样,您所做的所有更改都将保存在该分支中。如果您需要从剩余提交中清理您的主分支,请务必运行 git reset --hard master
。
有了这个,您将重写您的分支,因此请确保不要因这些更改而打扰任何人。请务必查看这篇文章以更好地说明 detached HEAD 状态。
结帐实际分支
git 合并 {{提交哈希}}
也许不是最好的解决方案,(将重写历史)但您也可以执行 git reset --hard <hash of detached head commit>
。
当我结帐导致头部分离时,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 \
翻译成英语为:
注意:更改为“5975930”。您处于“分离的 HEAD”状态。您可以环顾四周,进行实验性更改并提交它们,并且您可以放弃在此状态下所做的任何可能的提交,而不会通过切换到另一个分支来影响任何分支。如果你想创建一个新的分支来保留你创建的提交,你可以通过使用带有 -c 选项的'switch'来做到这一点(现在或以后)。示例:git switch -c <新分支名称>。或者撤销这个操作:git switch -.您可以通过将配置变量“advice.detachedHead”设置为“false”来关闭此提示。 HEAD 现在是 5975930 1
(用www.DeepL.com/Translator翻译(免费版))