如何“ git pull”进入一个不是当前分支的分支?

当您在 master分支上运行 git pull时,它通常从 origin/master提取。我在另一个名为 newbranch的分支中,但是我需要运行一个命令,该命令将 git pullorigin/master转换为 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) ,但是在这个过程中不要改变工作目录到较早的修订版本。

115623 次浏览

您所担心的问题是无法修复的,因为 Git 操作不是原子操作。你总是会有一个洞,你的工作目录是 半途而废之间的分支,即使你更新主人没有首先切换到它。这就是为什么 Git 不是一个部署工具

由于您实际上并没有在您的生产环境中提交代码(我希望如此) ,所以实际上您并没有签出 需要分支。你可以简单地做一个 git fetch来更新你的远程参考,然后做一个 git checkout origin/master来移动工作目录 直接到当前由 origin/master指向的提交。这将使您处于分离的头状态,但是,由于您没有提交代码,所以这并不重要。

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

你有一个你不想碰的工作树,所以用另一个吧。克隆很便宜,就是为了这个。

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 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分支,而不需要切换到它,直到 之后被更新。

这个问题在这里得到了回答: 在不使用签出的情况下合并、更新和提取 Git 分支

# 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

可以使用 update-ref:

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

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

简单: 从远程分支更新到当前未签出的分支 师父:

git fetch origin master:master

其中,起源是您的远程控制器,而您目前正在某个分支中签出,例如 Dev

如果要一次性更新指定分支以外的当前分支:

git pull origin master:master

马尔维尼斯的解决方案对我有效

$ 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 选项

谢谢

git fetch origin master:master

  • “ Pulls”(实际获取) master
  • 如果你的 master上还有变化没有被推出,那么 origin/master就会合并到你的主机上。
  • 如果存在合并冲突,则必须首先解决它们。