如何在不签出文件或更新任何引用的情况下将头移动到Git中的其他分支?
我通常通过如何在不签出文件或更新任何引用的情况下将头移动到Git中的其他分支?,git,Git,我通常通过echo-ref:refs/heads/new\u branch>.git/HEAD来完成。如何做好这件事 一些用例: 您从其他位置导入了源代码,现在希望将其提交到Git(但不提交到当前分支) 您的.git只是一个符号链接,现在您可以从其他workdir访问它(我已经知道git new workdir可以正常工作) 因此,您需要手动选择下一次提交应具有的父级以及它应更新的引用。您不需要HEAD是一个符号引用,它应始终指向当前签出的提交,即工作副本中的内容。 您永远不应该手动操作参照——
echo-ref:refs/heads/new\u branch>.git/HEAD
来完成。如何做好这件事
一些用例:
.git
只是一个符号链接,现在您可以从其他workdir访问它(我已经知道git new workdir可以正常工作)因此,您需要手动选择下一次提交应具有的父级以及它应更新的引用。您不需要
HEAD
是一个符号引用,它应始终指向当前签出的提交,即工作副本中的内容。
您永远不应该手动操作参照——只有在您真正知道自己在做什么的情况下,才可以使用管道命令来处理参照
这可能是一个例子,例如,你认为你知道如何解决你的问题,并以这种方式寻求帮助,但可能有更好的方式来做(只有没有人能告诉你,因为你没有询问你的实际问题)。不过我可能错了:Dgit reset——软$branch\u to\u make\u HEAD
手动git重置
在--soft
选项上的文档:
根本不接触索引文件或工作树(但重置
头指向
,就像所有模式一样)。这就剩下你所有的时间了
更改文件“要提交的更改”,正如git status所说
用于此的
git
管道命令是
git symbolic-ref HEAD refs/heads/existing_branch
您不能进入分离头部状态(它需要ref,而不是SHA)。但是,您可以切换到不存在的ref(即未知分支)。为了防止出现这种情况,可以使用以下git alias
:
git config --global alias.switch '!f() { git show-ref --heads --verify "refs/heads/$1" && git symbolic-ref -m "switch to branch $1 not touching workdir" HEAD "refs/heads/$1"; }; f'
然后您可以像使用git开关现有分支一样使用它。请注意,您需要选项-m
来查看git reflog
中的条目,这通常是您想要的
注:
显示git reflog HEAD
的ref日志(您将再次看到选项HEAD
中给出的注释)。完整文件(包括在SHA之前和之后的文件,以防您想找到丢失的提交)存储在-m
(for$(git rev parse--git dir)/logs/HEAD
)HEAD
列出了可以在RHS上使用的所有ref。如git show ref--heads
所示,您可以将其与别名
来检查参数是否是正确的(现有的)引用(也称为分支)一起使用--verify
- 注意:
可以指向任何其他ref,如git symbolic ref
或refs/tags/
,甚至可以指向打包的ref。这可能不是您想要的,因此别名将其限制为refs/remotes/
refs/heads/
commit tree
和updateref
)。我希望在某些地方编辑历史记录和引用,而无需长时间签出文件,然后再将其签回。我通常希望在某些内容(例如,其他版本控制系统)更新我的工作副本时手动更改标头。我只需要告诉Git它已经是一个新分支,而不允许Git在workdir中写入文件。如果您只想创建一个新分支,Git checkout-b BRANCHNAME
将在不接触工作副本的情况下执行该操作,如果我想提交到其他(非当前)分支而不接触工作目录(外部程序已将工作目录切换到该分支)?我的方式:1.更改.git/HEAD以指向其他分支;2.git重置--mixed
--修复索引;3.git添加
和git提交
。这正是切换分支的方式(branch
+checkout
或checkout-b
)用于:1.git checkout-b NEWBRANCH
,2.git add
(可能使用-A
开关添加删除)和git commit
这将更改当前指向的refHEAD
。它也将只为下一次提交设置父级,而不是要更新的ref。我想要:1.不设置当前的ref,2.为下一次提交设置父级,3.设置将由commit更新的ref。是否等效于git checkout HEAD-B new_branch
在git分支-B
中,这是git checkout
的一个选项。很抱歉,当减少到只有一个时,我保留了错误的命令-已修复。git checkout-B existing_或_new_分支将existing_或_new_分支的ref更新为HEAD
,而echo ref:refs/heads/new_branch>.git/HEAD>
没有这个副作用。所以恐怕它走得太远了。谢谢@Tino我已经更新了我的答案。它现在由两个命令组成,而不仅仅是一个命令:-(
git config --global alias.switch '!f() { git show-ref --heads --verify "refs/heads/$1" && git symbolic-ref -m "switch to branch $1 not touching workdir" HEAD "refs/heads/$1"; }; f'