Tutoriel pratique avancé Git

La fonction de Git est d'effectuer une gestion de versions sur des fichiers. Son principe sous-jacent est un système d'accès aux fichiers. Pour maîtriser Git, le plus important est de comprendre l'arbre de validation, qui est l'historique des enregistrements de validation. En développement normal, nous utiliser des branches pour mettre à jour l'arborescence de validation, la base de Git est d'apprendre les opérations de branche. Il est recommandé de lire les branches et commandes illustrées Git .

Dans le développement quotidien, il ne suffit pas de maîtriser uniquement les opérations de branche, il faut aussi opérer l'arbre de commit à travers diverses commandes.Dans cet article, nous choisissons 5 scénarios types pour introduire les compétences avancées de Git.Améliorer l'efficacité de l'utilisation de Git au travail:

  • sélectionner la version
  • Rechercher et déboguer
  • réécrire l'histoire
  • Réinitialiser révélé
  • Fusion avancée

sélectionner la version

En supposant que le référentiel actuel est affiché dans la figure ci-dessous, nous pouvons parfois d'abord trouver le commit parent et le commit ancêtre du commit actuel, ^ et ~ peuvent répondre à nos besoins.

^ etcorrespondent tous deux au commit parent du commit actuel, ^ etPour la validation parent qui correspond à la validation parent, ^ et ~ ont des significations différentes lorsqu'ils sont suivis de chiffres. Pour plus de détails, consultez l'exemple suivant, en supposant qu'il existe une arborescence de validation, comme illustré dans la figure suivante :

image.png

Vous pouvez voir la différence entre ^ et ~ avec la commande suivante :

$ git log HEAD^
A2
$ git log HEAD^^
A1
$ git log HEAD^2
B1
$ git log HEAD~
A2
$ git log HEAD~~
A1
$ git log HEAD~2
A1

Parfois, nous pouvons vouloir choisir un intervalle, tel que A1, A2, A3, les exemples suivants illustrent la différence entre .., ... et ^

$ git log master..test
C0 C1
$ git log ^master test
C0 C1
$ git log master…test
A1 A2 A3 C0 C1

Rechercher et déboguer

R : Imaginez une telle situation, touchez une branche test, elle est supprimée après développement, comment récupérer cette branche ?

En fait, git enregistrera chaque changement de HEAD localement, et ces enregistrements peuvent être obtenus via la commande reflog

$ git reflog
0e94c5b HEAD@{0}: commit: 222
7e07aa7 HEAD@{1}: commit: 111
c5aba97 HEAD@{2}: commit: 000

Par exemple, 111 est le dernier commit de la branche de test, on peut aller au commit 111, puis créer une nouvelle branche et ça ira

$ git checkout 7e07aa7 # 或者git checkout HEAD@{1}
$ git checkout -b test

B : Imaginez une telle situation, un jour vous constatez soudainement qu'une ligne de code est erronée, et vous souhaitez trouver rapidement l'initiateur de ce bug ?

blâme peut rapidement montrer qui a été modifié en dernier sur chaque ligne d'un fichier

$ git blame README.md
f6ffa8f4 (yanhaijing 2016-08-03 19:54:42 +0800 1) 123
f6ffa8f4 (yanhaijing 2016-08-03 19:54:42 +0800 1) 456

La portée peut être spécifiée lorsque le blâme

$ git blame -L10,15  README.md # 查看10-15行的信息

C : Imaginez une situation dans laquelle vous souhaitez effectuer une recherche dans un certain commit historique dans Git ?

grep ne peut rechercher que le répertoire de travail, git grep peut rechercher dans le commit spécifié

$ git grep yanhaijing HEAD~27 fis-conf.js
HEAD~27:fis-conf.js: * @author yanhaijing.com

D : Imaginez une situation dans laquelle vous souhaitez effectuer une recherche dans l'intégralité de l'historique de Git ? git log peut réaliser cette fonction

$ git log -Syanhaijing --oneline
0a191c message aaa

E:设想这样一种情况,某一天你突然发现线上代码挂了,但你找不到原因,你想快速找到是哪一个版本引入的 bug?

git bisect 是一个非常有用的调试工具,它通过自动进行一个二分查找来找到哪一个特定的提交是导致 bug 或者问题的第一个提交

$ git bisect start # 开始
$ git bisect bad # 标记为好的
$ git bisect good # 标记为坏的
$ git bisect reset # 结束

重写历史

假设你提交完后发现忘记了一些东西,打算更改上次提交,在 git 中可以使用追加提交,假设现在仓库状态如下所示

image.png 修改完后可以再次提交

$ git add .
$ git commit --amend

就可以修改上次提交,需要注意的是上一次提交并没有被删除,只是没有分支引用,变成了游离状态,在未来的某个时间会被 git 自动回收

image.png 如果你进行了几次提交后后悔了,想重写之前的好几次提交,那就只能用 rebase 了,假设目前状态如下

image.png 假设你想重写 A1 和 A2

$ git rebase -i HEAD~2

需要注意的是已经 push 到远端的提交,就不要再重写了,不然世界人民会恨你,因为你需要git push -f

image.png

重置揭秘

重置有两种方法,reset 和 checkout,这两个方法非常容易混淆,两个命令都分为全局模式和文件模式

reset 全局模式可以用下图总结

image.png reset 的文件模式可以覆盖索引区,一个副作用就是用来取消暂存

git reset xxx – file

checkout 的全局模式可以用下图总结

image.png

checkout 的文件模式会覆盖索引区和工作区,可以用来丢弃修改,属于不可逆转的操作

git checkout xxx – file

其实下图就总结两个命令的区别

image.png

高级合并

合并分支时,很多人非常害怕遇到冲突,其实冲突并不可怕

A:git 默认的冲突显示包括 our 和 their,如果想得到和 svn 那样包含 base+our+their 的代码,可以检出冲突

$ git checkout --conflict=diff3 hello.rb

B:如果在冲突时想想 svn 一样得到,base+our+their 三个文件的代码

$ git show :1:xxx > xxx.base
$ git show :2:xxx > xxx.our
$ git show :3:xxx > xxx.their

C:合并冲突一团乱麻,想撤销合并

$ git merge --abort

D:合并后后悔了?想撤消合并?分为两种情况

假如还没推送到远端,可以 reset 掉

$ git reset --hard HEAD~

image.png

如果已经推动到远端,可以用 revert

$ git revert -m 1 HEAD

image.png

总结

欢迎大家阅读本文,如果你觉得本文对你有帮助,那就点赞加关注作者吧,如果对本文有任何疑问,欢迎在评论区交流。

原创不易,求分享、求一键三连

Je participe au recrutement du programme de signature de créateurs de la communauté technologique Nuggets, cliquez sur le lien pour vous inscrire et soumettre .

Je suppose que tu aimes

Origine juejin.im/post/7121283639471505416
conseillé
Classement