代码之家  ›  专栏  ›  技术社区  ›  tig Charlie Martin

在不签出文件的情况下切换Git分支

  •  78
  • tig Charlie Martin  · 技术社区  · 15 年前

    在Git中,是否可以切换到另一个分支而不签出所有文件?切换分支后,我需要删除所有文件,重新生成它们,提交并切换回。所以签出文件只是浪费时间(大约有14000个文件——这是一个长期的操作)。

    要让一切都清楚:

    我需要所有这些上传 documentation 到Github。

    我和GH页面分部有回购协议。当我在本地重建文档时,我将其复制到repo目录,提交并推送到github。但我不高兴,因为我在本地有两份文档副本。我决定创建一个空分支,在提交之后切换到空分支并删除文件。但是切换回来是一个长期的操作-所以我问了这个问题。

    我知道我可以离开gh pages分支并删除文件,但我不喜欢脏的工作树)

    9 回复  |  直到 7 年前
        1
  •  87
  •   CB Bailey    15 年前

    是的,你可以这样做。

    git symbolic-ref HEAD refs/heads/otherbranch
    

    如果您需要在这个分支上提交,您也需要重置索引,否则您最终将基于上次签出的分支提交一些内容。

    git reset
    
        2
  •  33
  •   user1115652    8 年前

    仅使用基本git命令:

    这个答案比查尔斯的要长一点,但是它仅仅由基本的git命令组成,我可以理解并记住这些命令,从而消除了继续查找它的必要性。

    标记当前位置(如果需要,请先提交):

    git checkout -b temp
    

    重置(移动)标记到另一个分支,而不更改工作方向:

    git reset <branch where you want to go>
    

    现在temp和其他分支指向同一个commit,而您的工作目录则保持不变。

    git checkout <branch where you want to go>
    

    因为您的头已经指向同一个提交,所以不会触及工作目录。

    git branch -d temp
    

    请注意,这些命令也很容易从任何图形客户端获得。

        3
  •  14
  •   Jakub Narębski adamtaub    15 年前

    拥有两个工作目录(两个工作区域)和一个存储库,甚至是两个存储库,不是更好的解决方案吗?

    git-new-workdir 工具在 contrib/ 帮助您完成此操作的部分。

        4
  •  9
  •   Tino    7 年前

    为了读者的利益:

    当我认为 Charles Bailey's solution 是正确的,当切换到某个非本地分支时,此解决方案需要进行调整。此外,还应该有一些方法来使用易于理解的常规命令。我想到的是:

    git checkout --detach
    git reset --soft commitish
    git checkout commitish
    

    解释:

    • git checkout --detach 是一样的 git checkout HEAD^{} 离开当前分支,进入“分离头状态”。所以下一次修改 HEAD 不再影响任何分支。拆卸 不影响工作树和索引。
    • git reset --soft commitish 然后移动 给给定的sha commitish . 如果您也要更新索引,请离开 --soft 离开,但我不建议这样做。同样,这不会碰到工作树,而且( --柔软 )不是索引。
    • git checkout commitish 然后连接 到给定的 共产党员 (分支)再次。(如果 共产党员 这也不会影响索引和工作树。

    此解决方案接受引用提交的所有内容,因此对于某些 git 别名。这个 rev-parse 下面只是一个测试,以确保在链中没有任何中断,这样打字员就不会意外地切换到分离的头部状态(错误恢复将是非常复杂的)。

    这导致了 git switch treeish 别名:

    git config --global alias.switch '!f() { git rev-parse --verify "$*" && git checkout "HEAD^{}" && git reset --soft "$*" && git checkout "$*"; }; f'
    

    仅供参考,您可以在我的列表中找到它 git aliases .

        5
  •  8
  •   user157005    15 年前

    可以用不同的分支名称覆盖头文件:

    echo“参考:refs/heads/myotherbranch”>.git/head

        6
  •  8
  •   Greg Hewgill    15 年前

    我想你在找管道指挥部 git read-tree .这将更新索引,但不会更新工作目录中的任何文件。例如,假设 branch 要读取的分支的名称:

    git read-tree branch

    如果您想提交到刚刚阅读的分支,那么还需要:

    git symbolic-ref HEAD refs/heads/branch
        7
  •  0
  •   Norman Ramsey    15 年前

    有了这么多文件,您最好只保留两个回购,每个分支一个。您可以根据需要前后拉动更改。这比和吉特玩坏血病的把戏更让人吃惊。

        8
  •  0
  •   Tim Abell    14 年前

    如果您只是想更改远程分支点的位置,那么可以使用“git push”进行更改,而无需触摸本地副本。

    http://kernel.org/pub/software/scm/git/docs/git-push.html

    参数<refspec>的格式是可选的加号+,后面是源引用<src>,后面是冒号:,后面是目标引用<dst>。它用于指定远程存储库中的<src>对象的<dst>引用要更新的内容。

    例如,要更新foo以提交c5f7eba,请执行以下操作:

    git push origin c5f7eba:foo
    

    不知道你到底想不想这样。

        9
  •  0
  •   Haseena Parkar    7 年前

    你可以利用

          1. git checkout -f <new-branch>
          2. git cherry-pick -x <previous-branch-commit-id>
    

    上一个分支提交ID是要从中复制旧数据的提交。