2009-09-04 117 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目錄被替換爲它之前提交了幾次提交的狀態。