繁体   English   中英

Git - force-with-lease with + in branch(refspec)

[英]Git --force-with-lease with + in branch (refspec)

在目前的Git中, git push --force-with-lease origin +somebranchgit push --force-with-lease origin somebranchgit push origin +somebranch (没有加号)之间是否存在重大差异? 这三个似乎都做同样的事情。

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

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

一个答案很清楚。 这是git push文档所说的内容,我的粗体添加了:

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

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

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

想象一下,你必须改变你已发表的内容。 您必须绕过“必须快进”规则才能将最初发布的历史记录替换为重新定位的历史记录。 如果其他人在您重新定位时建立在原始历史之上,那么远程分支的提示可能会随着她的提交而提前,盲目推动--force将失去她的工作。

此选项允许您说您希望更新的历史记录是您重新定义和想要替换的内容。 如果远程引用仍然指向您指定的提交,您可以确定没有其他人对引用做任何事情。 这就像在ref上接受“租约”而没有明确地锁定它,并且仅当“lease”仍然有效时才更新远程ref。

--force-with-lease单独,没有指定细节,将通过要求他们的当前值与我们为他们提供的远程跟踪分支相同来保护将要更新所有远程ref

--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那么所有更新(强制与否)都使用租赁模式。

然而,-- push_cas_option --no-force-with-lease清除了存储的push_cas_option结构,当这些存储的值应用于每个push_cas_option ,对我来说并不是很明显。

使用显式<refname>也清楚地保护只有一个引用,无论为它设置任何强制标志。

确切地说,当基础传输缺乏对比较和交换的支持时会发生什么,我也不清楚。 幸运的是,GitHub的Git服务器支持它,如果你特别指的是GitHub,这只会让你分心。


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

如果CPU架构使用条件代码,则可以设置条件代码,但在大多数情况下(如果不是所有情况),您都会获得旧值,以便在适当时重试比较和交换。 例如,要实现原子add-one,你可以循环使用: load r1,(r0); label: add r1,1,r2; cas r1,r2,(r0); bne label load r1,(r0); label: add r1,1,r2; cas r1,r2,(r0); bne label 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 load r1,(r0); label: or r1,4,r2; cas r1,r2,(r0); bne label 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 label: ll r1,(r0); add 1,r1; sc (r0),r1; bne label label: ll r1,(r0); add 1,r1; sc (r0),r1; bne label 这用于PowerPC和MIPS架构。

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

当我想通过git pull --rebase origin master拉到工作分支时 ,默认情况下应该更喜欢哪一个?

我在2013年报告了git 1.8.5的 force-with-lease ,以及2016年3月的git 2.8 “。

我会说......没有一个。
执行pull --rebase以避免强制推送(有或没有租赁)任何东西。

我只是设置( 因为git 2.6

git config pull.rebase true
git config rebase.autoStash true

这允许我做一些简单的git pull ,然后是简单的git push (不涉及强制推送)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM