如何将“提交”从“无分支”移动到实际分支?

时间:2012-01-21 13:10:48

标签: git merge branch commit git-branch

我犯了一个错误,并开始提交“到最后一个标签”,这使我的提交落入“无分支”。它们本应应用于现有分支机构的负责人。我已经推送了我的更改。我在错误的分支中提交了一些其他问题,但现在我有没有分支,所以我不知道如何处理这个问题。 / p>

最好,我想彻底清除我的错误,并将我的更改“移动”到右分支的末尾。如果我必须在历史中留下我的错误,我需要至少合并它们。

6 个答案:

答案 0 :(得分:66)

您目前处于分离的HEAD 状态。要解决此问题,您只需创建一个包含git branch <branchname>git checkout -b <branchname>的新分支即可。这将为您提供一个可以玩的本地分支,甚至可以在完成后删除。

git中的分支只是指针提交,所以如果你创建一个新的分支,你的新分支将指向你当前的提交,然后你可以合并它或什么。

您的“错误”需要被删除,您只需在之前的提交之上创建新的提交。您没有修改历史记录或类似内容。

编辑:在回复您的评论时,您需要做的是:

git branch temp
git checkout master # or any other branch
git merge temp
git branch -d temp

答案 1 :(得分:16)

您可以使用git reflog

查看所有提交内容

所以你可以直接进入另一个分支,并为所需的提交做git cherry-pick <commit-hash>

但我更喜欢提到spatz的分支方式。

答案 2 :(得分:7)

注意:您还

enter image description here

在这两种情况下,执行tmp分支并将其合并回实际分支是解决方案。

答案 3 :(得分:5)

另一个不涉及创建临时分支的解决方案被描述为here。你只需要与最后一次提交而不是临时分支合并。

$ git checkout master
$ git merge d2bdb98

如果您不知道自己的提交方式,可以使用git log找到它。我不知道这个解决方案是否与“挑选樱桃”不同,但它对我有预期的结果。

答案 4 :(得分:1)

我只是遇到了一个我想要提交的master分支的情况,但是意外地提交了一个分离的HEAD(注意,提交哈希在这里并不重要,但只是为了说明情况):

$ git branch
* (detached from 29d2cfb)
  master

以下是我的快速解决方法:

$ git branch -f master HEAD
$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

一块蛋糕。

请注意,只有当master最初指向您错误提交的同一提交时,此技巧才有效。如果情况并非如此,那么您将不得不重新定义(或挑选或合并......)。

答案 5 :(得分:1)

为了提供另一种解决方案,您可以使用一种变基形式(我相信这将是您实际问题的最准确答案)。这个解决方案实际上会将提交从一个地方移动到另一个地方,而不是合并。

与 rebase 一样,该命令不包括对提交的引用,而是对提交的父项的引用。例如,使用“$ git rebase master”在 master 分支之上对特性分支进行简单的 rebase 是“$ git rebase master feature”的简写,意思是“获取 master 和 feature 的共同提交,考虑该提交作为旧的父提交,并用新的父提交替换旧的父提交;就是主人的头颅。”自动结果是提交从一个分支移动到另一个分支。这个基本场景向您展示了为什么 rebase 关注提交的父项,而不是“移动提交”。 (我希望这有助于作为对以下内容的介绍。)

对于您的情况,解决方案的逻辑相似,但该命令涉及--onto 标志并使用提交哈希而不是分支名称。 (这是完全相同的,因为分支只是指向提交。)如果您确定您从其分支的提交(例如 sha1)的提交哈希,那将是“旧父级”。新的父项将是提交哈希,即您提到的分支的头部;我们称之为 sha2。那么你的问题的解决方案是

$ git rebase —到 sha2 sha1

用新父代替换旧父代,这实质上是将提交提交到您想要的分支。

到这里你的问题基本上得到了回答,因为这会移动提交,但是使用这个解决方案你仍然会处于分离的状态。对于那些最后的步骤,有许多不同的方法。我建议使用 $ git checkout -b temp; $ git checkout yourbranch; $ git merge temp; $ git branch -D temp;

最后的步骤不是那么有趣,但我敦促大家对 git rebase —onto 命令有一个深入的了解。这是问题的本质,也是未来的宝贵技能:)

相关问题