撤消更改(已提交和已推送)

时间:2015-04-01 16:29:13

标签: git

我有两个提交,我已经提交并推送了。 我需要将代码返回到状态'两次提交之前'。

我可以使用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://git@aaa.bb.cc.dd:2222/ms-mobile-app/mobile-application.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'ssh://git@aaa.bb.cc.dd:2222/ms-mobile-app/mobile-application.git'

但我可以拉:

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

并进行普通提交。

我正在使用Gitlab。

1 个答案:

答案 0 :(得分: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