切换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 --detach
和git 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是您想要从中复制旧数据的提交。