2015-04-01 138 views
1

我有兩個提交,我已經提交和推送。 我需要返回代碼以聲明'兩次提交前'。撤銷更改(提交併推送)

我可以用git reset --hard <hash>在本地做,但我不能推這種變化:

提示:更新被拒絕,因爲你的當前分支的尖端後面

哪有我將代碼返回到中央存儲庫中的一些以前的提交?

更新:

ms-app-actual/mobile-application » git reset --hard e50fa38c4865bd82fce7ddcf1e05d94012266364 ‹master› 
HEAD is now at e50fa38 Move Attachment class to separate Project 
    ms-app-actual/mobile-application » git push --force           ‹master› 
Total 0 (delta 0), reused 0 (delta 0) 
remote: GitLab: You don't have permission 
To ssh://[email protected]:2222/ms-mobile-app/mobile-application.git 
! [remote rejected] master -> master (pre-receive hook declined) 
error: failed to push some refs to 'ssh://[email protected]:2222/ms-mobile-app/mobile-application.git' 

但我可以拉:

ms-app-actual/mobile-application » git pull             ‹master› 
Updating e50fa38..cebcabf 
Fast-forward 

,使普通的提交。

我正在使用Gitlab。

+2

'git push --force'怎麼樣? – raina77ow 2015-04-01 16:31:23

+0

@ raina77ow既然這是正確的答案,爲什麼不把它作爲一個發佈呢? – Powerlord 2015-04-01 16:33:31

+0

嗯...我已經更新了我的問題。 – demas 2015-04-01 16:35:12

回答

2

做一個git reset --hard並強制推送更改將刪除提交。但是,您需要小心這樣做。如果其他人已經撤回了您的更改,則會導致他們的歷史記錄出現問題。看來Gitlab無論如何都阻止你這樣做。

最好的方法是創建一個新的提交,撤消更改並推送它。通過這種方式,任何人都不會在變更中合併任何問題。有幾種方法可以做到這一點。

1)創建兩個復歸提交和他們重訂成一個

git revert <sha of commit 1> 
git revert <sha of commit 2> 
git rebase -i <sha of commit is in good state> 
//Squash the two revert commits into one 
git push 

2)結帳所有修改過的文件從良提交和提交這些更改

git diff --name-only HEAD..HEAD~3 | xargs git checkout HEAD~3 -- 
//This should result in all the files modified in the two commits being changed. 
git commit -am "Reverting changes from commits" 
git push 

這些解決方案的兩個,基本上導致同樣的事情。一個新的提交與您在兩個不需要的更改中相反。這是撤銷推送到遠程存儲庫的更改的最安全方法。

作爲一條經驗法則:一旦將更改推送到遠程存儲庫,您應該認爲它們是永久性的。

既然你也試圖做reset --hard,爲了獲得提交,以便你可以撤消它們。所有你需要做的是git pull