是否仅对本地存储库进行访存?

时间:2019-11-08 16:48:51

标签: git

是否可以在仅本地存储库中进行提取?例如,如果我想将功能分支中的更改引入master而不进行合并?

换句话说,没有与此存储库连接的远程存储库。它仅存在于我的机器上。除了好奇心外,我没有其他特别的理由。

1 个答案:

答案 0 :(得分:1)

git fetch有两个主要工作,其中之一是大工作(或大工作)和困难工作(-ish),而其中一个工作又小又容易。最困难的部分是从其他存储库中以有效的方式获取实际的提交和其他对象(所有这些对象都由哈希ID标记)。轻而易举的工作是根据在完成大工作时学到的信息来更新一些名称(通常是{em>远程跟踪,例如origin/master)。

由于您的存储库已经拥有该存储库的所有提交,因此将git fetch指向您自己的存储库将使繁重的工作变得轻而易举,而只剩下轻而易举的工作。您可以执行此操作:

git fetch .

指示git fetch使用.作为URL或远程名称。 Git将其视为一种file:// URL,但没有//,因此它将当前目录命名为其他存储库所在的本地文件。如果存储库位于当前目录中,则将您的Git存储库连接到其自身。然后,它列出了所有它没有的提交(当然没有提交),因此没有要更新的提交。

没有更新任何提交,它继续进行较小的工作,即更新各种名称。要更新的名称是您通过 refspecs 提供的名称。通常,您会运行:

git fetch origin

remote.origin.fetch将提供这些refspec参数。由于您没有使用origin,因此必须提供refspec。

refspec的第二简单形式拼写为src:dst,其中 src dst 部分是参考。倒数第二个必需的形式是中间的冒号。 1 通常,源ref是一个分支名称,例如master或它的完整拼写形式{{1 }},而目的地通常是远程跟踪名称,例如refs/heads/master

使用refs/remotes/origin/master时,使用远程跟踪名称没有任何意义。不过,使用分支名称确实是合理的。在这里,像git fetch .这样的refspec实际上是有意义的。

采用第二种简单形式,Git从源Git(即您自己)中读取与源名称相关联的提交哈希ID,并对目标Git中的目标名称进行仔细仔细的检查更新(这又是你自己)。如果允许更新,则会发生。如果没有,则不会。

您可以添加master:develop标志或refspec前面的加号来强制更新,即使检查失败。因此--forcegit fetch . +master:develop在这里的含义是相同的:从源Git读取git fetch --force . master:develop并使用生成的哈希ID强制更新目标Git中的master。这将清除您现有的所有develop,并放入指向{em {em} commit develop的{​​{1}}。

换句话说,这与develop的作用相同。后者更为明显,因此应改用该命令。 (不过,这里发生的情况的完整描述很有用。)

没有前导加号或master,此git branch -f develop master的作用很难用更简单的Git命令表示。 Git内建的唯一可以达到相同结果的方法是类似地使用--force

git fetch

具有与git push完全相同的总体效果。使用git push . master:develop ,您的Git会自行调用,给予自身具有的所有尚未提交的提交(即,没有),并要求其自己轻轻地,谨慎地更新git fetch . master:develop来匹配自己的git push,这与develop在没有提交后提交master所做的相同的更新。

因此,这两个命令均具有此作用。编号的步骤确定了是否接受温和/礼貌的更新:

  1. 测试分支名称git fetch . master:develop是否存在。如果否,请继续:接受名称更新请求。

  2. 测试develop是否为当前分支。如果是这样,则拒绝请求(但请参阅develop的配置设置,或git push的{​​{1}}标志)。

  3. 从当前分支设置获取哈希ID。测试新提议的提交ID是否具有当前提交哈希ID作为祖先。也就是说,测试此更新是否为快进操作。如果是这样,请接受请求。

  4. 该请求不是快速转发:拒绝该请求。 (在-ugit fetch下用“接受”跳过/替换了该测试。)

如果请求被接受,该命令现在将使用新的建议哈希ID替换名称中存储的哈希ID。因此,--force+都具有使我们的git push . master:develop快速匹配我们的git fetch . master:develop的效果,只要我们现在不在develop上,那快进是可能的。

要在没有masterdevelop的情况下执行此操作,直接的方法是:

git fetch

这实际上是我通常的工作方式-与git push的混为一谈是最棘手的事情。 (我极少数情况下会使用git checkout develop git merge --ff-only master 来避免结帐,以免弄乱我当前的工作树。如今,您可以使用git push . master:develop来避免弄乱 this 工作树,但这比棘手的git push技巧花了更多的工作。)


1 最简单的形式省略了冒号。当从某些 other Git获取提交时,此表单在某些情况下具有某些用途,而在git worktree add中,您通常给予进行其他提交的情况下,还有更多用例吉特但是,如果您将Git指向自己,那么这些用例就永远不会适用,最简单的形式就变得毫无用处。因此,这里所有的注意力都集中在第二简单形式上。