我把B推到了Github。我意识到出了问题,所以我按git reset --hard 61d4b9cb
重置为A(61d4b9cb)。
remote --o---o---A---B
\
local C
现在我进行了更改(与B中的文件相同)并作为C提交。现在当我将C推送到Github时,我收到以下错误。
To https://github.com/myname/repoame.git
! [rejected] master -> master (non-fast-forward)
...
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
我犹豫拉,因为它会再次改变我的文件(可能是我错了)。 为了推动C,我需要做什么?我想做到这样的事情。
--o---o---A---C
or
--o---o---A---B--C
答案 0 :(得分:2)
我不会选择git push -f
,因为你失去了那个错误的发展历史。如何做以下任何一项来纠正提交?
选项1:恢复错误的提交,创建一个好的提交C'
git revert ${commit_A}
git cherry-pick ${commit_C} # Commit C becomes another commit C'
git push origin HEAD:refs/heads/master # You push commit C' instead of C on top of the reverted A
选项2:强制带来C'代码状态
git checkout ${commit_C}
git reset --soft ${commit_B} # Going to commit B without changing the local code
git commit # Create commit C'
git push origin HEAD:refs/heads/master # Again, you push commit C' instead of C
答案 1 :(得分:1)
git push -f
将允许您覆盖存储库中的历史记录并离开--o---o---A---C
。需要注意的是,如果有人在B
存在的情况下从存储库中撤出,他们将会遇到与您类似的情况,B
可能会在他们推回存储库时被复活。
您的另一个选项是git rebase
C
B
。这应该会为您提供-o---o---A---B--C1
,其中C1
将包含将B
转换为C
所需的更改。然后,Git将允许您向上游推送C1
。
另一种选择是结帐B
,然后结帐git cherry-pick C
。在这种情况下,它等同于git rebase
之上的C
的手动B
。
答案 2 :(得分:0)
尝试使用-f
标志进行强制推送。例如:
git push -f origin master
请注意力量推动可能是危险的并且干扰历史。