git - 推送一个重新设置的分支?

标签 git git-rebase git-push

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

我做了什么:

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/

相关文章:

git:如何获取冲突文件的副本?

git - git 提交的 "-a"选项如何写入提交消息?

git - 舞台部分线

git - 如何将我的更改推送回 git 中的源代码

django - 如何使用 django 确保数据库更改可以轻松地通过 DVCS 移动

git - 将本地分支从另一个本身经常重新定位的分支中重新定位是不是很糟糕?

git - 为什么 'git bisect' 分支不知道?

ssh - gitlab 5.1 为新用户新添加的 ssh key 仅在一天后工作(推送/克隆)

git - 从本地 master 推送到远程非 master 分支

git - 如何在 git rebase interactive 之后解释 "deleted by us"