如何'git pull'成一个不是现在的分支?

时间:2013-09-25 01:10:19

标签: git branch git-branch

当您在git pull分支上运行master时,它通常来自origin/master。我在一个名为newbranch的不同分支中,但我需要运行一个命令,git pullorigin/master进入master,但我无法运行git checkoutnewbranch拉动完成后,更改所选分支。有没有办法做到这一点?

为了给出一些背景知识,存储库存储一个网站。我在newbranch进行了一些更改,并通过将网站切换为master来部署它们。现在这些更改已合并到master分支的上游,我也试图将网站切换回newbranch分支。此时,origin/mastermaster相同,但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

我需要实现与上面相同的内容({{1}}),但不要在此过程中将工作目录更改为早期版本。

8 个答案:

答案 0 :(得分:126)

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

git fetch origin master:master

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

如果您希望一次性更新当前分支以及指定的分支:

git pull origin master:master

答案 1 :(得分:84)

这里的答案如下: 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

答案 2 :(得分:20)

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

$ 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分支而无需切换到它,直到更新之后

答案 3 :(得分:11)

你担心无法修复的东西,因为Git操作不是原子的。即使您在没有先切换到主服务器的情况下更新主服务器,您的工作目录也会在分支之间中途。这就是为什么 Git不是部署工具

由于您实际上并未在生产环境中提交代码(我希望),您实际上并不需要 来检查分支。您只需执行git fetch更新远程引用,然后git checkout origin/master将工作目录直接移动到origin/master当前指向的提交。这将使你处于一个独立的头状态,但同样,因为你没有提交代码,这没关系。

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

答案 4 :(得分:6)

你有一个你不想触摸的工作树,所以再使用另一个。克隆价格便宜,专为此而打造。

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

这里所有其他答案的问题是,它们实际上并没有拉动。如果你需要合并或者rebase你已经设置了拉,你需要另一个工作树和上面的程序。否则只需git fetch; git checkout -B master origin/master即可。

答案 5 :(得分:3)

您可以使用update-ref:

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

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

答案 6 :(得分: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选项运行

感谢

答案 7 :(得分:0)

git fetch origin master:master

  • “拉”(实际上是提取)master
  • 如果您尚未更改master上的更改,origin/master将被合并到您的母版中。
  • 如果存在合并冲突,则必须先解决它们。