Git非快进拒绝

我觉得这个问题已经被多次提出,但是解决scheme通常是“我删除了这个目录,并重新做了一个新的结账工作”。 我做了一个提交和推送,但意识到我在提交消息中提到错误的票号。 所以我看了这么快速的解决scheme ,最后在terminal上input了以下内容:

$ git reset --soft HEAD^ $ git commit -m "... correct message ..." 

唯一的问题是我收到以下错误信息:

 To prevent you from losing history, non-fast-forward updates were rejected Merge the remote changes before pushing again. See the 'Note about fast-forwards' section of 'git push --help' for details. 

我正在使用git-flow模型,并正在开发分支上工作。 我怎样才能让事情重新融合,让Git再次开心呢?

强制推荐git push

 git push origin +develop 

如果你推送一个提交到服务器,然后在本地重写提交(使用git resetgit rebasegit filter-branch或其他历史操作),然后将重写的提交重新提交到服务器,与其他谁拉了。 这是一个例子。 说你已经提交了A,并将其推送到服务器。

 -  *  -  *  -  A < - 主

 -  *  -  *  -  A < -  origin / master

现在你决定用你提到的方式重写A,重新设置和重新提交。 请注意,这留下了一个悬而未决的提交,A,它将最终被垃圾收集,因为它是无法访问。

 -*-*-一个
     \
     一个'< - 主

 -  *  -  *  -  A < -  origin / master

如果有其他人,比如说Fred,在你这样做的时候从服务器上拉下master服务器,他们会引用A,他们可能会开始工作:

 -  *  -  *  -  A'< - 主

 -  *  -  *  -  A < -  origin / master

 -  *  -  *  -  AB < -  fred / master

现在,如果你能够把你的A'推到起源/主人,这将创造一个非快进,它不会有历史上的A. 所以如果Fred试图再次拉动,他会突然不得不合并,并重新介绍A commit:

 -  *  -  *  -  A'< - 主

 -  *  -  *  -  A < -  origin / master

 -  *  -  *  -  AB- \ 
     \ * < -  fred / master
     一个' - /

如果Fred注意到这一点,那么他可以做一个rebase,这会阻止commit A再次出现。 但他必须注意到这一点,并记得这样做; 如果你有不止一个人把A拉下来,他们都必须重新绑定,以避免在树中获得额外的A提交。

所以,改变其他人的回购历史通常不是一个好主意。 但是,如果您碰巧知道没有其他人正在从该回购仓库中撤出(例如,这是您自己的私人回购,或者您只有一个其他开发人员在您可以轻松协调的项目上工作),那么您可以强行通过运行更新:

 git push -f 

要么

 git push origin +master 

这些都将忽略对非快速推送的检查,并将服务器上的内容更新到新的A版本,放弃A版本,以便最终将垃圾收集。

使用receive.denyNonFastForwardsconfiguration选项可以完全禁用强制推送。 此选项在共享存储库上默认启用。 在这种情况下,如果你确实想要强制推送,最好的select是删除分支并重新创build它,用git push origin :master; git push origin master:master git push origin :master; git push origin master:master 。 但是, denyNonFastForwards选项由于上面描述的原因而被启用; 在一个共享的存储库上,这意味着现在每个使用它的人都需要确保他们重新投入新的历史。

在一个共享的存储库上,通常最好是推动新的提交,以解决你所遇到的任何问题。 你可以使用git revert生成提交,以撤销之前提交的更改。

你可能不得不做一个git pull ,这可能会自动合并你的东西。 然后你可以再次提交。 如果你有冲突,它会提示你解决它们。

请记住,如果你没有更新你的gitconfig来指定哪个分支,你必须指定哪个分支…

例如:

 git pull origin develop:develop 

我正在使用EGit,我也面临这个问题。 只是试图重新分配当前的分支,它的工作。