【问题标题】:How to 'git pull' into a branch that is not the current one?如何“git pull”到一个不是当前分支的分支?
【发布时间】:2013-09-30 10:28:34
【问题描述】:

当您在master 分支上运行git pull 时,它通常从origin/master 拉取。我在另一个名为newbranch 的分支中,但我需要运行一个命令,将git pull 从origin/master 转换为master,但我无法运行git checkout 来更改选定的分支,直到拉取完成后.有没有办法做到这一点?

为了提供一些背景知识,存储库存储了一个网站。我对newbranch 进行了一些更改,并通过将网站切换到newbranch 来部署它们。现在这些更改已在上游合并到 master 分支中,我也在尝试将网站切换回 master 分支。此时,newbranch 和origin/master 相同,但master 落后于origin/master,需要更新。问题是,如果我以传统方式进行:

$ git checkout master
   # Uh oh, production website has now reverted back to old version in master
$ git pull
   # Website is now up to date again

我需要实现与上述相同的 (git checkout master && git pull),但在此过程中无需将工作目录更改为较早的版本。

【问题讨论】:

  • @phi:我不认为它会起作用,因为我在newbranch,没有什么可以藏匿的!
  • 我会克隆到一个新目录,将 newbranch 合并到 master,将 master 合并回 newbranch,然后从你所在的位置 git pull。 Master 和 newbranch 将是相同的。
  • @aet 他现在可以通过在newbranch 中执行git fetch; git merge origin/master 在当前目录中执行此操作。克隆存储库的整个第二个副本的好处为零。

标签: git branch git-branch


【解决方案1】:

直截了当:从远程分支更新到当前未签出的分支master:

git fetch origin master:master

其中 origin 是您的遥控器,并且您当前已在某个分支中签出,例如开发。

如果您想一次性更新指定分支之外的当前分支:

git pull origin master:master

【讨论】:

  • 嗯,不过,它似乎并不总是有效;我刚刚被提示与我的 WIP 分支合并。
  • @underscore_d 我也一样。
  • 为我工作...如果它提示合并,那么我想您正在更新的分支中存在未提交到原点的更改
  • 这应该如何工作?它对我不起作用,它只是试图将 origin/master 合并到我当前签出的分支中。
  • 这会将 master 拉入当前分支。这绝对不是所要求的。如果您将 pull 更改为 fetch,那么这正是所要求的。
【解决方案2】:

这里回答: Merge, update, and pull Git branches without using checkouts

# Merge local branch foo into local branch master,
# without having to checkout master first.
# Here `.` means to use the local repository as the "remote":
git fetch . foo:master

# Merge remote branch origin/foo into local branch foo,
# without having to checkout foo first:
git fetch origin foo:foo

【讨论】:

  • 这是最好的,因为它适用于未提交的本地更改。
  • 如果你只是想了解最新的变化,你可以git fetch origin master:master。 git fetch 本身会假设您打算更新当前分支而不是其他分支。
  • 这是最简单最直接的答案。这应该是 IMO 接受的答案。
  • @JohnLeidegren - 除了它并不总是按预期工作。见 cmets 至stackoverflow.com/a/42902058/274579 回答。
【解决方案3】:

事实证明,答案看似简单:

$ git fetch                           # Update without changing any files
$ git branch -d master                # Remove out-of-date 'master' branch
$ git checkout --track origin/master  # Create and check out up-to-date 'master' branch

这允许您更新master 分支而无需切换到它,直到之后它已被更新。

【讨论】:

  • 这不符合您的要求。
  • 正如上面的评论所说,您最终提出的问题并不是您最终回答的问题。您应该更新您的问题,使其不那么具体地涉及合并到分支而不检查它,而更多地涉及直接移动到远程可用分支的最新版本而不首先检查旧版本。
  • 这绝对是我来这里寻找的答案:)
  • 老实说,这不是 OP 想要的,而是帮助了我。
  • @anoniim,不是 OP 想要的吗?你是说刚刚回答这个问题的OP?
【解决方案4】:

您担心无法修复的问题,因为 Git 操作不是原子操作。即使您在没有先切换到主目录的情况下更新主目录,您的工作目录在分支之间的中途总是会有一个漏洞。这就是 Git 不是部署工具的原因。

