Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.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拒绝推送(在远程对等方后面)_Git_Github - Fatal编程技术网

Git拒绝推送(在远程对等方后面)

Git拒绝推送(在远程对等方后面),git,github,Git,Github,在这个问题上有很多问题,但它们似乎都是指当发生远程更改时。我不是这样的 $ git push repo master ... hint: Updates were rejected because the tip of your current branch is behind hint: its remote counterpart. $ git fetch repo master $ git diff repo/master <single commit I've done loca

在这个问题上有很多问题,但它们似乎都是指当发生远程更改时。我不是这样的

$ git push repo master
...
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart.

$ git fetch repo master
$ git diff repo/master
<single commit I've done locally>
所以,很明显,我有一个远程提交,在一个只有我能访问的回购协议中,我在本地没有。我只使用一台计算机,除了这台计算机和我之外,提交不能来自其他任何地方。我很困惑

编辑2: 所以,在贾瓦布雷特的回答之后,我冒险进行了重新登录

d022f6d HEAD@{144}: pull bt master:
41a6f50 HEAD@{145}: pull bt master: checkout 41a6f50f7e3e96723f0d1c222205645d78a504db
48673b3 HEAD@{146}: commit: Added commented out urls to .env
14948e3 HEAD@{147}: rebase finished: returning to refs/heads/master
14948e3 HEAD@{148}: pull bt master: checkout 14948e3c4dd014bb5af7293fdee6772a9e605b6f

其中,bt是共享回购协议。我最好的猜测是,我已经推出了我的私人回购协议,但从共享回购协议中退出后,我将其重新设置为bt/master,最初的提交“消失”。再次推送到private将触发拒绝,因为历史记录不同步。大概是吧?

也许你可以尝试使用重基选项

git pull --rebase origin master
比:


gitk
视图有点小,所以这里有点猜测,并且不包含提交哈希或当前本地
HEAD
或提交“从主布局中删除的广告”-是带有注释的提交“添加注释的URL到.env”还是完全不同的内容?无论哪种方式,它都没有提交散列
48673b3

您的
--contains
测试很有帮助。您还应该运行
git reflog
grep
或搜索
48673b3
。这可能会向您显示您的本地
何时指向
48673b3
,以及随后发生的情况

最有可能的情况是,通过直接命令或某种工具,您已经在本地repo中的
remotes/origin/master
重新分配、压缩或修改了提交。或者您可以重置日期/时间或作者。Git现在将其视为一条独立的开发线——您永远不应该重新设置基础或压缩到您已经在某个地方推动的承诺中,如果这是已经发生的事情,那么再次强调

您的
git reflog
可能会显示如下内容,例如:

20fa43d HEAD@{0}: commit (amend): Added commented out urls to .env
48673b3 HEAD@{1}: commit: Added commented out urls to .env
e039c6c HEAD@{2}: commit: Updated backend variables to new test server.
如果是这样的话,(修正案)会告诉你哪里出了问题——在这种情况下,你会重写当地的历史,你不能再快速推进这一分支。如果是这种情况,您可以使用rebase修复它(可能首先在临时分支上执行此操作):

根据本地历史记录中发生的更改,您可能会在本地历史记录中得到一个合并冲突,以解决修改后的提交。之后,您将重新编写任何本地提交,以便它们与远程历史一致,并且您应该能够执行快进推送

问题编辑2答案更新:

有了另一个,上游远程,再基地和reflog的信息,发生了什么就相当清楚了

您在
48673b3
中所做并推送到
origin/master
的相同更改也包含在另一个提交中,该提交可以是您自己进行的,也可以是与其他更改混合进行的,由您或其他人进行,并推送到
上游/master
bt/master
)。当您从上游
git pull
ed时,git将创建一个合并提交。虽然它没有显示在reflog中,但是您在前面的
HEAD@{148}
/
HEAD@{147}
中进行了拉取并重新设置了基础,因此可以合理地假设您在
HEAD@{144}
之后的某个时间再次这样做,试图返回到线性历史,删除合并提交。您运行了
git-rebase
而没有
——keep empty
,当
48673b3
bt/master
上重放时,无需执行任何操作,因此放弃了提交,这是rebase的默认行为

origin/master
现在已经偏离了本地回购协议,在最年轻的公共父级(可能是
14948e3
之前提交了一次
48673b3
)。Git不允许您推送(如果没有
-f
force)-即使树散列可能相同,提交历史也会发生分歧

关于工作流的一些建议:

1) 如果您更喜欢重定基址和线性历史,而不是合并提交(足够公平),那么请始终坚持它。运行
git-fetch…
git-rebase…
,永远不要运行
git-pull
(fetch-and-merge)或
git-merge
,或者如果必须运行它们,请使用
--ff=only
,这样它们只在本地没有任何更新的提交时运行。考虑设置配置<代码>拉.ff= = 和<代码>合并。FF=强制执行此操作,以防在命令行上忘记它们。有了这一点,除非您明确表示不这样做,否则您永远不会进入上游的非线性状态,您将始终被提醒
git-rebase-bt/master

这实际上不会解决您的问题,但最好避免混合合并/重新调整策略。如果您的策略是重新设置基础,但意外创建了合并,请重置为最新的本地提交,然后重试


2) 如果您使用并推送两个远程回购,其中一个发生变化(上游),并且您正在重新定基,那么您迟早会遇到此问题,需要确定您的本地回购现在是“最新的”,并强制推送到您的私有
原始/主回购。对一个已经被推到远程的分支进行重定基址,最终总会失败——重定基址(或挤压或修改)是重写历史的方法,因此历史总是会发生分歧。如果您仅将
origin/master
用作代码的“只写”远程备份,请习惯于运行
push-f
来覆盖它(当然,您需要知道这是正确的,否则将丢失提交),或者更好,只需
推送原点标头:
`date-u+%Y%m%d%H%m%S``即可为您提供无冲突的引用,您可以稍后丢弃这些引用。如果您正在使用
origin
进行更复杂的操作,那么您需要注意重定到上游时会遇到的问题。

听起来您的更改已经被推送了
git push
20fa43d HEAD@{0}: commit (amend): Added commented out urls to .env
48673b3 HEAD@{1}: commit: Added commented out urls to .env
e039c6c HEAD@{2}: commit: Updated backend variables to new test server.
git rebase --onto origin/master origin/master