从分离的头部推动Git


77

我头昏脑胀,做了一些更改。我想用Git将这些更改推到这个独立的头上。我不希望我的更改进入开发分支,当然也不要进入主分支。我正在与另一个人一起处理文件。

示例分支

   develop
   master
   *(HEAD detached at origin/49792_testMocha)

我如何在不影响开发或掌握的情况下努力奋斗?


HEAD不是您要推动(或推入)的东西。它是当前分支的别名,或者(在这种情况下)是其他分支中最后一次提交以外的无名提交的别名。您需要创建一个分支,以便可以与其他存储库共享(推送)。
保罗·希克斯

Answers:


64

使用创建一个新分支 git checkout -b BRANCH_NAME

然后将新分支推送到远程: git push origin BRANCH_NAME


@LMS答案就是我们想要的
Arnaud P

您可以在reflog中看到分支名称吗?
灰色,

@Gray您可以在创建分支后看到BRANCH_NAME使用git reflogBRANCH_NAME可以是您想要的任何名称。
J. Titus

193

如果您的头部处于分离状态,并且想要推送到远程分支

git push origin HEAD:name-of-your-branch

否则,您可以创建一个新分支并推送到该分支(它将自动创建)

git branch new-branch-name
git push -u origin new-branch-name

11
Sssso很有帮助,我登录SO只是为了支持它。
Sujit Y. Kulkarni

如果远程分支还不存在,则无法使用第一个命令进行推送。
Qwerty

使用第一个命令,您假设具有相同的远程分支。否则,您需要创建一个新分支并将其推送。
Mohamed Salem Lamiri

它的工作原理..带选项的好答案推送到远程或推送到新分支
aswzen

2
如果您的远程分支具有特殊名称,并且您收到以下消息:错误:无法推送到不合格的目标:branch-name目标refspec既不匹配远程服务器上的现有ref,也不以refs /开头,我们无法根据源引用猜测一个前缀。错误:无法将某些引用推送到'git@github.com:user / repo.git'您可以在分支名称前添加引用/头:git push origin HEAD:refs / heads / branch-name
bigbear3001

31

虽然这里的所有答案都可以回答原始问题(如何从分离的头部中推动而不影响其他分支),但所有这些都建议创建一个新分支。

以下是在创建新本地分支的情况下推送到新远程分支的方法:

git checkout --detach # (or anything else that leaves you with a detached HEAD - guillotine anyone?)
[change stuff & commit]
git push origin HEAD:refs/heads/my-new-branch

替换origin为适当的远程名称(您具有写访问权限),并my-new-branch替换为您希望调用新分支的任何名称。

您的提交HEAD将被推送到名为的新分支my-new-branch。🎉


我同意,这是一个很好的答案。+1。但是我的(stackoverflow.com/a/41790114/6309)仍然适用:尝试使用Git 2.11或更低版本进行segfault。
VonC

2
我不小心推了HEAD:refs/features/my-new-branch而不是使用HEAD:refs/heads/features/my-new-branch-我没有看到新的分支。在进行一些搜索之后,我找到了一种查看方法:git ls-remote并使用删除了它git push origin :refs/features/my-new-branch。希望它能对其他忘记了他们的人heads/
有所

有没有什至没有创建远程分支的方法?即将未引用的提交推送到远程,该提交只能由其SHA1引用,直到被垃圾回收为止?我猜想我们只能从远程获取由标签或分支引用的提交,但是我不确定,因此是问题。
Irfy

@Irfy-用例是什么?
马特

在数十个VM上编排重复部署,以确定最佳的进程参数,例如进程数vs每个进程的线程数vs VM vCPU数。这些更改不会持久存在,也没有有意义的历史可言,因此我不想污染分支名称空间-但我知道我仍然可以推送到临时分支并在以后进行修剪,这没有什么错这样,我希望没有分支的愿望可能是毫无根据的。
Irfy

3

git checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back

这将签出指向所需提交的新分支。
该命令将签出给定的提交。
此时,您可以创建一个分支,并从此开始工作。

# Checkout a given commit. 
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
#in order to be able to update the code.
git checkout <commit-id>

# create a new branch forked to the given commit
git checkout -b <branch name>

2

注意:更建议在git 2.11或更低版本使用segfault之前创建分支。

Git 2.12+(2017年第一季度)将不是这种情况

参见Kyle Meyer()的commit b10731f(2017年1月7日(由Junio C Hamano合并--commit b85f79c中,2017年1月18日)kyleam
gitster

branch_get_push:分离HEAD时不要进行段错误

git <cmd> @{push}”用于分离段的HEAD上;它已被纠正为错误并显示一条消息。

现在的错误将是:

HEAD does not point to a branch

使用Git 2.12或更高版本,您可以将分离的HEAD推到远程分支,如Matt答案所示


0

为该提交创建一个新分支,并检出该分支:git checkout -b <branch-name> <commit-hash>。现在,您可以将更改推送到新分支:git push origin <branch-name>

如果您需要从剩余的提交中清除另一个分支,请确保运行git reset --hard <branch-name>

这是一篇文章,说明分支头和分离头如何工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.