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

Explication détaillée de git-reset pour l'apprentissage des commandes Git

青灯夜游
Libérer: 2023-03-23 19:33:18
avant
2897 Les gens l'ont consulté

Explication détaillée de git-reset pour l'apprentissage des commandes Git

La fonction de git-reset est de réinitialiser le pointeur HEAD de la branche actuelle et de pointer le pointeur HEAD vers un état spécifique.

Présentation de l'utilisation

git reset [<tree-ish>] [--] <pathspec>
git reset [--pathspec-from-file=<file> [--pathspec-file-nul]] [<tree-ish>]
git reset (--patch | -p) [<tree-ish>] [--] [<pathspec>]
git reset [--soft | --mixed [-N] | --hard | --merge | --keep] [<commit>]
Copier après la connexion

La fonction des trois premières lignes de la commande de réinitialisation est d'utiliser le contenu spécifié comme référence, puis de copier le contenu dans la zone de cache cible.

C'est quelque chose comme un arbre. Il y a beaucoup de choses qui peuvent former un arbre dans git, comme un arbre de validation ou un arbre de balises.

La fonction de la commande reset dans la dernière ligne est de pointer le pointeur HEAD de la branche actuelle vers . En même temps, vous pouvez utiliser une variété d'options pour contrôler s'il faut modifier la zone de cache ou. zone de travail.

Dans toutes les formes de commande ci-dessus, ou sont utilisés par défaut comme pointeur HEAD.

git reset [] [--]

Cette méthode a les règles suivantes :

  • mettra en cache les ressources de chemin correspondant à réinitialisé à l'état dans . Vous ne savez pas ce qu'est

  • Les modifications soumises au cache seront restaurées dans l'espace de travail.

Par exemple ?

Supposons qu'il y ait un fichier coffee.txt dans le projet. Le contenu du fichier est le suivant :

卡布奇诺纳瑞冰-19.9¥
标准美式-14.9¥
香草拿铁-19.9¥
生椰爱摩卡-19.9¥
...
Copier après la connexion
Copier après la connexion

Nous utilisons la commande git tag pour marquer la version actuelle comme v1.0.0 (la version actuelle). tag tag est utilisé ici comme).

Modifiez ensuite le fichier coffee.txt, le contenu de la modification est le suivant :

卡布奇诺纳瑞冰-19.9¥ --> 卡布奇诺纳瑞冰-14.9¥
标准美式-14.9¥ --> 标准美式-9.9¥
香草拿铁-19.9¥ --> 香草拿铁-14.9¥
生椰爱摩卡-19.9¥ --> 生椰爱摩卡-14.9¥
...
Copier après la connexion

Après avoir modifié le fichier coffee.txt, utilisez la balise git pour le marquer avec v1.0.1.

Si vous souhaitez restaurer le fichier coffee.txt dans le fichier de la v1.0.0 à ce moment, vous pouvez utiliser la commande git reset et le spécifier comme v1.0.0. L'opération est la suivante :

git reset v1.0.0 coffee.txt
Copier après la connexion

Utilisez VSCode pour. afficher les modifications du fichier dans la zone de cache :

Explication détaillée de git-reset pour lapprentissage des commandes Git

Vous pouvez voir la comparaison des modifications de code sur le côté droit de l'image. À ce moment, le fichier coffee.txt dans la zone de cache a été réinitialisé avec succès à l'état. du fichier dans la version v1.0.0 (Règle 1). Et à ce stade, les modifications que la v1.0.1 a soumises au cache ont également été restaurées dans l'arborescence de travail (règle 2).

Explication détaillée de git-reset pour lapprentissage des commandes Git

On peut voir que la commande git reset et la commande git add ont des effets opposés. L'une consiste à ajouter la ressource spécifiée à la zone de cache et l'autre à la supprimer de la zone de cache. Et cette commande a le même effet que git restaurer [--source=] --staged Ceux qui sont intéressés par la restauration peuvent lire cet article.

Comme mentionné ci-dessus, après avoir utilisé la commande reset, le contenu du fichier dans la zone de cache est v1.0.0. Vous pouvez utiliser la commande git restaurer pour restaurer le contenu de la zone de cache dans l'espace de travail, puis le modifier :

