我这里有一点情况。我重新建立了一个开发分支,并尝试推送它,但它被拒绝了(非快进)...由于我不知道为什么,我来找你...
我做了什么:
git checkout dev
git rebase G
# Here, I had to manually merge some files
# Result (in gitk) was :
# A---B---C remote/dev A'---B'---C' dev
# / /
# D---E---F------------------G---H remote/master
git push remote dev
知道为什么我的推送是“非快进”并因此被拒绝吗?
这不是快进,因为你做了变基。
rebase
获取一堆提交并从中创建新的提交(可能位于提交 DAG 中的不同位置)。在实际执行操作之前,请确保您了解运行 git rebase
的所有含义。无法快进是这些影响之一。
重新确定已发表历史的基础通常被认为是一个坏主意。如果您确实必须重新设置分支并推送它,请将
-f
标志传递给 git push,或者在您的 refspec 前面加上 +
(git push remote +dev
)。更好的是:用 --force-with-lease
推动。
克隆您的存储库并在该分支工作的其他人将必须执行相同的变基操作,否则您将在下次从贡献者之一合并时合并旧历史记录。
详细说明快进:
从你的图表中很容易看出这一点。快进基本上只会将提交追加到历史记录中。每个提交都由其提交哈希值唯一标识。提交哈希是根据提交内容以及提交历史来计算的。这意味着根据定义,不同祖先/父母的提交将具有不同的哈希值。
如果您进行多次提交并将它们插入 DAG 中的不同位置,它们将描述不同的历史记录并获得新的提交哈希(提交时间也已更新,但这不是这里的重点)。因此不可能“快进”,因为它不再是“仅追加”。此外,在变基并推送结果后,您将无法访问旧的提交(不诉诸引用日志)。
另一种思考方式:你的推送不会将提交追加到旧的 (remote/dev
) 分支,而是将提交追加到其他地方 (commit
G
)。