是否可以在git中切换到另一个分支而不检出所有文件?切换分支后,我需要删除所有文件,重新生成它们,提交并切换回来。因此,检出文件只是浪费时间(并且有大约14000个文件 - 这是一个很长的操作)。
让事情变得清晰:
我需要所有这些才能将documentation上传到github。
我有gh-pages分支的回购。当我在本地重建文档时,我将其复制到repo目录,提交并推送到github。但我并不高兴,因为我在本地有两份文件。我决定创建空分支并在提交后切换为空并删除文件。但转回来是一个漫长的操作 - 所以我问了这个问题。
我知道我可以离开gh-pages分支并删除文件,但我不喜欢脏工作树)
答案 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 --detach
与git 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对应,并显示为未暂存的更改(历史记录未更改)。