我通常按echo ref: refs/heads/new_branch > .git/HEAD
. 如何正确地做到这一点?
一些用例:
- 您从其他位置导入了源代码,现在想要将其提交到 Git(但不是当前分支)。
- 您
.git
只是一个符号链接,现在您正在从其他 workdir 访问它(我已经知道 git-new-workdir 可以正确执行它)
因此,您想手动选择下一次提交应该有哪个父级以及它应该更新什么 ref。
我通常按echo ref: refs/heads/new_branch > .git/HEAD
. 如何正确地做到这一点?
一些用例:
.git
只是一个符号链接,现在您正在从其他 workdir 访问它(我已经知道 git-new-workdir 可以正确执行它)因此,您想手动选择下一次提交应该有哪个父级以及它应该更新什么 ref。
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 switch existing_branch
. 请注意,您需要选择-m
在 中查看条目git reflog
,这通常是您想要的。
笔记:
git reflog HEAD
显示参考日志HEAD
(您将再次看到选项给出的评论-m
)。完整文件(包括前后 SHA,以防您想查找丢失的提交)存储在$(git rev-parse --git-dir)/logs/HEAD
(for HEAD
)git show-ref --heads
列出您可以在 RHS 上使用的所有参考。如中所示,alias
您可以使用它--verify
来检查参数是否是正确的(现有)参考(又名分支)。git symbolic-ref
可以指向任何其他类似的引用,refs/tags/
甚至可以指向refs/remotes/
打包的引用。这可能不是您想要的,因此别名将其限制为refs/heads/
.git reset --soft $branch_to_make_HEAD
man git reset
--soft
关于选项的文档:
完全不触及索引文件或工作树(但将头部重置为
<commit>
,就像所有模式一样)。正如 git status 所说,这会使您所有更改的文件都“提交更改”。
git checkout -B existing_or_new_branch # HEAD by default
git reset existing_branch@{1} # or anywhere else for a new_branch
你没有。HEAD
是一个符号引用,它始终指向当前签出的提交,即工作副本中的内容。你永远不应该手动操作 refs - 如果你真的知道你在做什么,只能使用管道命令来弄乱它们。
这可能是XY 问题的一个例子——即你认为你知道如何解决你的问题并寻求帮助,但可能有更好的方法来做到这一点(只有没有人能告诉你,因为你没有不要问你的实际问题)。不过,我可能错了:D