Maison > outils de développement > git > le corps du texte

Quelle est la différence entre réinitialiser et revenir dans git

青灯夜游
Libérer: 2021-11-30 14:58:15
original
25823 Les gens l'ont consulté

Différences : 1. La réinitialisation est un retour complet à la version de validation spécifiée, et toutes les validations après la validation seront effacées ; tandis que la restauration annule uniquement la modification de la validation spécifiée et n'affecte pas les validations ultérieures. 2. Aucun enregistrement ne sera généré après l'exécution de la réinitialisation, mais les enregistrements seront générés après l'exécution de la restauration.

Quelle est la différence entre réinitialiser et revenir dans git

L'environnement d'exploitation de ce tutoriel : système Windows 7, Git version 2.30.0, ordinateur Dell G3.

Git est notre outil de gestion de versions couramment utilisé. Lorsque notre équipe collabore sur des projets de développement, divers conflits surviennent souvent en raison de modifications et de soumissions de code et de fichiers. Il y a également des changements fréquents dans les exigences du produit, ce qui nous oblige à revenir en arrière. la version et retirez la décision de commettre, puis les commandes de réinitialisation et de retour sont utiles !

Réinitialiser et revenir en arrière ont tous deux le sens d'annuler et de revenir en arrière, mais chacun a ses propres mérites et la différence est toujours très grande, donc la commande à utiliser doit être décidée en fonction de la situation réelle. Cet article est pour vous aider. vous comprenez la différence entre les deux, puis êtes capable d'utiliser les commandes correctes avec précision et rapidité pour résoudre les problèmes réels !

下面的例子中,我有3次提交:
初始状态,只有readme一个文件,内容为Creating a new branch is quick.
t1提交后状态:只有readme一个文件,内容修改为Creating a new branch is quick 1.
t2提交后状态:只有readme一个文件,内容修改为Creating a new branch is quick 1 2.
t3提交后状态:新增了test文件.
Copier après la connexion

Cet article prend git bash comme exemple :

Quelle est la différence entre réinitialiser et revenir dans git
Parlons d'abord de la réinitialisation :

reset, méthode d'utilisation : git reset --hard commit, commit est le SHA1 généré après la soumission, après avoir exécuté cette commande, le code reviendra complètement à l'état au moment de cette soumission, et la zone de préparation du travail et le contenu de la soumission après cette soumission seront complètement effacés, y compris l'enregistrement de la soumission ! git reset --hard commit ,commit是提交后产生的SHA1,执行该命令后,代码会完全回退到本次提交时的状态,工作暂存区以及本次提交后面的提交内容将会被完全清除,包括提交记录!

举例:

原项目,包含一个Readme.txt文件:
Quelle est la différence entre réinitialiser et revenir dans git
文件内容:
Quelle est la différence entre réinitialiser et revenir dans git
此时我将修改文件内容为:

Creating a new branch is quick 1.

进行第一次提交
Quelle est la différence entre réinitialiser et revenir dans git
提交记录:
Quelle est la différence entre réinitialiser et revenir dans git
提交后的远程仓库目录及文件内容:

Quelle est la différence entre réinitialiser et revenir dans gitQuelle est la différence entre réinitialiser et revenir dans git
没有问题,继续修改文件内容:Creating a new branch is quick 1 2. ,进行第二次提交
Quelle est la différence entre réinitialiser et revenir dans git
现在我将新增一个test文件,进行第三次提交
Quelle est la différence entre réinitialiser et revenir dans git
Quelle est la différence entre réinitialiser et revenir dans gitQuelle est la différence entre réinitialiser et revenir dans git

好了,现在产品需求变更了,新增的功能(readme的第二次修改和新增的test文件)不需要了,要求回退到第一次提交“t1”,如果我们选择使用reset:

首先定位到t1的commit,可以从远程仓库提交历史记录中复制,也可以用命令git log查看:

Quelle est la différence entre réinitialiser et revenir dans git
(小提示,如果最后一行出现“:”,则输入wq退出回到命令行即可!)

复制commit,执行命令:

git reset --hard 8cbf16c0821d20fe42c361f4e3d75a0493dc5fc2
Copier après la connexion

Quelle est la différence entre réinitialiser et revenir dans git

提示,HEAD已经指向了t1,但你刷新后台时,发现并没有什么变化,这是因为我们还需要执行一下push,但这里需要注意的是,因为本地代码回到了旧版本,但远程仓库是新版本和本地不一致,所以你在用git push时会报错,这里我们需要使用强制提交,git push -f,我们也可以使用git status

