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 reset
, git rebase
, git 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.denyNonFastForwards
configuration选项可以完全禁用强制推送。 此选项在共享存储库上默认启用。 在这种情况下,如果你确实想要强制推送,最好的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,我也面临这个问题。 只是试图重新分配当前的分支,它的工作。