使用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。
所以我的问题是如何将主分支与我的实际状态(分离头)合并
答案 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>
结果像之前一样离开主节点,分离头部和包含在分离头部状态下工作时所做的所有提交的新分支。
要重现/测试/了解更多细节:
~/gittest$ git log --oneline
17c34c0 (HEAD -> master) 2
5975930 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)
我看到几乎每个人都提出了一个创建临时分支的解决方案。现在,人们需要承认,每当出现这种“以分离状态提交”的问题时,通常会在一次提交后检测到。并为那个微不足道的提交创建一个完整的分支 - 听起来太多了,对吧?尤其是在您已经在太多分支之间跳来跳去的项目中。
那么简单的方法是什么? 使用提交哈希!
我如何得到它?
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。
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
。”别担心,我已经为你提供了保障。您可以在两个地方找到提交哈希:
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
你看到了你正在寻找的宝藏......哈希。
我想这涵盖了在带有悬空提交的分离状态下可能发生的所有可能情况。下次小心!!