我有两个提交,我已经提交并推送了。 我需要将代码返回到状态'两次提交之前'。
我可以使用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。
答案 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
。