git restore coffee.txt --staged
Copier après la connexion

. Vous pouvez également choisir de restaurer le contenu de l'espace de travail selon vos besoins :

git restore coffee.txt --worktree
Copier après la connexion

git reset [--pathspec-from-file= [--pathspec-file-nul]] [ ;]

Dans l'exemple ci-dessus, le même chemin (coffee.txt) est utilisé à chaque fois pour la réinitialisation et la restauration. Le chemin du fichier étant relativement simple, il est plus facile de saisir chaque opération. Cependant, dans certains cas, vous devrez peut-être réinitialiser un chemin plus complexe. Par exemple, si le répertoire du projet est profond, vous devrez peut-être saisir une longue liste de chemins chaque fois que vous effectuez l'opération. Ainsi, git fournit une option --pathspec-from-file, qui nous permet de spécifier directement un fichier contenant le chemin Icia une utilisation plus détaillée.

Chaque ligne de ce fichier est un . S'il y a plusieurs , utilisez des caractères de nouvelle ligne comme séparation. Bien sûr, vous pouvez également utiliser --pathspec-file-nul pour utiliser NUL comme délimiteur pour chaque .

git reset (--patch | -p) [] [--] []

交互式的选择与缓存区之间的差异而产生的hunks。这些被选择的hunks将会撤销缓存区中的产生的修改。这里有更详细的--patch选项用法。

git reset [] []

该命令会把当前分支的HEAD指针指向某个,然后由决定是否同时更新缓存区或工作区的内容。默认值是--mixed,且必须是以下几种:

--soft

工作区和缓存区中的文件变动都将被保留,然后将HEAD指针指向

还是以咖啡菜单为?,假如第一次commit到仓库中的文件内容如下:

卡布奇诺纳瑞冰-19.9¥
标准美式-14.9¥
香草拿铁-19.9¥
生椰爱摩卡-19.9¥
...
Copier après la connexion
Copier après la connexion

然后做第二次commit操作,删除标准美式,增加生椰拿铁:

卡布奇诺纳瑞冰-19.9¥
-标准美式-14.9¥
+生椰拿铁-19.9¥
香草拿铁-19.9¥
生椰爱摩卡-19.9¥
...
Copier après la connexion

在commit后,修改卡布奇诺纳瑞冰的价格,添加到缓存区。再修改香草拿铁的价格,保留在工作区:

-卡布奇诺纳瑞冰-19.9¥
+卡布奇诺纳瑞冰-14.9¥ // 添加到缓存区中
生椰拿铁-19.9¥
-香草拿铁-19.9¥
+香草拿铁-14.9¥ // 保留在工作区
生椰爱摩卡-19.9¥
...
Copier après la connexion

此时我想保留工作区和缓存区做的改动,并且将HEAD指针指向第一次commit。这时可以使用--soft选项实现:

git reset HEAD^ --soft // 这里使用HEAD^表示上一个commit,同样也可以使用hash id
Copier après la connexion

使用git log查看当前HEAD指针确实已经指向第一个commit,第二个commit被抛弃了:

Explication détaillée de git-reset pour lapprentissage des commandes Git

同时所有的工作区和缓存区的改动都被保留了:

Explication détaillée de git-reset pour lapprentissage des commandes Git

当前只有两次的commit,是为了方便演示--soft选项的作用。但是在实际开发中,我们可能会commit多次,尤其是在测试环境改几个BUG就要提交到发布平台,这样会导致很多无意义的commit。这时候就可以使用--soft选项,重置HEAD到指定的只保留一到两个重要的commit。

--mixed

重置缓存区,但是会保留工作区的内容,这是的默认值。

相信在理解了--soft作用后,理解--mixed不难,上面例子中如果是使用--mixed那么最终结果如下:

Explication détaillée de git-reset pour lapprentissage des commandes Git

该选项会重置缓存区,但是保留工作区的改动,并将当前指针指向

--hard

重置缓存区和工作区中的所有的变动,并且将指针指向

--hard更加的简单粗暴,我们将--soft例子改为--hard来查看结果:

Explication détaillée de git-reset pour lapprentissage des commandes Git

