2009-09-04 118 views
171

我有一个仓库,它有一些坏提交(在这个例子中,D,E和F)。Git reset --hard和一个远程仓库

A-B-C-d-E-F主站和原点/主

我已经与一个git reset --hard具体修改的本地资源库。我把一个分支复位之前,所以现在我有一个回购协议,看起来像:

A-B-C master 
    \ D-E-F old_master 

A-B-C-D-E-F origin/master 

现在我需要那些坏的提交,所以我的樱桃采摘我所需要的比特和取得的一些地方一些新的承诺,现在我有本地如下:

A-B-C-G-H master 
    \ D-E-F old_master 

现在我想推动这种情况的远程回购。然而,当我尝试做一个git push的Git礼貌地给我刷过:

$ git push origin +master:master --force 
Total 0 (delta 0), reused 0 (delta 0) 
error: denying non-fast forward refs/heads/master (you should pull first) 
To [email protected]:myrepo.git 
! [remote rejected] master -> master (non-fast forward) 
error: failed to push some refs to '[email protected]:myrepo.git' 

我如何获得远程回购采取本地回购的现状如何?

+2

这是一个“几乎”重复的几个“我如何推送修订历史问题”,例如在这里看到答案http://stackoverflow.com/questions/253055/how-do-i-push-amended-commit-to-the-remote-git-repo/255080#255080 – 2009-09-04 08:26:42

+2

这是真的,我已经搜索StackOverflow for发布前的答案。然而,我的搜索只是出现了一个解决问题的答案。感谢您链接到您的文章:) – robertpostill 2009-09-04 08:52:14

+1

您将很快(git1.8.5,2013年第4季度)能够[更仔细地执行'git push -force'](http://stackoverflow.com/a/18505634/6309) 。 – VonC 2013-09-10 08:42:31

回答

251

如果强制推没有帮助(“git push --force origin‘或’git push --force origin master”应该是足够了),这可能意味着远程服务器拒绝非快速向前推或者通过receive.denyNonFastForwards配置变量(见git config说明手册页),或通过更新/预接收钩子。

对于旧的Git,您可以通过删除“git push origin :master”(请参阅​​分支名称前的':'),然后重新创建分支给定的“git push origin master”来解决该限制。

如果你不能改变这一点,那么唯一的解决办法是,而不是改写历史创建DEF提交reverting变化:

 
A-B-C-D-E-F-[(D-E-F)^-1] master 

A-B-C-D-E-F        origin/master 
+2

@JakubNarębski,谢谢。 '恢复HEAD〜N'的帮助。 'N'是提交的数量。例如,如果我需要以前的提交,我会使用'git revert HEAD〜1' – 2013-04-03 09:10:40

+4

我可以证明'''git push --force origin master''工作并为我节省了很多麻烦。 – FearlessFuture 2015-07-24 02:32:24

23

为补充的Jakub的答案,如果你有机会到在SSH远程git的服务器,你可以进入远程Git目录,并设置:

[email protected]$ git config receive.denyNonFastforwards false 

然后返回到你的本地回购,再次尝试做--force您的承诺:

[email protected]$ git push origin +master:master --force 

最后恢复服务器的设置与原来的保护状态:

[email protected]$ git config receive.denyNonFastforwards true 
+0

另请参阅http://pete.akeo.ie/2011/02/denying-non-fast-forward-and.html有关sourceforge的定制信息。 – hlovdal 2014-03-07 22:41:21

+0

在此SO帖子中提供了有关如何使用'vi'禁用denyNonFastForwards的详细说明:stackoverflow.com/a/43721579/2073804 – ron190 2017-05-01 23:18:24

0

整个混帐重置业务看起来很复杂。

所以我做了一件沿线让我src文件夹的状态我有几个提交前

# reset the local state 
git reset <somecommit> --hard 
# copy the relevant part e.g. src (exclude is only needed if you specify .) 
tar cvfz /tmp/current.tgz --exclude .git src 
# get the current state of git 
git pull 
# remove what you don't like anymore 
rm -rf src 
# restore from the tar file 
tar xvfz /tmp/current.tgz 
# commit everything back to git 
git commit -a 
# now you can properly push 
git push 

这样的事务中的SRC的状态保持在一个tar文件和Git是被迫接受这个状态时没有太多的摆弄,src目录被替换为它之前提交了几次提交的状态。