146

当您git pullmaster分支上运行时,它通常从origin/master. 我在另一个名为 的分支中newbranch,但我需要运行一个执行git pullfrom origin/masterinto的命令,但在拉取完成之前master我无法运行以更改所选分支。git checkout有没有办法做到这一点?

为了提供一些背景知识,存储库存储了一个网站。我newbranch通过将网站切换到newbranch. 现在这些更改已在上游合并到master分支中,我也在尝试将网站切换回master分支。在这一点上,newbranchorigin/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),但在此过程中无需将工作目录更改为较早的版本。

4

8 回答 8

184

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

git fetch origin master:master

其中origin是您的遥控器,您当前已在某个分支中签出,例如dev

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

git pull origin master:master
于 2017-03-20T11:09:01.353 回答
95

这在这里得到了回答: Merge, update, and pull Git branch 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
于 2015-09-25T06:53:22.240 回答
24

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

$ 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而不切换到它。

于 2013-09-25T06:02:59.190 回答
12

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

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

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

于 2013-09-25T01:24:09.940 回答
3

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

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做。

于 2013-09-25T02:21:33.480 回答
3

您可以为此使用 update-ref:

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

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

于 2016-04-14T23:07:21.703 回答
2

git fetch origin master:master

  • “拉”(实际上是获取)master
  • 如果您有master尚未推送的更改,origin/master则会合并到您的主文件中。
  • 如果存在合并冲突,您必须先解决它们。
于 2019-08-23T12:21:06.693 回答
2

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 选项运行

谢谢

于 2017-11-07T13:10:05.373 回答