用URL执行Git硬重置

4
如果我想从别人的 pull 请求中拉取代码而不必把他们的 fork 作为远程仓库添加,我可以执行以下命令:
git pull https://github.com/<user>/<repo name>.git <branch name>

然而,如果存在合并冲突,则会失败,我希望能够只执行以下操作:

git reset --hard https://github.com/<user>/<repo name>.git/<branch name>

就像我通常所做的一样,例如:

git reset --hard upstream/master

然而这并不起作用,我得到了

fatal: invalid object name 'https'.

我该如何对OP分支进行硬重置?
4个回答

7

当你运行时,例如,

git pull https://github.com/<user>/<repo name>.git master

您将看到以下内容,以及其他输出:
From https://github.com/<user>/<repo name>.git
 * branch            master     -> FETCH_HEAD

这告诉你远程分支master在本地以FETCH_HEAD的名称存储。它不是分支名称或“引用”,而是所谓的伪引用。尽管如此,您可以像使用分支名称一样使用它。

所以,您要做的是

git reset --hard FETCH_HEAD

1

git pull 命令由两个部分组成,第一部分是运行 git fetch。(第二部分是使用 git fetch 获取的信息运行另一个 Git 命令。)git fetch 通常会执行 两个 操作:

  1. 从其他 Git 存储库获取新提交;以及
  2. 基于从其他 Git 存储库获取的 分支名称 更新你自己 Git 存储库中的 远程跟踪名称

要执行步骤2,其他 Git 存储库必须在你自己的 Git 存储库中有一个 名称。这个名称称为 远程,你可以运行:

git fetch remote

这使得你的 Git 能够执行步骤1和步骤2。

当你运行:

git fetch url

你的 Git 将无法执行步骤2。它只能执行步骤1。所以它只会执行步骤1。

要设置或创建一个你自己的分支名称,指向步骤1中获取的提交之一,你需要知道提交的哈希ID。在从命名远程获取时,这些会在git fetch操作期间打印出来,但只有一个URL,你自己的Git不会在任何地方保存它们。1获取它们的最简单方法是给另一个URL起一个名称,以便你的Git在步骤2中保存它们。

1这并不完全正确:您的Git将所有内容保存在特殊文件.git/FETCH_HEAD中。您可以查看其中的内容。但是请注意,每次git fetch都会覆盖以前的内容,并且在此处保存的哈希ID在您查看它们时可能无效。使用远程名称和git fetch remote可以确保您能够使用这些哈希ID。因此不要这样做,请使用远程名称。

另请参见j6t的答案


0

您目前正在尝试做什么:

git reset --hard https://github.com/<user>/<repo name>.git/<branch name>

在实际的远程仓库中,使用分支的概念是没有意义的。 git reset 操作本质上是一种 本地 操作,因此,您只能将其硬重置为常规分支、跟踪分支或某个提交的 SHA-1 哈希值。所以,您应该首先执行 git fetch 以拉取所有分支,然后从那里进行硬重置。


当然,我已经执行了git fetch https://github.com/<user>/<repo name>.git <branch name>,但是我应该如何重置到该分支? - ignoring_gravity
尝试执行 git branch -a 命令以查看可用的分支。如果有任何 新的 分支进来,它会像 origin/some_new_branch 这样显示。找到它,然后执行 git reset --hard origin/some_new_branch 命令。 - Tim Biegeleisen
如果我执行 git branch -a,它不会出现在其中,很可能是因为我还没有将 https://github.com/<user>/<repo name>.git 添加为远程仓库。如果我将其添加为远程仓库,那么就可以了。我只是想知道是否有一种方法可以在不添加新的远程仓库的情况下完成这个操作,因为我有很多来自许多不同人的 PR 需要审核。 - ignoring_gravity

0
请注意,您可以使用完整的refspec语法选择任何本地引用名称:
# create 'localname' branch, or fast forward it if 'localname' already exists :
git fetch <url> <branchname>:<localname>

# example :
git fetch <url> branchname:review/pr/1234

# create or force update by adding '+' :
git fetch <url> +branchname:review/pr/1234


# you can store the incoming ref in something other than a branch
# (e.g : a ref that doesn't start with 'refs/heads') :
#   store it outside list of branches, tags or remote branches :
git fetch <url> +branchname:refs/review/pr/1234
#   store it as if it were the remote branch of some named remote :
git fetch <url> +branchname:refs/remotes/userXYZ/pr/1234

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接