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

Mal*_*ous 116 git branch git-branch

当您git pullmaster分支上运行时,它通常会从中拉出origin/master.我是在一个叫不同的分支newbranch,但我需要运行,做了一个命令,git pullorigin/mastermaster,但我不能运行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
Run Code Online (Sandbox Code Playgroud)

我需要实现与上面的相同(git checkout master && git pull),但是在此过程中不需要将工作目录更改为早期版本.

Mar*_*ter 147

简单明了:从远程分支更新为当前未签出的分支主服务器:

git fetch origin master:master
Run Code Online (Sandbox Code Playgroud)

其中,原产地为你的遥控器和你在一些分支如当前已签出开发.

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

git pull origin master:master
Run Code Online (Sandbox Code Playgroud)

  • 嗯,它似乎并不总是有效; 我刚刚被提示与我的WIP分支合并. (4认同)
  • 这应该如何工作?它对我不起作用,它只是尝试将原点/母版合并到我当前签出的分支中。 (2认同)
  • 这会将master拖入当前分支。这绝对不是所要的。如果将pull更改为fetch,则这正是所要求的。 (2认同)

fan*_*e89 88

这里的答案是:在 不使用签出的情况下合并,更新和拉取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
Run Code Online (Sandbox Code Playgroud)

  • 这是最好的,因为它适用于未提交的本地更改. (2认同)
  • 如果您只想了解最新的更改,请执行`git fetch origin master:master`.`git fetch`本身会假设您打算更新当前分支而不是其他分支. (2认同)
  • 这是最简单,最直接的答案.这应该是IMO接受的答案. (2认同)

Mal*_*ous 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
Run Code Online (Sandbox Code Playgroud)

这使您可以更新master而无需切换到它,直到分支它已被更新.

  • 这不符合您的要求. (11认同)

mea*_*gar 11

你担心无法修复的东西,因为Git操作不是原子的.你将永远有一个洞,你的工作目录是中途分支之间,即使你不先切换到它更新的主人.这就是Git不是部署工具的原因.

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

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


jth*_*ill 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
Run Code Online (Sandbox Code Playgroud)

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

  • 当您运行`git checkout master`时,您将检查旧的`master`分支,因为您没有在`main`文件夹中执行`git pull`以将其与origin/master同步.这就是我想要避免的. (2认同)