只有当远程参考不会在平均时间内发生变化时,“推送”才是什么原因"在EGit的复选框?

时间:2017-04-12 13:32:49

标签: eclipse git egit

eclipse EGit插件提供了一个推送向导,可将更改推送到Git存储库。在向导结束时,会出现一个确认对话框,其中包含复选框"仅当远程参考不会在平均时间内发生变化时按下#34;如EGit文档页面中所述" {{ 3}}&#34 ;.

根据Git书第2.5章(http://wiki.eclipse.org/EGit/User_Guide#Push_Confirmation),如果另一个人在平均时间内推动了一些变化(自上次同步/获取以来),Git将拒绝推送到远程存储库。

所以我的问题是:如果自上次提取以来远程存储库发生了变化,推送将被拒绝,那么所描述的复选框有什么用?

要使用所述选项打开对话框,您需要执行以下步骤:

  • 通过EGit
  • 在Git存储库上创建一些本地提交
  • 右键单击相关的eclipse项目,然后按" Team>远程>推..."
  • 选择所需的远程存储库
  • 添加至少一个包含源和目标ref的推送规范
  • 按'下一步'

1 个答案:

答案 0 :(得分:0)

我没有使用 EGit所以我必须猜一点,但是从他们链接的页面上看,他们的推送对话似乎是在幕后使用几个Git功能。

背景

  

根据Git书第2.5章(https://book.git-scm.com/book/en/v2/Git-Basics-Working-with-Remotes),如果另一个人在平均时间内推动了一些变化(自上次同步/获取以来),Git将拒绝推送到远程存储库。

这没有错,但也不是整个画面。

当你跑步时:

git push <remote> <refspec>

你的Git通过互联网电话和你的Git以及他们的Git调用了另一个Git-the&#34; foreign&#34; Git,the githooks documentation称之为 - 进行对话。你的Git向你的新Gits发送你的新提交,然后发送以下形式的请求或命令:

  

如果您愿意,请将master设置为指向提交1234567

或:

  

我命令你:现在将master设置为1234567

这个对话分为三个部分:一个是确定你的Git和外国Git将要讨论的内容;一个转移提交(以及任何其他适当的Git对象);并且最后一个指导外国Git关于要做什么的参考更新,即你的分支更新是否是礼貌请求(&#34;如果你喜欢这样做的话,那就是#34;)或命令(&#34;取这个现在该死的&#34;)。 (我们还应该注意,它不仅仅是分支名称;同样的东西适用于标签和任何其他参考。虽然它们的工作方式相当类似。)

但是在这次谈话中还有两个 Gits :你的,和外国的Git。这一切都很好,但世界中有两个以上的Gits。如果第三个​​ Git与外国Git交谈怎么办?你的Git 和另一个Git 可能同时与外国Git 交谈

Pro Git书中关注的是这里的一个大问题,即外国Git可能会在您发送礼貌之前的某个时间点在其分支机构上获得新的提交。请设置&#34;请求。在这种情况下,发送礼貌时#34;请设置&#34;请求,外国Git说:&#34;不,如果我这样做,我会忘记我有你不承诺的承诺。&#34;在这种情况下,如本书所述,他们拒绝推送,您可以获取他们的新提交,将所有新提交的内容与您的提交集成,然后重试。

但这是更有力,类似命令的选项的来源:你可能坚持他们忘记了这些提交。他们仍然可以拒绝,但如果他们不拒绝,你可以让他们忘记一些提交。这一步有点危险:即使你先提交他们的提交(看看你要求他们忘记了什么),也可能会有一个第三个​​ Git主动交谈使用外部Git,以便当您验证那些您希望它们忘记的提交时,它们用于提交哈希映射的分支名称可能已更改。

因此,在Git的现代版本中还有另一种选择,原子设置引用当且仅当符合您认为匹配的内容时。也就是说,你让你的Git发送命令:&#34;将master设置为1234567!&#34;发号为&#34; ...但仅限于当前fedcba9!&#34;这使您有机会从外部Git中获取,下定决心要做什么,然后在外部Git上发送条件的命令,而不更改那些分支(或其他引用)但是,要确保你没有干扰第三个Git。

Git调用这些原子比较和交换更新--force-with-lease

返回EGit

EGit似乎希望对您(在此对话结束时)特别有用,以确定将来会发生什么每一半这个甚至尚未开始的对话!在这里你用你的点击框和按钮查看你的GUI,你的Git甚至没有通过互联网电话调用外国Git来开始传输,你的EGit GUI正试图猜测将< / em>将来会发生 ,即使可能还有其他Gits在那里与外国Git交谈。

所以你的EGit GUI提出了一个小技巧:它与外国Git进行了早期对话。它现在调用了Git,然后问:&#34;嘿,你的分支机构命名的是什么?&#34;如果你的EGit有这些提交,你的EGit可以弄明白你将发送什么提交。如果你的EGit 有这些提交,你的EGit可以获取它们,然后找出你将发送它们的提交。 1 所以现在你的EGit非常清楚它将把它们发送给它将在它们的分支名称(和其他引用)中看到的哈希ID映射。

因此,您的EGit GUI可以向您展示这些内容。但是当你点击最后一个&#34;去&#34;按钮,你的EGit将再次调用他们的Git 并实际开始两部分对话 - 也许第三个Git首先到达那里,并且对话不会像你的EGit GUI那样思考它会。这些额外的确认点击框就在这里。

EGit是否正在使用&#34;条件命令&#34;并不完全清楚。选项。接收外国Git并没有完全锁定&#34;第三个Git&#34;在可能冗长的对话期间更新,通过Internet电话线发送提交和其他对象。他们获取一组初始的名称到ID映射,并且如果与他们期望的不匹配,可以立即中止对话;那么他们必须拥有实际发送对象的对话的中间部分;然后他们有最后的,更新 - 外国Git的对话参考部分。 clicky框仅适用于第一部分,还是会影响任何最终的命令 - vs-polite-requests?我不清楚这一点。

但是,的答案:

  

所以我的问题是:如果自上次提取以来远程存储库发生了变化,推送将被拒绝,对所描述的复选框有什么用?

可能使用条件(仅当事情没有改变时强制推送)功能,或者可能&#34;如果事情没有&#39则中止对话; t甚至按计划开始&#34;,或者它甚至可以两者兼顾。您链接的文档中的图像有一个单独的点击框,用于&#34;强制推送&#34;,因此假设EGit GUI不会将其最终请求作为命令发送,除非该框检查。是否检查第二个确认框将这些变为原子交换命令,我不知道;但如果它没有,初始检查就足够了,因为&#34;第三个Gits&#34;可以在对话的对象传输部分更新外部Git引用。

因此我会说:这或者为你提供一种感觉良好的东西,它没有任何影响; ,它会启用--force-with-lease

1 我不知道EGit是否真的这样做 - 无形地运行git fetch - 但如果它它不能正确计算将来发送的提交集。