123

在 Git 中是否可以在不检查所有文件的情况下切换到另一个分支?

切换分支后,我需要删除所有文件,重新生成它们,提交并切换回来。所以签出文件只是浪费时间(大约有 14,000 个文件 - 这是一个很长的操作)。

为了让一切都清楚:

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

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

我知道我可以留在gh-pages分支上并删除文件,但我不喜欢肮脏的工作树。

4

11 回答 11

136

是的,你可以这样做。

git symbolic-ref HEAD refs/heads/otherbranch

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

git reset
于 2009-08-15T21:29:30.570 回答
56

仅使用基本的 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

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

于 2012-07-01T02:08:26.423 回答
33

在 v2.24git switch中类似于安全的git checkout.
因此,我将下面的别名重命名git hop
“在不更改工作树的情况下跳上分支”

为了读者的利益:

虽然我认为Charles Bailey 的解决方案是正确的,但当切换到某个不是本地分支的东西时,这个解决方案需要进行调整。还应该有一些方法可以使用易于理解的常规命令来做到这一点。这是我想出的:

git checkout --detach
git reset --soft commitish
git checkout commitish

解释:

  • git checkout --detachgit checkout HEAD^{}将当前分支留在后面并进入“分离头状态”相同。所以下一次修改HEADno more 会影响任何分支。分离HEAD不会影响工作树或索引。
  • git reset --soft commitish然后移动HEAD到给定的 SHA commitish。如果您也想更新索引,请--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'

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

于 2017-07-12T14:10:30.270 回答
14

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

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

于 2009-08-16T08:54:36.183 回答
12

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

git 读取树分支

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

git symbolic-ref HEAD refs/heads/branch
于 2009-08-15T21:31:03.563 回答
7

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

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

于 2009-08-15T19:55:05.677 回答
1

或者只是使用补丁文件从您的另一个分支修补到您的主分支

git diff otherbranch master > ~/tmp/otherbranch.diff
git checkout master
git apply ~/tmp/otherbranch.diff
于 2020-08-19T12:31:22.403 回答
0

有这么多文件,最好只保留两个存储库,每个分支一个。您可以根据需要来回拉取更改。这不会比试图用 git 玩坏血病的把戏更令人惊讶。

于 2009-08-15T22:15:49.307 回答
0

如果您只是尝试更改远程分支指向的位置,则可以使用“git push”来完成,而无需触及本地副本。

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

<refspec> 参数的格式是可选的加号 +,后跟源 ref <src>,后跟冒号 :,后跟目标 ref <dst>。它用于指定要更新远程存储库中的 <dst> 引用的 <src> 对象。

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

git push origin c5f7eba:foo

不知道这是否是你所追求的。

于 2010-02-04T16:16:20.020 回答
0

你可以利用

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

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

于 2017-02-22T05:22:11.007 回答
0

假设您想在分支 A 中,但使用分支 B 中的文件

使用 git log 找到分支 A 的当前提交 ref,例如“99ce9a2”,

git checkout A
git reset --hard B
git reset 99ce9a2

您现在应该在分支 A 上,其文件夹结构对应于 B,显示为未暂存的更改(A 历史记录未更改)。

于 2020-06-16T14:04:31.490 回答