【问题标题】:How to pull a git branch without checking it out?如何在不检查的情况下拉出 git 分支?
【发布时间】:2015-07-05 21:29:24
【问题描述】:

我在定期工作的存储库(发布 + 开发)中有 2 个分支。但是,在分支之间切换时会触发我的项目中的长时间构建(我说的是大约 30 分钟),所以我宁愿避免在它们之间切换。为了在两者中工作,我创建了我的存储库的 2 个副本,并且工作正常。

但是,当我想合并更改时,我需要让发布分支活动一段时间以拉取更改。然后我可以切换回开发,进行合并和提交。但是,正如我在上面所写的,此开关将导致长时间的重建。是否有另一种方法可以在不先激活分支的情况下拉取分支?

【问题讨论】:

  • 为什么签出一个新的分支会触发一个构建?如果您确实提交到分支,我可以看到想要进行构建,但是结帐根本不会修改存储库,只会修改您的工作目录。
  • 签出本身不会触发构建,但下次我构建时发现太多文件被触摸,因此重新编译了许多不必要的文件。
  • 您不能在构建之前再次查看master 吗?这不是git 真正的问题,但两个分支中的代码之间显然存在很大差异。
  • 签出另一个分支不会“取消接触”文件。当从 dev 切换到 release 进行合并然后回到 dev 时,会触及很多文件。您无法撤消该操作。 IMO 这是 git 中最薄弱的地方之一(就地切换分支)。

标签: git


【解决方案1】:

我最终得到了我的存储库的另一个副本,仅用于合并。由于此文件夹中没有进行任何构建,因此我可以毫无问题地在分支之间切换。一旦所有合并完成并被推送,我就可以将它们拉到各个工作文件夹中。

【讨论】:

    【解决方案2】:

    如果你想pull远程仓库中的一个分支,进入你当前的分支,你不需要切换。

    如果我理解正确,您有一个带有release 的回购,另一个带有dev 的回购,您正在其中工作。当您在 dev 中处理完某些内容后,您希望将其合并到 release 中,而无需签出 release

    我想您在两个存储库中都设置了遥控器,以便两者可以相互引用。

    cd 到您的 release 存储库。从dev repo 中获取更改:

    git fetch <dev_remote> <branch>
    

    您现在在 release 存储库中有更新的 dev 分支,尽管您不需要检查它。但是请注意,更新后的 dev 分支的名称包含:remote 的名称、斜杠,然后是 分支的名称 .这是一个远程分支,它在gitk 中以两种颜色显示,在remotes/&lt;remote_name&gt;/&lt;branch&gt;git branch -a 中显示。

    将更新后的分支合并到您本地的release 分支:

    git merge <dev_remote>/<branch>
    

    你有它。没有checkout,但你的release repo 中的release 分支已经合并了dev 的内容。

    这是为了原则。现在您可以一步完成:

    cd <release_repo> # you are on the release branch
    git pull <dev_remote> <branch_name_in_dev_remote>
    

    您在dev_remote 中的分支将被提取,并合并到您当前在release 存储库中签出的分支中。


    同样,您需要使用 release 中的新合并提交来更新您的 dev 存储库:

    cd <dev_repo> # you are on the dev branch
    git pull <release_remote> <branch_name_to_pull>
    

    【讨论】:

    • 我明白了。您的基本想法是将远程发布分支拉到本地开发分支中,这不完全是我所要求的(因为本地未签出的发布分支不会由此更新),但至少它避免了切换分支机构。谢谢。
    • 是的,这就是为什么您需要在两个存储库中拉取远程分支的原因。如果要更新dev repo 中的本地release 分支,请将目标本地分支添加到fetchgit fetch &lt;rel_repo&gt; &lt;remote_release_branch&gt;:release。这将更新您的本地参考。但是如果你无论如何都不想检查它,我不知道你会用它做什么。
    【解决方案3】:

    您可以fetch 远程更改。这将从远程存储库下载所有更改,但不会做更多。但是,如果您想将 merge 分支 A 分支到 B 分支,则必须先检查 B

    git pull 只不过是 git fetchgit merge 的组合

    【讨论】:

    • 你可以很好地合并一个分支而不检查它。您签出要合并的分支,然后是git merge &lt;branch_to_merge&gt;。我误会你了吗?
    • 如果你想将 A 合并到 B 中,那么我必须检查 B 才能合并来自 A 的更改。将 A 合并到 B 的唯一可能性是 A 是快进合并.
    • 我认为这很好。在另一个版本中,我已在一个文件夹中签出。所以我可以进行发布、提交+推送。在另一个文件夹中,我拉出发布(不签出)并合并到开发(签出)。工作完成了。这就是您所说的应该与 fetch 一起使用吗?
    • 我是你的文件夹,你有release 分支,你将执行git fetchgit merge develop。在那里你不必检查开发分支。但是您必须从签出delevop 的文件夹中推送您的更改
    • @xxMUROxx:“如果你想将 A 合并到 B,那么我必须检查 B 才能合并来自 A 的更改。”确切地。您在答案中所写的内容(“但是如果之前未检出它,您将无法合并分支。”)意味着您必须在合并之前检出 A。
    猜你喜欢
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 2017-12-10
    • 1970-01-01
    • 2010-10-03
    • 2019-01-04
    • 1970-01-01
    • 2013-12-13
    相关资源
    最近更新 更多