Exemple : Quelle est la différence entre réinitialiser et revenir dans git

🎜Projet original, comprenant un fichier Readme.txt : 🎜Insérer la description de l'image ici🎜 Contenu du fichier : 🎜 Insérer description de l'image ici🎜 À ce stade, je modifierai le contenu du fichier comme suit : 🎜🎜🎜Créer une nouvelle branche est rapide 1.🎜🎜🎜 Faites la 🎜 première soumission🎜 : 🎜Insérer la description de l'image ici🎜 Enregistrement de soumission : 🎜Insérer la description de l'image ici🎜 Répertoire de l'entrepôt distant et contenu du fichier après soumission : 🎜🎜 Insérer la description de l'image iciInsérer la description de l'image ici🎜 Pas de problème, continuez à modifier le contenu du fichier :🎜Créer une nouvelle branche est rapide 1 2.🎜, effectuez un 🎜deuxième commit🎜 : 🎜Insérer description de l'image ici🎜 Maintenant, je vais ajouter un fichier de test et faire la 🎜troisième soumission🎜 : 🎜Insérer la description de l'image ici🎜Insérer description de l'image iciQuelle est la différence entre réinitialiser et revenir dans git🎜🎜 Bon, maintenant les exigences du produit ont changé, les nouvelles fonctions (la deuxième modification du readme et le nouveau fichier de test) ne sont plus nécessaires, et il est nécessaire de revenir à la première soumission "t1", si nous choisissons de le faire. utilisez reset : 🎜🎜 Localisez d'abord le commit de t1, qui peut être copié à partir de l'historique des commits de l'entrepôt distant, ou vous pouvez utiliser la commande git log pour afficher : 🎜🎜Insérer la description de l'image ici🎜(Conseils, si la dernière ligne apparaît ":", puis entrez wq pour quitter et revenir à la ligne de commande ! )🎜🎜Copiez le commit et exécutez la commande : 🎜
git revert 8cbf16c0821d20fe42c361f4e3d75a0493dc5fc2
Copier après la connexion
Copier après la connexion
🎜 Insérez la description de l'image ici 🎜🎜 Astuce, HEAD a pointé sur t1, mais lorsque vous actualisez l'arrière-plan, vous constatez qu'il n'y a aucun changement. C'est parce que nous devons encore effectuer un push, mais ce qu'il faut noter. voici qu'en raison du code local, nous sommes revenus à l'ancienne version, mais la nouvelle version de l'entrepôt distant n'est pas cohérente avec la version locale, vous obtiendrez donc une erreur lors de l'utilisation de git push. Ici, nous devons utiliser la soumission forcée, git push -f, nous pouvons également utiliser git statusAfficher l'état actuel : 🎜🎜🎜🎜

意思是告诉你,远程仓库代码较新,需要你执行 git pull操作以同步代码,但这并不是我们的需求,所以我们不用理会,执行,git push -f

