在不签出文件的情况下切换Git分支
在Git中是否可以在不签出所有文件的情况下切换到另一个分支 切换分支后,我需要删除所有文件,重新生成它们,提交并切换回。因此,签出文件只是浪费时间(大约有14000个文件,这是一个漫长的操作) 要说清楚: 我需要所有这些上传到GitHub 我与gh pages分支机构有一个存储库。在本地重建文档时,我将其复制到存储库目录,提交并推送到GitHub。但我不高兴,因为我在当地有两份文件。我决定创建一个空分支,提交后,切换到empty并删除文件。但是切换回来是一个漫长的过程,所以我问了这个问题在不签出文件的情况下切换Git分支,git,branch,git-checkout,Git,Branch,Git Checkout,在Git中是否可以在不签出所有文件的情况下切换到另一个分支 切换分支后,我需要删除所有文件,重新生成它们,提交并切换回。因此,签出文件只是浪费时间(大约有14000个文件,这是一个漫长的操作) 要说清楚: 我需要所有这些上传到GitHub 我与gh pages分支机构有一个存储库。在本地重建文档时,我将其复制到存储库目录,提交并推送到GitHub。但我不高兴,因为我在当地有两份文件。我决定创建一个空分支,提交后,切换到empty并删除文件。但是切换回来是一个漫长的过程,所以我问了这个问题 我知道
我知道我可以直接离开gh pages分支并删除文件,但我不喜欢脏兮兮的工作树。您可以用不同的分支名称覆盖头文件: echo“ref:refs/heads/MyOtherBranch”>.git/HEAD是的,您可以这样做
git symbolic-ref HEAD refs/heads/otherbranch
如果您需要在此分支上提交,您还需要重置索引,否则您将根据最后签出的分支提交某些内容
git reset
我想你在找管道指挥部。这将更新索引,但不会更新工作目录中的任何文件。例如,假设
branch
是要读取的分支的名称:
git read-tree branch
git读取树分支
如果要提交到刚才阅读的分支,还需要:
git symbolic-ref HEAD refs/heads/branch
git symbolic ref HEAD refs/heads/branch有这么多文件,最好只保留两个repo,每个分支一个。您可以根据需要前后拉动更改。这比试图用git玩卑鄙的把戏要不那么令人惊讶。用一个存储库甚至两个存储库创建两个工作目录(两个工作区域)不是更好的解决方案吗
contrib/
部分中有一个工具可以帮助您实现这一点。如果您只是想更改远程分支的指向,您可以使用“git push”来完成,而不必触摸本地副本
参数的格式是可选的加号+,后跟源引用,后跟冒号:,后跟目标引用。它用于指定要用什么对象更新远程存储库中的ref
例如,要更新foo以提交c5f7eba,请执行以下操作:
git push origin c5f7eba:foo
不确定这是否是您想要的。仅使用基本git命令: 这个答案比Charles的要长一点,但它只包含基本的git命令,我可以理解并记住这些命令,无需继续查找 标记当前位置(如果需要,请先提交): 在不更改工作方向的情况下,将标记重置(移动)到其他分支:
git reset <branch where you want to go>
请注意,这些命令也可以从任何图形客户端轻松获得。您可以使用
1. git checkout -f <new-branch>
2. git cherry-pick -x <previous-branch-commit-id>
1。git签出-f
2.git cherry pick-x
previous branch commit id是要从中复制旧数据的提交
在v2.24中,git开关类似于安全的git签出
因此,我将下面的别名重命名为git-hop
for“跳到分支上而不更改工作树” 为了读者的利益: 虽然我认为这是一个正确的解决方案,但当切换到某个不是本地分支的东西时,这个解决方案需要进行调整。此外,应该有一些方法,如何做到这一点与常规命令是容易理解的。以下是我的想法:
git checkout --detach
git reset --soft commitish
git checkout commitish
解释:
与git checkout--detach
相同,它将当前分支留在后面并进入“detached HEAD状态”。因此,git checkout HEAD^{}
的下一次修改不再影响任何分支。分离HEAD
不会影响工作树或索引HEAD
然后将git reset——软提交
移动到给定的头
的SHA。如果您还想更新索引,请将提交
离开,但我不建议这样做。这同样不会触及工作树,(--soft
)也不会触及索引--soft
然后再次将git checkout commitish
附加到给定的HEAD
(分支)上。(如果commitish
是SHA,则不会发生任何事情。)这也不会影响索引或工作树commitish
git
别名来说是理想的选择。下面的rev parse
只是一个测试,以确保链中没有中断,这样打字不会意外地切换到分离的头部状态(错误恢复将更加复杂)
这将导致以下git-hop-treeish
别名:
git config --global alias.hop '!f() { git rev-parse --verify "$*" && git checkout "HEAD^{}" && git reset --soft "$*" && git checkout "$*"; }; f'
仅供参考,您可以在我的列表中找到它。如果您想进入分支机构A,但有分支机构B的文件 使用git日志查找分支A的当前提交引用,例如“99ce9a2”
您现在应该在分支A上,其文件夹结构与B相对应,显示为未老化的更改(历史记录未更改)。或者只使用修补程序文件将其他分支修补到主分支
git diff otherbranch master > ~/tmp/otherbranch.diff
git checkout master
git apply ~/tmp/otherbranch.diff
最好使用symbolic ref命令执行此操作:
git symbolic ref HEAD refs/heads/MyOtherBranch
@GregHewgill,这是我所知道的将头移动到提交哈希的唯一方法。你能用git symbolic ref做到吗?“long”对你来说有多长?你在哪个平台上工作?您是否在网络上工作,例如使用NFS或其他文件共享?此练习的目的是什么?您是否希望有两个分支,一个具有详细的提交,另一个仅记录主要更改(粗粒度)?创建临时(或每个)分支可能更便宜
git checkout --detach
git reset --soft commitish
git checkout commitish
git config --global alias.hop '!f() { git rev-parse --verify "$*" && git checkout "HEAD^{}" && git reset --soft "$*" && git checkout "$*"; }; f'
git checkout A
git reset --hard B
git reset 99ce9a2
git diff otherbranch master > ~/tmp/otherbranch.diff
git checkout master
git apply ~/tmp/otherbranch.diff