如何在没有签出文件或更新任何引用的情况下将HEAD移动到Git中的其他分支?

时间:2013-05-16 13:29:39

标签: git

我通常是echo ref: refs/heads/new_branch > .git/HEAD。怎么做得好?

一些用例:

  1. 您从其他位置导入了源代码,现在想将其提交到Git(但不是当前分支)。
  2. 您的.git只是一个符号链接,现在您正在从其他workdir访问它(我已经知道git-new-workdir可以正确执行)
  3. 因此,您希望手动选择下一次提交应具有的父级以及应由其更新的ref。

4 个答案:

答案 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