Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在不签出文件或更新任何引用的情况下将头移动到Git中的其他分支?_Git - Fatal编程技术网

如何在不签出文件或更新任何引用的情况下将头移动到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(但不提交到当前分支)
  • 您的
    .git
    只是一个符号链接,现在您可以从其他workdir访问它(我已经知道git new workdir可以正常工作)

  • 因此,您需要手动选择下一次提交应具有的父级以及它应更新的引用。

    您不需要
    HEAD
    是一个符号引用,它应始终指向当前签出的提交,即工作副本中的内容。 您永远不应该手动操作参照——只有在您真正知道自己在做什么的情况下,才可以使用管道命令来处理参照

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

    git 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
      显示
      HEAD
      的ref日志(您将再次看到选项
      -m
      中给出的注释)。完整文件(包括在SHA之前和之后的文件,以防您想找到丢失的提交)存储在
      $(git rev parse--git dir)/logs/HEAD
      (for
      HEAD
    • git show ref--heads
      列出了可以在RHS上使用的所有ref。如
      别名
      所示,您可以将其与
      一起使用--verify
      来检查参数是否是正确的(现有的)引用(也称为分支)
    • 注意:
      git symbolic ref
      可以指向任何其他ref,如
      refs/tags/
      refs/remotes/
      ,甚至可以指向打包的ref。这可能不是您想要的,因此别名将其限制为
      refs/heads/

    当我使用Git做一些棘手的事情时,经常需要它(还包括
    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
    这将更改当前指向的ref
    HEAD
    。它也将只为下一次提交设置父级,而不是要更新的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'