在一个独立的头脑中做出的承诺该怎么办

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

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

259721 次浏览

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

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

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

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

git branch brand-name

或者只是一个标签:

git tag tag-name

你可以这样做。

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

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

这就是我所做的:

基本上,可以把detached HEAD看作一个没有名字的新分支。你可以像其他分支一样提交到这个分支。一旦你完成了提交,你想把它推到遥控器。

所以你需要做的第一件事是给这个detached HEAD一个名字。你可以很容易地像这样做,而在这个detached HEAD上:

git checkout -b some-new-branch

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

在我的例子中,我还想快进这个分支,连同我在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 the current state of master to my changes

当然,我后来将它合并为master

差不多就是这样。

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

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

git branch  temp
git checkout master
git merge temp

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

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

有了这些,你将重写你的分支,所以确保这些更改不会打扰任何人。一定要看一下这篇文章,以更好地说明分离的头状态。

或者,您可以在分支上选择commit-id。

<commit-id> made in detached head state

git checkout master

git cherry-pick <commit-id>

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

结帐actual-branch

Git合并\{\{commit-hash}}

当我做了导致分离头部的签出,git实际上告诉我在这种情况下该怎么做:

git switch -c \<new-branchname>

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

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

  1. 用两次提交创建一个testrepo:
~/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 and diese committe, und Sie können alle möglichen承诺,die Sie in diesem Zustand machen, ohne Auswirkungen auf irgendeinen verwerfen分支,indem Sie zu einem anderen Branch wechseln.

.

我爱你,我爱你möchten,我爱你 提交zu代表,können Sie das (jetzt oder später) durch Nutzung von 'switch' mit der Option -c tun。Beispiel: < / p >

git switch -c \<neuer-Branchname>

Oder um diese操作rückgängig zu machen: git开关-

Sie können diesen Hinweis ausschalten, indem Sie die konfigationsvariable 'advice.detachedHead' auf 'false' setzen.

. db0

头部喷气机5795930

翻译成英语是:

注意:更改为'5975930'。

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

如果你想创建一个新的分支来保存你创建的提交,你可以(现在或以后)通过使用'switch'和-c选项来实现。 例子:< / p >

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

或取消该操作:git switch -。

你可以通过设置配置变量'advice.detachedHead'为'false'来关闭这个提示。

HEAD现在在5975930 1

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

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

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

我怎么得到它?

  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

你看,这就是你一直在寻找的宝藏……散列。

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