![Quelle est la différence entre réinitialiser et revenir dans git](https://img-blog.csdnimg.cn/94c3e93f6efe40b6a4d12d02eb05cd4d.png

再看仓库:

Quelle est la différence entre réinitialiser et revenir dans git

历史记录只剩下了t1:

Quelle est la différence entre réinitialiser et revenir dans git

readme内容也得到了恢复:

Quelle est la différence entre réinitialiser et revenir dans git

可见,reset是彻彻底底的回退,该commit之后的所有修改将完全消失,包括提交记录。

优点

  • 彻底回退到指定版本,干净清爽;
  • 提交时间线清晰,没有冗杂;

缺点

  • 记录彻底清除,无法再次恢复;

再说revert

revert执行后会产生新的commit记录,是通过一次新的commit来恢复到之前旧的commit,但revert会保留恢复的该次提交后面的其它提交内容,假如后面的提交与要恢复的提交更改了同一地方,此时用revert就会产生冲突!

我们继续以上面的例子为例,我重新执行了t2和t3提交,恢复到reset之前的状态:

Quelle est la différence entre réinitialiser et revenir dans git
Quelle est la différence entre réinitialiser et revenir dans git
此时,我们按reset的思路,使用revert恢复到t1,执行命令:

git revert 8cbf16c0821d20fe42c361f4e3d75a0493dc5fc2
Copier après la connexion
Copier après la connexion

报错:

Quelle est la différence entre réinitialiser et revenir dans git
提示冲突了?让我们解决掉冲突后提交…

<<<<<<< HEAD
Creating a new branch is quick 1 2.
=======
Creating a new branch is quick.
>>>>>>> parent of 8cbf16c (t1)
Copier après la connexion

上面的冲突表示,当前的内容是:

Creating a new branch is quick 1 2.
Copier après la connexion

而我们要恢复的内容是:

Creating a new branch is quick.
Copier après la connexion

如果对revert命令没有深入了解的话,就可能会产生疑惑,为什么会冲突?而且我实际上是想像reset一样恢复或者说是回退到t1(这里要再次说明一下t1的状态:只有一个readme文件,且内容是Creating a new branch is quick 1),但为什么冲突提示要恢复到Creating a new branch is quick.???这不是初始状态吗?

其实,准确来说,revert是撤销/撤回/反提交的意思,我们不能按reset的思路理解,我们执行git revert t1,这么做其实结果是要撤销t1的提交,注意,仅仅是撤销t1的提交,把t1的修改恢复到t1之前也就是初始的状态,而不会影响t2,t3的提交。但如果t2,t3中修改了t1修改的同一地方,那么就会产生冲突,因为revert意图撤销t1的修改,但发现t2和t3把t1的修改再次修改了,此时,revert意图变得不清晰,因为它无法确定到底是应用你最新的修改,还是恢复到初始状态,这将由你来决定!

所以我们想要恢复t1的状态,那我们就应该撤销t2对t1的修改git revert t2

git revert fc4889dcb327cff9f8078db6a0d5c601b8e91ae9
Copier après la connexion

执行后会自动进入编辑界面:

Quelle est la différence entre réinitialiser et revenir dans git

这里需要我们修改或输入提交日志,按 “i”,进入输入状态,写完后按ESC退出输入状态,再按“:wq”退出!

成功后,执行 git push:

Quelle est la différence entre réinitialiser et revenir dans git

查看仓库后台:

Quelle est la différence entre réinitialiser et revenir dans git

项目目录:

Quelle est la différence entre réinitialiser et revenir dans git

readme内容:

Quelle est la différence entre réinitialiser et revenir dans git

可见,revert操作成功后,产生了新的commit记录,t2对t1的修改已经恢复,现在的readme就是t1提交后的状态,但同时test文件仍然存在,即t3的提交不受影响!

Mais si vous dites que vous souhaitez supprimer les soumissions de t2t3 tout comme la réinitialisation, vous pouvez d'abord rétablir t3, puis rétablir t2, ce qui peut obtenir le même effet. Mais dans ce cas, pourquoi ne pas simplement utiliser la réinitialisation ? Si vous souhaitez obtenir l'effet de réinitialisation et que vous souhaitez également avoir un enregistrement pour éviter les regrets, alors c'est tout. . . C’est une question qui mérite réflexion !

Résumé de la différence entre git reset et revert :

  • reset est un retour complet à la version de commit spécifiée, et tous les commits après le commit seront effacés, y compris l'historique des commits
  • revert est juste ; une révocation La modification du commit spécifié n'affectera pas les commits suivants, mais un conflit se produira si le commit révoqué est modifié au même endroit par un commit ultérieur
  • Reset ne générera pas d'enregistrements après l'exécution, mais revert générera des enregistrements après ; exécution ;
  • réinitialisation Il ne peut pas être restauré après l'exécution. Une fois la restauration exécutée, les enregistrements ne seront pas effacés et de nouveaux enregistrements seront générés, vous pouvez donc exécuter la restauration plusieurs fois pour restaurer l'état d'avant. certain changement ;
  • HEAD sera réinitialisé après l'exécution de reset Move, tandis que le HEAD de revert est toujours en avant

Une fois que vous aurez clarifié les principes de base de la réinitialisation et du revert, vous comprendrez quelle commande est la plus appropriée à utiliser ; quelle heure!

Conseils : Dans l'outil de développement IDEA, sélectionnez un fichier, faites un clic droit sur l'option git et vous trouverez un Rollback :

Quelle est la différence entre réinitialiser et revenir dans git
Cela doit être distingué de la réinitialisation et du retour, rollback n'appartient pas à La fonction de la commande git est qu'après qu'un fichier ou un code a été modifié mais n'a pas encore été validé et que vous souhaitez le restaurer dans un état cohérent avec le code de l'entrepôt distant, vous pouvez effectuer une opération de restauration !

Apprentissage recommandé : "Tutoriel Git"

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal