Git——与+;在分支中(参考规范)

Git——与+;在分支中(参考规范),git,github,Git,Github,在当前Git上,Git push--force与lease origin+somebranch,Git push--force与lease origin somebranch和Git push origin+somebranch(无加号)之间是否存在实质性差异?这三个似乎都在做同样的事情 我试图寻找文档。我试着查看refspec,但我不知道是否有区别,如果有区别,那么当我想通过git pull(例如,git pull--rebase origin master)拉入工作分支时,默认情况下应该选择

在当前Git上,
Git push--force与lease origin+somebranch
Git push--force与lease origin somebranch
Git push origin+somebranch
(无加号)之间是否存在实质性差异?这三个似乎都在做同样的事情


我试图寻找文档。我试着查看refspec,但我不知道是否有区别,如果有区别,那么当我想通过git pull(例如,git pull--rebase origin master)拉入工作分支时,默认情况下应该选择哪一个;文档有点模棱两可,源代码非常混乱(强制标志的实际应用非常分散)

有一个答案很清楚。下面是我用黑体字写的:

-[no-]租赁生效

--租赁强制=

--force with lease=:

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

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

想象一下,您必须重新设置已发布内容的基础。您将不得不绕过“必须快进”规则,以便用重定基础的历史替换最初发布的历史。如果有人在你重定基址时建立在你的原始历史之上,那么远程分支的尖端可能会随着她的提交而前进,盲目地用力推会失去她的工作

此选项允许您说,您希望正在更新的历史记录是您重定基础并希望替换的历史记录。如果远程引用仍然指向您指定的提交,您可以确保没有其他人对该引用做过任何事情。这就像在没有明确锁定的情况下对该引用执行“租约”,并且仅当“租约”仍然有效时才更新远程引用

--仅使用租约强制,而不指定详细信息,将通过要求其当前值与我们为其提供的远程跟踪分支相同来保护将要更新的所有远程引用

--如果要更新命名的ref(单独),则不指定预期值的带lease=的force将通过要求其当前值与我们为其设置的远程跟踪分支相同来保护它

--force with lease=:如果要更新命名的ref(单独),将通过要求其当前值与指定值相同来保护该ref(允许与refname的远程跟踪分支不同,或者在使用此表单时,我们甚至不必有这样的远程跟踪分支)

请注意,除了--force with lease=:之外,所有显式指定ref的预期当前值的形式仍然是实验性的,随着我们对该特性的经验的增加,它们的语义可能会发生变化

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

因此,如果传输支持比较和交换选项1,并且您已经编写了
--force with lease
而不是
--no force with lease
,则所有更新(强制或不强制)都使用租赁模式

然而,
--不强制使用lease
,清除了存储的
push\u cas\u选项
结构,当这些存储的值应用于每个refspec时,我并不立即感到明显

使用显式
也可以清楚地仅保护一个引用,而不考虑为其设置的任何强制标志

我也不清楚当底层传输缺少对比较和交换的支持时会发生什么。幸运的是,GitHub的Git服务器支持它,如果你特别提到GitHub,这只会让你分心


1在内部,Git源代码使用宏
CAS_OPT_NAME
:force with lease函数的灵感来自现代CPU的比较和交换指令,该指令以原子方式测试某个变量2是否设置为预测值,如果设置为新值,则替换为新值,并以某种形式返回变量中的实际值能干的

如果CPU体系结构使用条件代码,这可能会设置条件代码,但在大多数情况下(如果不是所有情况下),您都会获得旧值,以便在适当的情况下重试比较和交换。例如,要实现原子添加一,您可以循环:
load r1,(r0);标签:add r1,1,r2;cas r1,r2,(r0);bne标签
;用于实现原子测试和位2设置:
加载r1,(r0);标签:或r1,4,r2;cas r1,r2,(r0);bne标签
;等等。例如,此方法用于英特尔奔腾和SPARC系统

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

2通常,所讨论的变量是一个内存位置,通常带有对齐约束,即使在名义上支持未对齐内存的CPU上也是如此。例如,在Intel Haswell上,一条比较交换8字节指令将在4字节边界上运行到完成,但它实际上并不是原子的。当一个colleague的内存分配器仅提供4字节对齐方式。:-)

当我想通过git pull--r拉入工作分支时,默认情况下应该选择哪个分支
git config pull.rebase true
git config rebase.autoStash true