切换git分支没有文件签出

tig*_*tig 90 git branch git-checkout

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

为了使一切清楚:

我需要所有这些来上传文档到github.

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

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

CB *_*ley 99

是的,你可以这样做.

git symbolic-ref HEAD refs/heads/otherbranch
Run Code Online (Sandbox Code Playgroud)

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

git reset
Run Code Online (Sandbox Code Playgroud)

  • 直接写入 HEAD 文件不太可靠。如果你在子目录中怎么办?对于分离的头(直接指向 SHA1 的头),请尝试以下操作:`git update-ref HEAD refs/heads/otherbranch` (2认同)
  • 如果你想从当前分支机构查看一个新分支,另一种方法是1.`git stash` 2.`git checkout -b otherBranch` 3.` git stash pop` (2认同)

小智 40

仅使用基本git命令:

这个答案比Charles的答案要长一些,但它只包含我能理解并因此记住的基本git命令,无需继续查找.

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

git checkout -b temp
Run Code Online (Sandbox Code Playgroud)

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

git reset <branch where you want to go>
Run Code Online (Sandbox Code Playgroud)

现在临时和其他分支指向同一个提交,你的工作目录没有受到影响.

git checkout <branch where you want to go>
Run Code Online (Sandbox Code Playgroud)

因为你的HEAD已经指向同一个提交,所以不会触及工作目录

git branch -d temp
Run Code Online (Sandbox Code Playgroud)

请注意,这些命令也可以从任何图形客户端获得.

  • 我更喜欢`git reset --soft <branch你要去的地方>`以避免更新索引 (7认同)
  • 我同意你的避免git管道命令和支持瓷器的策略. (7认同)

Tin*_*ino 17

为了读者的利益:

虽然我认为Charles Bailey的解决方案是正确的,但是当切换到不是本地分支的东西时,这个解决方案需要调整.还应该有一些方法如何使用易于理解的常规命令来完成它.这是我想出的:

git checkout --detach
git reset --soft commitish
git checkout commitish
Run Code Online (Sandbox Code Playgroud)

解释:

  • git checkout --detach是一样的git checkout HEAD^{},其背后离开当前分支并进入"分离的头状态".所以下一次修改HEAD不再影响任何分支.分离HEAD不会影响工作树和索引.
  • git reset --soft commitish然后移动HEAD到给定的SHA commitish.如果你想更新索引,请--soft离开,但我不建议这样做.这同样不会触及工作树,而(--soft)不会触及索引.
  • git checkout commitish然后再次附加HEAD到给定commitish(分支).(如果commitishSHA没有任何反应.)这也不会影响索引或工作树.

此解决方案接受引用提交的所有内容,因此这对于某些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'
Run Code Online (Sandbox Code Playgroud)

仅供参考,你可以在我的git别名列表中找到它.

  • @kyb [函数技巧是从另一个SO答案中窃取的](/sf/answers/490398891/)。而“$@”绝对不是这里的意思。使用 `$*` 代替 `$1`,这样 `git switch -fb` 就和 `git switch '-f b'` 一样了,这应该是一个错误。这样我就可以通过省略一些错误处理来缩短别名,例如 `!f() { [ 1 = $# ] || { 回显'WTF!'; 返回1;}; ..` (2认同)

Jak*_*ski 14

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

部分中有git-new-workdir工具contrib/可以帮助您解决此问题.


Gre*_*ill 8

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

git read-tree branch

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

git symbolic-ref HEAD refs/heads/branch


小智 7

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

echo"ref:refs/heads/MyOtherBranch"> .git/HEAD

  • 使用symbolic-ref命令为你做这件事可能更好:`git symbolic-ref HEAD refs/heads/MyOtherBranch` http://www.kernel.org/pub/software/scm/git/docs/git-象征性的,ref.html (13认同)