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

在不签出文件的情况下切换Git分支,git,branch,git-checkout,Git,Branch,Git Checkout,在Git中是否可以在不签出所有文件的情况下切换到另一个分支 切换分支后,我需要删除所有文件,重新生成它们,提交并切换回。因此,签出文件只是浪费时间(大约有14000个文件,这是一个漫长的操作) 要说清楚: 我需要所有这些上传到GitHub 我与gh pages分支机构有一个存储库。在本地重建文档时,我将其复制到存储库目录,提交并推送到GitHub。但我不高兴,因为我在当地有两份文件。我决定创建一个空分支,提交后,切换到empty并删除文件。但是切换回来是一个漫长的过程,所以我问了这个问题 我知道

在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
    git checkout HEAD^{}
    相同,它将当前分支留在后面并进入“detached HEAD状态”。因此,
    HEAD
    的下一次修改不再影响任何分支。分离
    HEAD
    不会影响工作树或索引
  • git reset——软提交
    然后将
    移动到给定的
    提交
    的SHA。如果您还想更新索引,请将
    --soft
    离开,但我不建议这样做。这同样不会触及工作树,(
    --soft
    )也不会触及索引
  • git checkout commitish
    然后再次将
    HEAD
    附加到给定的
    commitish
    (分支)上。(如果
    commitish
    是SHA,则不会发生任何事情。)这也不会影响索引或工作树
此解决方案接受所有涉及提交的内容,因此这对于某些
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