我这里有点情况。我重新建立了一个开发分支,并试图推送它,但它被拒绝了(非快进)...因为我不知道为什么,我来找你...
我做了什么:
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 。 rebase
接受一堆提交并从中创建新的提交(可能在提交 DAG 中的不同位置)。请确保在实际执行之前了解运行 git rebase
的所有含义。无法快进是这些影响之一。
Rebase 已发布的历史通常被认为是一个坏主意。如果你真的必须 rebase 你的分支并推送它,将 -f
标志传递给 git push,或者在你的 refspec 前面加上 +
(git push remote +dev
)。
克隆了您的存储库并在该分支工作的其他人将必须进行相同的 rebase ,否则您将在下次 merge 来自您的贡献者之一时 merge 旧历史。
详细说明快进:
从您的图表中可以很容易地看出这一点。快进基本上只会将提交追加到历史记录中。每个提交都由其提交哈希唯一标识。提交哈希是根据提交内容以及提交历史计算得出的。这意味着根据定义,不同祖先/ parent 的提交将具有不同的哈希值。
如果您进行多次提交并将它们插入 DAG 中的不同位置,它们将描述不同的历史记录并将获得新的提交哈希(提交时间也已更新,但这不是这里的重点)。因此不可能快进,因为它不再是append-only。此外,在 rebase 并推送结果后,您将无法访问旧提交(不求助于 reflog)。
另一种思考方式:您的推送不会将提交附加到旧的 (remote/dev
) 分支,而是将提交附加到其他地方 (commit G
)。
关于git - 推送一个重新设置的分支?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12175298/