由于您实际上并未在生产环境中提交代码(我希望如此),因此您实际上并不需要签出分支。您可以简单地执行git fetch 来更新您的远程引用,然后git checkout origin/master 将工作目录直接 移动到origin/master 当前指向的提交。这将使您处于分离的头部状态,但同样,由于您没有提交代码,这无关紧要。

这是你将要得到的最小的洞,但正如我所说,一个洞仍然存在; checkout 不是原子的。

【讨论】:

  • 我了解使用 git 进行部署的局限性,问题是这种情况下的漏洞将长达几分钟而不是不到一秒。不过,关于查看origin/master 的好主意,这可能会奏效。
  • 是什么让孔“分钟”长?通过网络拉取数据?只需在执行其他任何操作之前执行git fetch 即可完成数据的实际传输。
  • 这需要几分钟,因为(现在)未跟踪的文件将被较早的提交覆盖。所以我必须复制文件,做 git 的东西,然后把它放回去。 “分钟长”来自我的打字速度。 (是的,我可以编写脚本,但这只是为了说明让 git 自己做所有事情会更快。)
【解决方案5】:

你有一个不想接触的工作树,所以使用另一个。克隆很便宜,它就是为此而生的。

git fetch origin master       # nice linear tree
git clone . ../wip -b master  # wip's `origin/master` is my `master`
cd ../wip                     # .
git pull origin origin/master # merge origin's origin/master
git push origin master        # job's done, turn it in.
cd ../main
rm -rf ../wip                 # wip was pushed here, wip's done

git checkout master           # payload

这里所有其他答案的问题是,他们实际上并没有做拉动。如果您需要合并或变基,您需要设置拉动,您需要另一个工作树和上述过程。否则只需 git fetch; git checkout -B master origin/master 即可。

【讨论】:

  • 当您运行git checkout master 时,您将签出旧的master 分支,因为您尚未在main 文件夹中创建git pull 以将其与origin/master 同步。这是我要避免的。
  • 克隆完成的检出是旧主控的,但检出是进入网络服务器不查看的目录。最后的 master checkout 是从 wip 推回的完全合并的 master。
  • 在第 6 行,您将合并的(更新的)master 推回origin,但我不相信您的最终结帐是更新后的master。没有git pull 来更新main 目录中的master 分支,所以除非我遗漏了什么,否则您的命令与单独运行git checkout master 并获取旧的master 树没有什么不同。如果您仔细观察,您没有在 main 目录中运行任何与上游通信的命令(除了第 1 行,它在您对上游存储库进行任何更改之前运行。)
  • 好吧,你可以在测试仓库中尝试一下,或者查看推送文档。
  • @jwg 与什么相比,好吗?请务必满足所有 OP 声明的需求。
【解决方案6】:

您可以为此使用 update-ref:

git fetch
git update-ref refs/heads/master origin/master
git checkout master

请注意,这会丢弃主分支中的任何本地提交。在你的情况下不会有任何所以这没关系。对于其他尝试在有本地提交的地方执行此操作的人,我认为这是不可能的,因为合并只能在当前分支上运行。

【讨论】:

  • 这是否等同于git branch --force master origin/master?这会强制本地头 master 指向 origins master 的头
【解决方案7】:

Malvineous 的解决方案对我有用

$ git fetch                           # Update without changing any files
$ git branch -d master                # Remove out-of-date 'master' branch
$ git checkout --track origin/master  # Create and check out up-to-date 'master' branch

只是在给出错误


warning: not deleting branch 'master' that is not yet merged to
         'refs/remotes/origin/master', even though it is merged to HEAD.
error: The branch 'master' is not fully merged.
If you are sure you want to delete it, run 'git branch -D master'.

所以我使用 -D 选项运行

谢谢

【讨论】:

    【解决方案8】:

    git fetch origin master:master

    • “拉”(实际上是获取)master。
    • 如果您的 master 上的更改尚未推送,origin/master 将合并到您的主服务器中。
    • 如果存在合并冲突,您必须先解决它们。

    【讨论】:

      猜你喜欢
      • 2023-03-05
      • 2013-11-04
      • 2016-03-30
      • 2013-03-10
      • 1970-01-01
      • 2020-08-11
      • 1970-01-01
      • 2013-12-04
      相关资源
      最近更新 更多