如何 update/sync 拉取请求?
how to update/sync a pull request?
在我的本地机器上,我使用下面的命令克隆了一个存储库,
git clone https://github.com/kp/ml_project.git
现在在原始项目中有一个拉取请求,它的拉取请求编号是 22。所以我使用以下这些命令添加了拉取请求。
cd ml_project
git fetch origin pull/22/head:pr22
几天后,在拉取请求 22 中添加了新的提交,我希望它们可供我使用。我能做什么?我如何 update/fetch 新提交到我的分支 pr22
确保您没有检查分支 pr22
,1 然后 运行 相同 git fetch
。 (然后你可以 git checkout
再次分支,如果你想的话。)
如果他们只添加 提交,运行 没问题。如果他们 replaced 提交(取出一些,放入一些不同的),例如,在 rebase 之后,你会得到一个 "non-fast-forward" 错误。
如果您想丢弃旧的 pr22
值并存储新的更新提示,尽管不是快进条件,只需强制更新更新即可。要强制获取,您可以使用 git fetch --force
——这告诉 git fetch
在 每个 refname 更新上设置强制标志——或者使用加号 +
包含您希望强制执行的引用的特定引用规范上的字符:
git fetch origin +refs/pull/22/head:refs/heads/pr22
(在这种情况下,只有一个 refspec,2 所以 +
和 --force
做同样的事情。这里我已经完全说明了单个 refspec 中的 refs。如您所见,您可以在常见情况下缩写 refs。在脚本中将它们完整拼写出来是明智的,因为 Git 有时会以令人惊讶的方式将部分引用解析为完整引用.)
1例如,运行 git checkout master
切换,或者直接使用 git checkout --detach
进入 "detached HEAD" 模式在当前提交上。这些都避免了 "update my current branch name" 存在的陷阱。
2A refspec 大致是一对 refs 或 references,它们之间有一个冒号:pull/22/head:pr22
是 refspec 的一个例子。在 refspec 前加上加号使其成为 forced 更新。有关这些的更多信息,请参阅 the git fetch
documentation and the git push
documentation。
A ref 是任何分支名称,如 master
,标签名称,如 v2.1
,远程跟踪名称,如 origin/master
,或任何其他这样的名字。 所有 这些名称,在 Git 中,是 refs。 分支名只是一个全名以refs/heads/
开头的引用,标签名只是一个全名以refs/heads/
开头的引用refs/tags/
。 Git 通常为了方便起见,通过剥离 refs/heads/
或 refs/tags/
部分来缩写这些引用。
当您使用缩写形式时,Git 必须猜测全名应该是什么。如果你有一个名为 master
和 的分支 tag 也名为 master
,Git 会猜测 "tag" 首先——所以不要那样做,在脚本中,拼出全名。
在我的本地机器上,我使用下面的命令克隆了一个存储库,
git clone https://github.com/kp/ml_project.git
现在在原始项目中有一个拉取请求,它的拉取请求编号是 22。所以我使用以下这些命令添加了拉取请求。
cd ml_project
git fetch origin pull/22/head:pr22
几天后,在拉取请求 22 中添加了新的提交,我希望它们可供我使用。我能做什么?我如何 update/fetch 新提交到我的分支 pr22
确保您没有检查分支 pr22
,1 然后 运行 相同 git fetch
。 (然后你可以 git checkout
再次分支,如果你想的话。)
如果他们只添加 提交,运行 没问题。如果他们 replaced 提交(取出一些,放入一些不同的),例如,在 rebase 之后,你会得到一个 "non-fast-forward" 错误。
如果您想丢弃旧的 pr22
值并存储新的更新提示,尽管不是快进条件,只需强制更新更新即可。要强制获取,您可以使用 git fetch --force
——这告诉 git fetch
在 每个 refname 更新上设置强制标志——或者使用加号 +
包含您希望强制执行的引用的特定引用规范上的字符:
git fetch origin +refs/pull/22/head:refs/heads/pr22
(在这种情况下,只有一个 refspec,2 所以 +
和 --force
做同样的事情。这里我已经完全说明了单个 refspec 中的 refs。如您所见,您可以在常见情况下缩写 refs。在脚本中将它们完整拼写出来是明智的,因为 Git 有时会以令人惊讶的方式将部分引用解析为完整引用.)
1例如,运行 git checkout master
切换,或者直接使用 git checkout --detach
进入 "detached HEAD" 模式在当前提交上。这些都避免了 "update my current branch name" 存在的陷阱。
2A refspec 大致是一对 refs 或 references,它们之间有一个冒号:pull/22/head:pr22
是 refspec 的一个例子。在 refspec 前加上加号使其成为 forced 更新。有关这些的更多信息,请参阅 the git fetch
documentation and the git push
documentation。
A ref 是任何分支名称,如 master
,标签名称,如 v2.1
,远程跟踪名称,如 origin/master
,或任何其他这样的名字。 所有 这些名称,在 Git 中,是 refs。 分支名只是一个全名以refs/heads/
开头的引用,标签名只是一个全名以refs/heads/
开头的引用refs/tags/
。 Git 通常为了方便起见,通过剥离 refs/heads/
或 refs/tags/
部分来缩写这些引用。
当您使用缩写形式时,Git 必须猜测全名应该是什么。如果你有一个名为 master
和 的分支 tag 也名为 master
,Git 会猜测 "tag" 首先——所以不要那样做,在脚本中,拼出全名。