Heim > Fragen und Antworten > Hauptteil
Vielleicht ist das, was ich sage, nicht ganz klar, aber als ich den Code schrieb, stellte ich fest, dass ich es nicht mehr tun wollte, also habe ich git reset --hard <版本号>
verwendet, um zu einer früheren Version zurückzukehren und sie neu zu schreiben, damit ich fertig war Beim Schreiben wollte ich es an das Remote-Warehouse senden, es wird ein Fehler gemeldet
To https://github.com/zifenggao/wenda.git
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/zifenggao/wenda.git'
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.
Da stand, dass meine Version die vorherige ist und ich sie zusammenführen und dann einreichen soll. Ich habe es mehrmals versucht, habe es aber immer noch nicht verstanden.
黄舟2017-06-16 09:21:00
首先,根据你的描述,既然你用到了 git reset --hard
,那就可以推断出你已经 add
和 commit
过了。
其次,根据报错,可以推断出你已经 push
过了(这个推断基于只有你一个人拥有 master branch 的更改权限。
那么当你执行 git reset --hard
之后,历史纪录是不能跟远程的记录直接合并的。因此才会有这个报错。
举个例子,远程是 A -> B -> C -> D
,你 git reset --hard
之后是 A -> B
。这时候除非远程那边抹掉 C
和 D
,否则是不能合并的。
因此,这时候,你应该使用 git push origin master --force
来强行覆盖远程记录。
请不要根据提示使用 git pull
。否则,你的本地又会变成 A -> B -> C -> D
。因为 git pull
相当于 git fetch
+ git merge
(以下内容基于上面的例子,远程是 A -> B -> C -> D
,你想回滚到 B 那个状态)
楼上提到了 git revert
。其实,git reset --hard
和 git revert
都可以实现“回滚代码”。但区别在于:
git revert
会把你的本地变成 A -> B -> C -> D -> E
。其中,E
干的事儿是删除 C
和 D
。这样做的好处在于,你 git push origin master
就不会有上面的报错了。但,历史线上还是会保留 C
和 D
这两个 commit。如果使用这个命令,记得要 add
然后 commit
。
git reset --hard
会直接删掉 C
和 D
,形成 A -> B
这样的结果。好处在于更直接更彻底。缺点在于,首先要通过 git push origin master --force
去强行更改。其次,一旦你后悔了,除非根据本地的 reflog
直接恢复 HEAD 指针,此外没有其他办法。
用哪个都是没错的,请根据自己的需要来选择。
漂亮男人2017-06-16 09:21:00
一般来说, 尽量避免这种情况.
如果你对远程的master有权限, 可以这么做:
git push --force
更合理的做法是使用git revert
编辑分割线
另一位同学 @S1ngS1ng 答案更加详细,但是抛出了一个观点是用哪个都可以,这个我还是要重申下 git revert 才是更合适的姿势
当是一个多人开发的场景,很有可能远程的master上已经被其他人pull到了最新代码或者合并到了其它分支,这种情况下reset将无效,因为对方仍然有可能push上来你这里希望删除的commit
所以这个用哪个都可以的观点其实是有限定条件的