推一个重新分支?

Cyc*_*mic 2 git git-push git-rebase

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

我做了什么:

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
Run Code Online (Sandbox Code Playgroud)

知道为什么我的推动是"非快进"而被拒绝了吗?

kni*_*ttl 6

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

重新发布已发布的历史通常被认为是一个坏主意.如果你真的必须重新绑定你的分支并推送它,将-f标志传递给git push,或者在你的refspec前加一个+(git push remote +dev).

其他克隆了您的存储库并在该分支中工作的人必须执行相同的rebase,否则您将在下次与其中一个贡献者合并时合并旧历史记录.


阐述快进:

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

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

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