切换git分支没有文件签出

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

为了使一切清楚:

我需要所有这些将文档上传到github。

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

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

是的,你可以做到这一点。

git symbolic-ref HEAD refs/heads/otherbranch 

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

 git reset 

仅使用基本的git命令:

这个答案比查尔斯有点长,但是它只包含了我能理解并记住的基本的git命令,不需要继续查找它。

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

 git checkout -b temp 

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

 git reset <branch where you want to go> 

现在temp和其他分支指向相同的提交,并且你的工作目录是不变的。

 git checkout <branch where you want to go> 

因为你的HEAD已经指向了同样的提交,所以工作目录没有被触及

 git branch -d temp 

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

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

contrib/ section中有git-new-workdir工具来帮助你。

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

echo“ref:refs / heads / MyOtherBranch”> .git / HEAD

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

  git阅读树分支 

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

  git symbolic-ref HEAD refs / heads / branch 

为了读者的利益:

虽然我认为Charles Bailey的解决scheme是正确的,但是这个解决scheme需要调整,而不是本地分支。 也应该有一些方法如何使用通俗易懂的命令。 这是我想出来的:

 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放弃 – 但我不build议这样做。 这又一次不触及工作树,( – --soft )不是索引。
  • git checkout commitish然后将头添加到给定的commitish (分支)。 (如果commitish是SHA,则不会发生任何事情)。这也不会影响索引或工作树。

这个解决scheme接受引用一个提交的所有东西,所以这对于一些git别名是理想的。 下面的rev-parse只是一个testing,确保链中没有任何东西被打破,这样错别字就不会意外地转换成分离头部状态(错误恢复会更加复杂)。

这导致下面的git switch treeish别名:

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

仅供参考,你可以在我的git别名列表中find它。

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

如果你只是想改变远程分支的位置,你可以使用“git push”来完成,而不需要触摸本地副本。

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

参数<refspec>的格式是一个可选的plus +,后面跟着source ref <src>,后跟一个冒号:,后面跟着目的地ref <dst>。 它用于指定远程存储库中<dst> ref的<src>对象将被更新。

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

 git push origin c5f7eba:foo 

不知道如果这是你以后的事情。

你可以利用

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

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