Maison > Questions et réponses > le corps du texte
Peut-être que ce que je dis n'est pas très clair, mais au fur et à mesure que j'écrivais le code, j'ai découvert que je ne voulais plus le faire, alors j'ai utilisé git reset --hard <版本号>
pour revenir à une version précédente et la réécrire, de sorte que quand j'ai fini en écrivant, je voulais le soumettre à l'entrepôt distant, il signalera une erreur
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.
Il a été dit que ma version était la précédente et que je devais la fusionner puis la soumettre. Que dois-je faire. Je l'ai essayé plusieurs fois mais je ne l'ai toujours pas compris.
黄舟2017-06-16 09:21:00
Tout d'abord, selon votre description, puisque vous avez utilisé git reset --hard
,那就可以推断出你已经 add
和 commit
过了。
其次,根据报错,可以推断出你已经 push
(cette inférence est basée sur le fait que vous seul disposez des autorisations de modification de la branche principale.
Ensuite, lorsque vous exécutez git reset --hard
, les enregistrements historiques ne peuvent pas être directement fusionnés avec les enregistrements distants. C'est pourquoi il y a cette erreur.
Par exemple, la télécommande est A -> B -> C -> D
,你 git reset --hard
之后是 A -> B
。这时候除非远程那边抹掉 C
和 D
et votre
A -> À l'heure actuelle, à moins que le côté distant n'efface C
et D
, il ne peut pas être fusionné.
git push origin master --force
Par conséquent, à ce stade, vous devez utiliser pour forcer l'écrasement de l'enregistrement distant.
git pull
。否则,你的本地又会变成 A -> B -> C -> D
。因为 git pull
相当于 git fetch
+ git merge
Veuillez ne pas utiliser selon les instructions
A -> B -> C -> D
(Le contenu suivant est basé sur l'exemple ci-dessus, la télécommande est
et vous souhaitez revenir à l'état B)
git revert
。其实,git reset --hard
和 git revert
git revert
a été mentionné à l'étage. En fait,
et git revert
peuvent obtenir un "code de restauration". Mais la différence est :
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
supprimera directement C
et D
, formant un résultat comme A -> L’avantage est que c’est plus direct et plus approfondi. L'inconvénient est qu'il faut d'abord forcer le changement . Deuxièmement, une fois que vous le regrettez, il n'y a pas d'autre moyen que de restaurer directement le pointeur HEAD selon le reflog
local.
Peu importe celui que vous utilisez, veuillez choisir en fonction de vos besoins. 🎜🎜répondre0
漂亮男人2017-06-16 09:21:00
D'une manière générale, essayez d'éviter cette situation.
Si vous avez l'autorisation d'accéder au maître distant, vous pouvez faire ceci :
git push --force
Une approche plus raisonnable consiste à utiliser git revert
Modifier les lignes de démarcation
Un autre étudiant @S1ngS1ng a donné une réponse plus détaillée, mais il a souligné que n'importe lequel peut être utilisé. Je dois encore réitérer que git revert est l'approche la plus appropriée
.Lorsqu'il s'agit d'un scénario de développement multi-personnes, il est très probable que le dernier code ait été extrait par d'autres sur le maître distant ou fusionné dans d'autres branches. Dans ce cas, la réinitialisation ne sera pas valide, car l'autre partie peut toujours pousser. et je souhaite le supprimer.
Donc, cette idée selon laquelle vous pouvez utiliser n'importe qui a en fait des limites