Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git fu:识别“提交”;在它遥远的对手背后”;_Git_Heroku_Diff_Commit_Git Push - Fatal编程技术网

Git fu:识别“提交”;在它遥远的对手背后”;

Git fu:识别“提交”;在它遥远的对手背后”;,git,heroku,diff,commit,git-push,Git,Heroku,Diff,Commit,Git Push,这应该是一个简单的问题: 我正试图在Heroku上推出一个分支(主分支): $ git push production To git@heroku.com:my-app.git ! [rejected] master -> master (non-fast-forward) error: failed to push some refs to 'git@heroku.com:my-app.git' hint: Updates were rejected because th

这应该是一个简单的问题:

我正试图在Heroku上推出一个分支(主分支):

$ git push production
To git@heroku.com:my-app.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'git@heroku.com:my-app.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
我意识到这意味着远程存储库中的代码比本地repo中的代码“更新”。我们的建议是
git pull…
,但这是一个Heroku回购协议,我们只会推动它

我还意识到我可以
push-f
强制进行更改,但我想了解git为何抛出此消息,特别是因为这是一个生产部署


所以,我想深入了解Git认为什么是错误的。。。如何判断本地缺少哪些提交?当我区分本地主机和生产主机时,我看到了我将要推动的几十(数百?)条差异线路。我想看到的是git认为在本地不存在的production/master上存在的东西。

你的团队中有其他人在推动,因此你支持Heroku回购协议?你能试着“git获取origin--dry run”看看它会得到什么吗?如果您git获取origin/master“并将新更改拉入origin/master,那么您可以使用git日志列出origin/master提示和本地跟踪master分支之间的差异,以查看增量,类似于“git log origin/master--not master”“

你的团队中有其他人在这段时间内推动你,所以你支持Heroku回购协议?你能试着“git获取origin--dry run”看看它会得到什么吗?如果您git获取origin/master“并将新更改拉入origin/master,那么您可以使用git日志列出origin/master提示和本地跟踪master分支之间的差异,以查看增量,类似于“git log origin/master--not master”“

我怀疑你在这里有一两个基本的误解,这会把你引向错误的方向。在git中,提交只是一个标识源树的某个特定版本的对象(以及通常的提交消息和父提交ID列表;最后一个很重要,因为它们是git如何构造“提交图”——这将导致下面的“分支”)

特别是,这意味着提交不是“在前面”或“在后面”。它就在那里,或者不在那里:这就是它所能做的,存在或不存在

在git中,显然这是通过heroku公开的,还有“分支”的概念。不幸的是,这一术语负担过重。它可以指其中一个(或多个):

  • 提交图的子集(“DAGlet”)
  • 分支标签名称
  • “远程分支”标签
有关更多信息,请参见一些漂亮的图形,这些图形演示了分支标签如何指向git基于存储在每个分支提示提交中的父提交ID构造的提交图的各个部分

正是这些分支标签“领先”和/或“落后”它们的远程对应项

在本例中,您在heroku服务器上有一个共享的远程存储库(您称之为
production
:这是一个“远程名称”,而不是分支名称)。您的本地机器上也有自己的本地存储库(您的合作者在其机器上有自己的本地存储库,所有这些存储库都独立于单个共享heroku存储库)。当某个合作者(为了方便起见,我们叫他Bob)进行一些更改和推送时,他会将其提交给共享存储库,但您没有这些提交,您只有您的提交:您先前共享的所有提交,加上您刚刚创建的一些尚未共享的新提交

因此,现在Bob已经进行了一些新的提交并成功地推送了它们。现在,他的回购协议和共享回购协议的承诺基本上与您的相同,再加上他的新承诺。你没有那些新的,但是你有你自己的新的。也就是说,你有这样的东西:

A <- B <- C <- D <- F   <-- master
其中
E
是新的提交

Git不知道或真的关心Bob(你也不必关心),在你推Git时,Git只知道它在互联网电话上给heroku打电话,发送你的提交
F
,然后让heroku的Git指向标签
master
,提交
F

如果heroku端git这样做,远程存储库将最终拥有与您相同的提交链,其中
F
指向
D
,后者指向
C
,依此类推。提交
E
不再有人指向它,因此它会丢失。这就是远程(heroku)git告诉您git的,然后您的git告诉您:如果远程设备做出了git要求它做出的更改(或者,使用
--force
,您的git将命令它做出更改),那么至少有一个提交将丢失

(请注意,即使heroku git丢失了此提交,Bob的git也不会受到影响:他仍然会有他的提交
E
。但这意味着您将迫使Bob恢复他的工作,可能是告诉heroku git再次忘记您的工作,改用他的。这不是合作的方式。:-)


至于怎么做,你有两个(或三个,取决于你如何计算)选择:

  • 粗暴地对待鲍勃:用力推一推,就把他干掉了
  • 协作:将您的工作合并或重新设置为Bob的工作
(如果将最后一个拆分为“merge with”作为一个选项,将“rebase On”作为第二个选项,则有三个选项)

这两个“协作”选项都要求您接受Bob的提交。你可以从鲍勃那里得到它,但在这一点上,从赫罗库那里得到它更容易。要做到这一点,您可以从git fetch production开始:这将获得heroku拥有的所有提交,而您没有,在本例中,这意味着提交
E
,并将它们复制到您自己的本地存储库,将它们放在“远程分支”上。(旁注:您可以
A <- B <- C <- D <- E   <-- master
                   F   <-- master
                 /
A <- B <- C <- D
                 \
                   E   <-- production/master
                   F
                 /
A <- B <- C <- D
                 \
                   E - F'
A <- B <- C <- D <- E <- F'
A <- B <- C <- D <- E <- F   <-- master, production/master
$ git log master..origin/master
$ git log origin/master..master
                   F   <-- master
                 /
A <- B <- C <- D
                 \
                   E   <-- production/master