如图所示,工作区和缓存区的内容都被重置了。不止是如此,就连Untracked文件同样也会被删除。

--merge

该选项的作用,看字面意思就知道大概就是把当前分支和指定的进行合并,规则如下:

  • 重置缓存区,任何已经添加到缓存区的改动都将被抛弃

  • 如果和HEAD之间有文件存在不同(这个不同指的是文件被删除或者新增),那么将会把该文件重置成中的状态(新增或删除)。

  • 如果和HEAD之间有文件存在不同(这个不同是指文件内容的不同),且此时工作区也存在未提交的改动,那么本次的reset将会被终止。

  • 如果一个文件在和HEAD中完全相同,但是它的工作区存与缓存区存在着不同(也就是改动未提交到缓存区),那么该文件在工作区的改动在重置之后就会被保留。

我们举个例子来验证一下以上列出的规则,假设此时的咖啡店项目有如下的几个commit。

第一个commit和文件内容如下:

Explication détaillée de git-reset pour lapprentissage des commandes Git

第一个commit中只有一个coffee.txt菜单文件,此时如果咖啡店引进了新品种开始卖果汁,那么就需要新增果汁菜单文件fruits.txt,于是就有了第二个commit:

Explication détaillée de git-reset pour lapprentissage des commandes Git

此时我们做一些改动来验证1,2,4这几点的规则,改动后的文件如下:

Explication détaillée de git-reset pour lapprentissage des commandes Git

首先修改coffee.txt文件,新增一款生椰拿铁咖啡,保留在工作区中。然后增加咖啡豆菜单文件beans.txt,将其添加到缓存区中。

假设因需求变动,咖啡豆菜单文件在缓存区中需要清除,果汁菜单文件需要删除,只有咖啡菜单中新增的生椰拿铁的改动需要保留。那么就可以使用git reset --merge将HEAD和commit-1进行合并,操作如下:

git reset --merge HEAD^
Copier après la connexion

结果如下:

Explication détaillée de git-reset pour lapprentissage des commandes Git

执行命令reset命令产生了如下效果:

  • 将当前HEAD指针指向了commit-1
  • 将缓存区中的beans.txt文件抛弃(规则1)
  • HEAD(commit-2)和commit-1中的fruits.txt文件存在不同(commit-2中新增fruits.txt),所以会将fruits.txt删除(规则2)
  • coffee.txt文件新增生椰拿铁的改动被保留在工作区中(规则4)

再来验证一下第3点规则,假设咖啡店项目此时第一个commit如下:

Explication détaillée de git-reset pour lapprentissage des commandes Git

接下去同样新增水果茶菜单,然后再修改coffee.txt文件,第二个commit如下:

Explication détaillée de git-reset pour lapprentissage des commandes Git

然后在HEAD中再修改coffee.txt文件,删除掉标准美式品种:

Explication détaillée de git-reset pour lapprentissage des commandes Git

此时,如果我们再使用git reset --merge HEAD^就无法再进行重置,该操作会被git终止(规则3)。并且控制台会进行报错提示:

Explication détaillée de git-reset pour lapprentissage des commandes Git

--keep

该选参的作用和--merge相似,唯一的区别就是缓存区中被重置的会被保留在工作区中。

构造如下第一个commit:

Explication détaillée de git-reset pour lapprentissage des commandes Git

改造第二个commit:

Explication détaillée de git-reset pour lapprentissage des commandes Git

在HEAD中进行修改

Explication détaillée de git-reset pour lapprentissage des commandes Git

使用git reset --keep命令:

Explication détaillée de git-reset pour lapprentissage des commandes Git

从结果上来看,只有fruits.txt文件被删除了,beans.txt文件被重置回了工作区中。coffee.txt文件的改动也被保留了。

--[no-]recurse-submodules

使用该选项可以控制是否递归的重置submdoule。如果想要更详细了解,查看这篇文章

总结

git-reset命令的作用就是重置缓存区和工作区,同时它也提供多个选项来做更具体的控制,使得该命令更加灵活多变。git-reset命令在我们的工作中经常使用,因此熟练掌握该命令是非常重要的。

更多编程相关知识,请访问:编程入门!!

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:juejin.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