Git --force-with-lease 在分支中带有 + (refspec)

Vek*_*ksi 4 git github

git push --force-with-lease origin +somebranch在当前的 Git 上, ,git push --force-with-lease origin somebranchgit push origin +somebranch(没有加号)之间有实质性区别吗?三个人似乎都在做同样的事情。

我试图寻找文档。我尝试查看文档中的refspec ,但我不知道是否存在差异,如果有的话,例如,当我想通过 拉到工作分支时git pull --rebase origin master,默认情况下应该更喜欢哪个。

tor*_*rek 5

这是一个很好的问题; 该文档有点含糊,来源非常混乱(强制标志的实际应用广泛分散)。

一个答案已经足够清楚了。以下是文档的内容git push添加了我的黑体字:

--[no-]force-with-lease
--force-with-lease=<refname>
--force-with-lease=<refname>:<expect>

      通常,“git Push”拒绝更新不是用于覆盖它的本地引用的祖先的远程引用。

      如果远程引用的当前值是预期值,则此选项将覆盖此限制。否则“git Push”会失败。

      想象一下,您必须重新调整已经发布的内容。您将必须绕过“必须快进”规则,以便用重新设定的历史记录替换您最初发布的历史记录。如果在您重新设置基础时,其他人在您的原始历史之上构建,则远程分支的尖端可能会随着她的提交而前进,并且盲目地使用 --force 推动将丢失她的工作。

      此选项允许您说您期望正在更新的历史记录是您重新设定并想要替换的历史记录。如果远程引用仍然指向您指定的提交,您可以确定没有其他人对该引用执行任何操作。这就像在没有显式锁定引用的情况下对引用进行“租用”,并且仅当“租用”仍然有效时才更新远程引用。

      --force-with-lease 单独使用,无需指定详细信息,将通过要求其当前值与我们为其拥有的远程跟踪分支相同来保护将要更新的所有远程引用。

      --force-with-lease=<refname>,在不指定预期值的情况下,将保护指定的 ref (单独)(如果要更新),方法是要求其当前值与远程跟踪分支相同我们有这个目的。

      --force-with-lease=<refname>:<expect> 将保护指定的 ref (单独),如果它要更新,则要求其当前值与指定值相同(允许与我们用于 refname 的远程跟踪分支不同,或者当使用此形式时我们甚至不需要有这样的远程跟踪分支)。

      请注意,除了 --force-with-lease=<refname>:<expect> 之外的所有明确指定 ref 的预期当前值的形式仍然是实验性的,随着我们获得此功能的经验,它们的语义可能会发生变化。

      “--no-force-with-lease”将取消命令行上所有先前的--force-with-lease 。

因此,如果传输支持比较和交换选项1 ,并且您已写入--force-with-lease--no-force-with-lease所有更新(无论强制与否)都使用租用模式。

然而--no-force-with-lease,清除了存储的push_cas_option结构,当这些存储的值应用于每个引用规范时,它对我来说并不是立即显而易见的。

使用显式<refname>还可以明确地仅保护一个引用,无论为其设置任何强制标志如何。

我也不清楚当底层传输缺乏对比较和交换的支持时到底会发生什么。幸运的是,GitHub 的 Git 服务器支持它,如果您专门指的是 GitHub,这只会分散您的注意力。


1在内部,Git 源代码使用宏CAS_OPT_NAME:force-with-lease 的功能受到现代 CPU 的比较和交换指令的启发,该指令自动测试某个变量2是否设置为预测值,并将其替换为如果是,则为新值,并且还以某种形式返回在变量中找到的实际值。

如果 CPU 架构使用条件代码,这可能会设置条件代码,但在大多数(如果不是全部)情况下,您都会获得旧值,以便您可以在适当的情况下重试比较和交换。例如,要实现原子加一,您可以使用以下循环load r1,(r0); label: add r1,1,r2; cas r1,r2,(r0); bne label:实现位 2 的原子测试和设置:load r1,(r0); label: or r1,4,r2; cas r1,r2,(r0); bne label;等等。例如,此方法用于 Intel Pentium 和 SPARC 系统。

有些 CPU 使用高速缓存机制。如果最接近CPU的缓存具有共享模式与独占模式(例如,MESI或MOESI),我们可以使用“加载链接”或“加载锁定”指令,后跟“存储条件”指令。仅当高速缓存行仍由当前 CPU 独占拥有时,条件存储才会成功。在这种情况下,我们必须重新执行变量的初始锁定加载,并且我们的循环看起来更像label: ll r1,(r0); add 1,r1; sc (r0),r1; bne label:这用于 PowerPC 和 MIPS 架构。

2通常,所讨论的变量是内存位置,通常具有对齐约束,即使在名义上支持未对齐内存的 CPU 上也是如此。例如,在 Intel Haswell 上,比较和交换 8 字节指令将在 4 字节边界上运行完成,但它实际上不是原子的。当一位同事的内存分配器仅提供 4 字节对齐时,我艰难地发现了这一点。:-)