git rebase和git push:非

我有一个分支机构应该可以提供给其他贡献者,并且应该不断与主人保持同步。

不幸的是,每次我做'git rebase'然后尝试推动,它就会导致'非快速前进'的消息和堕胎。 唯一的办法就是使用--force。 这是否意味着我应该使用'git merge'而不是重新分配,如果我的分支上市并且其他人正在处理它?


关于git如何工作的一些注意事项(非技术性):

当你重新绑定的时候,git会提交有问题的提交,并在清除历史记录之上“重新提交”它们。 这是为了防止显示历史记录:

Description: tree -> mywork -> merge -> mywork -> merge -> mywork -> merge
Commit SHA1: aaaa -> bbbb   -> cccc  -> dddd   -> eeee  -> ffff   -> gggg

重新绑定后,它可能看起来像这样(或类似):

Description: tree -> rebase
Commit SHA1: aaaa -> hhhh

问题在于你试图推出的新提交并不是你所推荐的分支顶端提交的后代

现在,你知道同样的信息在提交中,但git的责任不仅仅是覆盖那些提交(上面例子中的bbbb-gggg)。


共享回购模式

如果您正在使用共享存储库,那么这样的事情可能会引起混乱。 让我解释一下为什么。 假设另一位开发人员推倒了分支,他们在分支中提交了aaaa - > gggg 。 然后他们作出承诺iiii

与此同时,你重新启动并强制推动,导致树看起来像这样:

Description: tree -> rebase
Commit SHA1: aaaa -> hhhh

当其他开发者试图推动时,他会得到一个“非快速前进”的消息。 当他进行合并时,两个历史都会关联在一起,并最终导致混乱

像这样(杂乱):

Description: tree -> rebase -> mywork -> merge -> mywork -> merge -> mywork -> merge -> devwork -> merge 
Commit SHA1: aaaa -> hhhh   -> bbbb   -> cccc  -> dddd   -> eeee  -> ffff   -> gggg -> iiii    -> jjjj

换句话说,如果其他人在拉和推,最好是坚持使用git合并,或者在转入之前(并且只是重新绑定你的工作) 避免推。


公开可见的存储库模型

也许你正在使用一个不同的(更有意思的)模型,你只希望人们能够从你的回购中获得回报。 在这种情况下,git push --force并不算太坏,因为这样他们就可以处理它。 他们可以根据变更重新设定变更,然后再将补丁发给您。 它可以防止你的回购陷入混乱。

但是,对你来说可能有更好的办法。 git push --mirror

从http://www.kernel.org/pub/software/scm/git/docs/git-push.html

将$ GIT_DIR / refs /(包括但不限于refs / heads /,refs / remotes /和refs / tags /)下的所有ref映射到远程存储库,而不是将每个ref命名为push。 新创建的本地参考将被推送到远端,本地更新的参考将在远端强制更新,删除的参考将从远端移除。 如果设置了配置选项remote..mirror,则这是默认值。


git的一个重要特性就是它非常灵活,并且允许使用许多不同类型的工作流程。 但真正的优势在于它是一个分布式模型,所以我相信通过这种方式可以获得最大的投资回报率。


不,rebase与公共仓库完全合法,甚至可以保持历史流畅。 请记住,您不能使用rebase来重写远程发布的提交的历史记录。 也就是说,rebase只能应用于你自己的,本地的,你从未发布过的提交。 你可以使用rebase将你的提交放在它们之上,然后在那里调整它们。 您可能会收到此类消息的另一个原因是您推送的分支已更新,您需要同步 - 在您提取的内容之上提取并重新提交您的提交。

链接地址: http://www.djcxy.com/p/43547.html

上一篇: git rebase and git push: non

下一篇: git branch, fork, fetch, merge, rebase and clone, what are the differences?