- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在当前的 Git 上,git push --force-with-lease origin +somebranch
和 git push --force-with-lease origin somebranch
之间是否存在实质性差异? > 和 git push origin +somebranch
(没有加号)?这三个似乎都在做同样的事情。
我试图寻找文档。我试着查看 refspec in documentation ,但我不知道是否存在差异,如果存在差异,例如,当我喜欢通过 git pull --rebase origin master
pull 到工作分支时,默认情况下应该更喜欢哪个。
最佳答案
这是个好问题;文档有点模棱两可,而且来源非常困惑(强制标志的实际应用广泛分散)。
一个答案就足够清楚了。这是the git push
documentation说,加上我的黑体字:
--[no-]force-with-lease
--force-with-lease=<refname>
--force-with-lease=<refname>:<expect>
Usually, "git push" refuses to update a remote ref that is not an ancestor of the local ref used to overwrite it.
This option overrides this restriction if the current value of the remote ref is the expected value. "git push" fails otherwise.
Imagine that you have to rebase what you have already published. You will have to bypass the "must fast-forward" rule in order to replace the history you originally published with the rebased history. If somebody else built on top of your original history while you are rebasing, the tip of the branch at the remote may advance with her commit, and blindly pushing with --force will lose her work.
This option allows you to say that you expect the history you are updating is what you rebased and want to replace. If the remote ref still points at the commit you specified, you can be sure that no other people did anything to the ref. It is like taking a "lease" on the ref without explicitly locking it, and the remote ref is updated only if the "lease" is still valid.
--force-with-lease alone, without specifying the details, will protect all remote refs that are going to be updated by requiring their current value to be the same as the remote-tracking branch we have for them.
--force-with-lease=<refname>, without specifying the expected value, will protect the named ref (alone), if it is going to be updated, by requiring its current value to be the same as the remote-tracking branch we have for it.
--force-with-lease=<refname>:<expect> will protect the named ref (alone), if it is going to be updated, by requiring its current value to be the same as the specified value (which is allowed to be different from the remote-tracking branch we have for the refname, or we do not even have to have such a remote-tracking branch when this form is used).
Note that all forms other than --force-with-lease=<refname>:<expect> that specifies the expected current value of the ref explicitly are still experimental and their semantics may change as we gain experience with this feature.
"--no-force-with-lease" will cancel all the previous --force-with-lease on the command line.
因此,如果传输支持比较和交换选项1,并且您已编写--force-with-lease
而不是 --no-force-with-lease
,然后所有更新,无论是否强制,都使用租用模式。
--no-force-with-lease
, 但是,清除存储的 push_cas_option
结构,当这些存储的值应用于每个 refspec 时,对我来说并不是很明显。
使用显式 <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 字节对齐时,我发现了这一点。 :-)
关于Git --force-with-lease with + in branch (refspec),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37686639/
我时不时地输入“git”,然后想到别的东西,然后输入例如“git checkout master”。当然,这给我留下了 $ git git checkout master git: 'git' is
我做到了 git 克隆 git://foo.git 光盘富 ...编辑文件.. 现在我想重新开始。我不在乎我已经做出的任何改变,但我不想再次克隆整个巨型 foo.git,只是丢失我所有的更改。我怎
我在我的电脑上开发代码,我的计算节点很少。 为了让我的程序保持同步,我决定使用 git。以前,我以一种单向模式使用它来“下推”从 PC 到计算节点的更改。但是时不时遇到计算节点特有的小bug,现场修复
虽然它似乎什么也没做,但它没有给出任何警告或错误消息。有什么想法吗? 最佳答案 来自 Git 源的注释: /* * Read a directory tree. We currently ignor
我知道如何为这样的 HTTPS 请求提供用户名和密码: git clone https://username:password@remote 但我想知道如何像这样向 Remote 提供用户名和密码:
Git GUI、Git Bash 和 Git CMD 之间有什么区别?我是初学者,为了进行安装,我发现自己通常同时使用 git bash 和 git CMD 最佳答案 Git CMD 就像使用 git
有人能告诉我git中文件索引被删除是什么意思吗?这些文件在我的 VS Code 中标记为红色,但我仍然可以修改文件并将更改推送到将反射(reflect)这些更改的远程存储库。我认为这一切都是在我使用命
我通过 git 子树将 GLFV 库添加到项目中,但出现此警告“看起来您的 git 安装或您的 git-subtree 安装已损坏”。还描述了几个原因,为什么这可能是: 如 git --exec-pa
我有需要外部 git 项目的 repo,但我不想使用子模块,因为我想在 github 上存档所有文件,所以我认为我只是将具有 git repo 的整个目录添加到 git 但它不t 添加里面的 .git
我有需要外部 git 项目的 repo,但我不想使用子模块,因为我想在 github 上存档所有文件,所以我认为我只是将具有 git repo 的整个目录添加到 git 但它不t 添加里面的 .git
我一直在阅读一篇文章,作者在其中指示:在现有存储库中创建一个新存储库,并想知道这是否是他忽略的错误。稍后我会与他核实。 这些是我要检查的条件: 将现有目录制作成仓库的条件,并且已经 checkin 主
我确实在不同的计算机上处理相同的项目,我想知道是否有一种方法可以跟踪该 .git 文件夹,这样我就不必在所有本地文件中重新配置配置文件。 我将所有工作推送到 bitbucket。 最佳答案 不,没
这个问题在这里已经有了答案: How does git store files? (3 个答案) 关闭 9 年前。 我为我的许多项目创建了一个远程存储库,所以它是我的push 的目的地。与 git
应该如何在 git 中查看文件内容的完整历史记录? 一个文件在 git 中的历史很短,存储库通过 git-svn 同步,但在 svn 中的历史很长。 git 中的历史记录到达文件移动的位置。要查看历史
我是confused here ... 如何对修改后的文件进行git commit,以及如何对新文件进行git commit? 还有,你如何在git中单独提交文件? 最佳答案 git 提交过程分为两个
正在搜索 throw SO 来寻找答案。遇到这个似乎没有给出任何答案的旧线程。重新触发此线程,希望有人知道! 有人能告诉我 git subtree 和 git filter-branch 的区别吗?为
我想知道是否有一种方法可以避免在每个 Git 命令的开头键入单词 git。 如果有一种方法可以在打开命令提示符进入 “Git 模式” 后只使用一次 git 命令就好了。 例如: git> 之后,我们键
当您修改工作目录中的文件时,git 会告诉您使用“git add”暂存。 当您向工作目录添加新文件时,git 会告诉您使用“git add”开始跟踪。 我对这两个概念有点困惑,因为我假设跟踪文件的更改
为什么 git://有效 $ git clone git://github.com/schacon/grit.git Cloning into 'grit'... ... Checking conne
我在以下沙箱中练习 git:https://learngitbranching.js.org/?NODEMO 我在两个单独的 session 中运行了两组命令。第一组命令顺序如下: git clone
我是一名优秀的程序员,十分优秀!