我通常是echo ref: refs/heads/new_branch > .git/HEAD
。怎么做得好?
一些用例:
.git
只是一个符号链接,现在您正在从其他workdir访问它(我已经知道git-new-workdir可以正确执行)因此,您希望手动选择下一次提交应具有的父级以及应由其更新的ref。
答案 0 :(得分:4)
此git
管道命令是
git symbolic-ref HEAD refs/heads/existing_branch
你不能进入分离头状态(它需要一个ref,而不是一个SHA)。但是,您可以切换到不存在的引用(也称为未知分支)。为了防止这种情况,可以使用以下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
(对于HEAD
)git show-ref --heads
列出了您可以在RHS上使用的所有引用。如alias
中所示,您可以将其与--verify
一起使用来检查参数是否是正确的(现有)引用(也称为分支)。git symbolic-ref
可以指向任何其他引用,例如refs/tags/
或refs/remotes/
,甚至可以指向内置的引用。这可能不是您想要的,因此别名将此限制为refs/heads/
。答案 1 :(得分:3)
git reset --soft $branch_to_make_HEAD
man git reset
选项上的 --soft
个文档:
根本不触摸索引文件或工作树(但重置 头部到
<commit>
,就像所有模式一样)。这留下了你所有的 已更改文件“要提交的更改”,因为git status会将其设置为。
答案 2 :(得分:1)
git checkout -B existing_or_new_branch # HEAD by default
git reset existing_branch@{1} # or anywhere else for a new_branch
答案 3 :(得分:0)
你没有。 HEAD
是一个符号引用,始终指向当前签出的提交,即工作副本中的内容。
你永远不应该手动操作refs - 如果你真的知道你在做什么,只能使用管道命令搞乱它们。
这可能是the XY Problem的情况 - 即您认为您知道如何解决问题并以这种方式寻求帮助,但可能有更好的方法(只有没人知道)你是因为你没有问过你的实际问题。不过我可能错了:D