为了推动落后的分支,我需要做些什么

时间:2013-12-27 01:30:17

标签: git

我把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

3 个答案:

答案 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

请注意力量推动可能是危险的并且干扰历史。