切换git分支没有文件签出

时间:2009-08-15 19:32:01

标签: git branch git-checkout

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

让事情变得清晰:

我需要所有这些才能将documentation上传到github。

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

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

11 个答案:

答案 0 :(得分:90)

是的,你可以这样做。

git symbolic-ref HEAD refs/heads/otherbranch

如果你需要在这个分支上提交,你也需要重置索引,否则你最终会根据最后签出的分支提交一些内容。

git reset

答案 1 :(得分:35)

仅使用基本git命令:

这个答案比Charles的答案要长一些,但它只包含我能理解并因此记住的基本git命令,无需继续查找。

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

git checkout -b temp

将标记重置(移动)到另一个分支而不更改工作目录:

git reset <branch where you want to go>

现在临时和其他分支指向相同的提交,并且您的工作目录未受影响。

git checkout <branch where you want to go>

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

git branch -d temp

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

答案 2 :(得分:14)

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

contrib/部分中有git-new-workdir工具可帮助您解决此问题。

答案 3 :(得分:11)

为了读者的利益:

虽然我认为Charles Bailey's solution是正确的,但是当切换到不是本地分支的东西时,这个解决方案需要调整。还应该有一些方法如何使用易于理解的常规命令来完成它。以下是我提出的建议:

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

说明:

  • git checkout --detachgit checkout HEAD^{}相同,后者保留当前分支并进入“分离头状态”。因此,HEAD的下一个修改不会影响任何分支。分离HEAD不会影响工作树和索引。
  • git reset --soft commitish然后将HEAD移动到给定commitish的SHA。如果您想更新索引,请离开--soft,但我不建议这样做。这同样不会触及工作树,而(--soft)不是索引。
  • git checkout commitish然后再次将HEAD附加到给定的commitish(分支)。 (如果commitish是SHA,则不会发生任何事情。)这也不会影响索引或工作树。

此解决方案接受引用提交的所有内容,因此这适用于某些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列表中找到它。

答案 4 :(得分:8)

我认为您正在寻找管道命令git read-tree。这将更新索引,但不会更新工作目录中的任何文件。例如,假设branch是要读取的分支的名称:

git read-tree branch

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

git symbolic-ref HEAD refs/heads/branch

答案 5 :(得分:7)

您可以使用其他分支名称覆盖HEAD文件:

echo“ref:refs / heads / MyOtherBranch”&gt;的.git / HEAD

答案 6 :(得分:0)

有这么多文件,你可能最好只保留两个回购,每个分支一个。您可以根据需要来回移动更改。这比使用git玩坏血病技巧更不令人惊讶。

答案 7 :(得分:0)

如果您只想尝试更改远程分支所指向的位置,则可以使用“git push”执行此操作,而无需触及本地副本。

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

  

&lt; refspec&gt;的格式参数是可选的加+,后跟源ref&lt; src&gt;,后跟冒号:,后跟目标ref&lt; dst&gt;。它用于指定什么&lt; src&gt;对象&lt; dst&gt;远程存储库中的ref将被更新。

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

git push origin c5f7eba:foo

不确定这是不是你想要的。

答案 8 :(得分:0)

你可以利用

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

previous-branch-commit-id是您要复制旧数据的提交。

答案 9 :(得分:0)

或者只是使用补丁文件将您的其他分支打补丁到您的主服务器

git diff otherbranch master > ~/tmp/otherbranch.diff
git checkout master
git apply ~/tmp/otherbranch.diff

答案 10 :(得分:-1)

假设您想进入分支A,但要使用分支B中的文件

使用git log查找分支A的当前提交引用,例如“ 99ce9a2”,

<ObjectDataProvider x:Key="name"
    xmlns:core="clr-namespace:System;assembly=System.Runtime" 
    MethodName="GetValues"
    ObjectType="{x:Type core:Enum}">
    <ObjectDataProvider.MethodParameters>
        <x:Type TypeName="local:YourType"></x:Type>
    </ObjectDataProvider.MethodParameters>
</ObjectDataProvider>

您现在应该位于分支A上,其文件夹结构与B对应,并显示为未暂存的更改(历史记录未更改)。