【问题标题】:Syncing fork with upstream: git fetch + git checkout + git merge vs. git checkout + git pull将 fork 与上游同步:git fetch + git checkout + git merge vs. git checkout + git pull
【发布时间】:2017-03-28 21:58:05
【问题描述】:

Github-Help: Syncing a Fork 的文档显示了三个命令,以使我的 GitHub 分支与上游存储库保持同步。

git fetch upstream
git checkout master
git merge upstream/master

我可以用下面两个命令代替上面三个吗?

git checkout master
git pull upstream/master

这两组命令是等效的,还是它们之间有区别?

【问题讨论】:

  • git pull = git fetch + git merge,至少在一般情况下
  • 仅供参考:git pull upstream/master 是错误的,因为第三个单词 (upstream/master) 必须是 remote 的名称,而 upstream/master 的名称i>远程跟踪分支。不幸的是,Git 使用了非常相似的词来表示非常不同(尽管相关)的事物:branch 这个词至少有两个含义,remote 这个词本身有一个含义,而短语 remote-tracking branch 还有一个。
  • 如果您使用git clone -o upstream 克隆或获取upstream 至少一次,则第二组有效。请注意,如果您克隆了,您的主分支可能已经跟踪upstream/master,在这种情况下git pull 就足够了。 Git 会为你做好准备。但是,如果您从头开始创建本地副本 (git init) 并在之后添加远程 (git remote add upstream <url>),则需要指明 upstream/master,除非您自己设置跟踪 (git branch --set-upstream-to upstream/master)。

标签: git git-merge git-pull git-fork git-fetch


【解决方案1】:

这些命令集是不等价的。

git pull

分为两个命令:

git fetch
git merge

问题是,git fetch 需要远程引用,而 git merge 需要跟踪引用,这就是为什么 Github 帮助页面有:

git fetch upstream

但是有

git merge upstream/master

合并命令将采用upstream/master 分支并将其合并到当前签出的分支(在本例中为“master”)。但是 fetch 命令在分支上不起作用,它需要一个遥控器,所以当你尝试时:

git pull upstream/master

Git 将其拆分为:

git fetch upstream/master
git merge upstream/master

获取失败:

$ git pull upstream/master
fatal: 'upstream/master' does not appear to be a git repository
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

【讨论】:

  • 注意git pull upstream/master 在您至少执行一次git fetch upstream 时有效:upstream/master 引用远程分支的本地副本,而不是远程服务器上的副本.
  • @FabienBouleau 这在我的系统上不正确。使用upstream/master 获取和拉取都会失败,即使它已经存在。 Fetch 需要远程引用,而不是分支引用。也许如果您将名称“upstream/master”添加为具有与“upstream”相同的 URL/文件夹的远程,或者具有其他一些配置更改,但默认情况下不是,至少当上游是辅助远程时(即添加源首先)。
  • 我的错,upstream/master 在这种情况下是错误的。它必须是 git pull upstream mastergit fetch upstream master。第一次下载远程存储库时,它必须是git fetch upstream(没有master),否则不会设置远程跟踪分支信息(只有FETCH_HEAD)。仅使用 upstream/master 来引用远程跟踪分支(一旦存在)。
猜你喜欢
  • 2018-07-28
  • 2018-11-23
  • 2020-07-27
  • 2018-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-05
  • 2017-04-27
相关资源
最近更新 更多