2

我这里有点情况。我重新设置了一个开发分支,并尝试推送它,但它被拒绝了(非快进)......因为我不知道为什么,我来找你......

我做了什么:

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

知道为什么我的推动是“非快进”并因此被拒绝吗?

4

1 回答 1

6

这不是快进,因为你做了一个 rebaserebase接受一堆提交并从中创建新的提交(可能在提交 DAG 中的不同位置)。git rebase在实际运行之前,请确保您了解运行的所有含义。无法快进是这些影响之一。

重新定位已发布的历史通常被认为是一个坏主意。如果您确实必须重新设置分支并推送它,请将-f标志传递给 git push,或在您的 refspec 前加上+( git push remote +dev)。

克隆了您的存储库并在该分支上工作的其他人将必须执行相同的变基,否则您将在下次从您的贡献者之一合并时合并旧历史。


详述快进:

从您的图表中很容易看到。快进基本上只会将提交附加到历史记录。每个提交都由其提交哈希唯一标识。提交哈希是根据提交内容以及提交历史计算的。这意味着根据定义,具有不同祖先/父母的提交将具有不同的散列。

如果您进行多次提交并将它们插入 DAG 中的不同位置,它们将描述不同的历史记录并获得新的提交哈希(提交时间也已更新,但这不是重点)。因此不可能快进,因为它不再是仅附加的。此外,在变基并推送结果后,您将无法访问旧的提交(无需使用 reflog)。

另一种思考方式:您的 push 不会将提交附加到旧的 ( remote/dev) 分支,而是将提交附加到其他地方 (commit G)。

于 2012-08-29T10:01:31.563 回答