7

我通常按echo ref: refs/heads/new_branch > .git/HEAD​​ . 如何正确地做到这一点?

一些用例:

  1. 您从其他位置导入了源代码,现在想要将其提交到 Git(但不是当前分支)。
  2. .git只是一个符号链接,现在您正在从其他 workdir 访问它(我已经知道 git-new-workdir 可以正确执行它)

因此,您想手动选择下一次提交应该有哪个父级以及它应该更新什么 ref。

4

4 回答 4

5

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/.
于 2015-05-18T19:19:53.933 回答
3

git reset --soft $branch_to_make_HEAD

man git reset--soft关于选项的文档:

完全不触及索引文件或工作树(但将头部重置为<commit>,就像所有模式一样)。正如 git status 所说,这会使您所有更改的文件都“提交更改”。

于 2013-05-16T19:29:18.337 回答
1
git checkout -B existing_or_new_branch # HEAD by default
git reset       existing_branch@{1}    # or anywhere else for a new_branch
于 2015-04-17T22:41:47.913 回答
0

你没有。HEAD是一个符号引用,它始终指向当前签出的提交,即工作副本中的内容。你永远不应该手动操作 refs - 如果你真的知道你在做什么,只能使用管道命令来弄乱它们。

这可能是XY 问题的一个例子——即你认为你知道如何解决你的问题并寻求帮助,但可能有更好的方法来做到这一点(只有没有人能告诉你,因为你没有不要问你的实际问题)。不过,我可能错了:D

于 2013-05-16T13:32:47.917 回答