Tutorial práctico avanzado de Git

La función de Git es realizar la gestión de versiones en los archivos. Su principio subyacente es un sistema para acceder a los archivos. Para dominar Git, lo más importante es comprender el árbol de confirmación, que es el historial de los registros de confirmación. En el desarrollo normal, usar ramas para Para actualizar el árbol de confirmaciones, la base de Git es aprender las operaciones de rama. Se recomienda leer Ramas y comandos ilustrados Git .

En el desarrollo diario, no es suficiente solo dominar las operaciones de rama. También es necesario operar el árbol de confirmación a través de varios comandos. En este artículo, elegimos 5 escenarios típicos para presentar las habilidades avanzadas de Git. Mejorar la eficiencia del uso de Git en el trabajo:

  • seleccionar versión
  • Buscar y depurar
  • reescribir la historia
  • Restablecer revelado
  • Fusión avanzada

seleccionar versión

Suponiendo que el repositorio actual se muestra en la figura a continuación, a veces podemos encontrar primero la confirmación principal y la confirmación principal de la confirmación actual, ^ y ~ pueden satisfacer nuestras necesidades.

^ yambos coinciden con la confirmación principal de la confirmación actual, ^ yPara la confirmación principal que coincide con la confirmación principal, ^ y ~ tienen significados diferentes cuando van seguidos de números. Para obtener más información, consulte el siguiente ejemplo, suponiendo que hay un árbol de confirmación como se muestra en la siguiente figura:

imagen.png

Puedes ver la diferencia entre ^ y ~ con el siguiente comando:

$ 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

A veces podemos querer elegir un intervalo, como A1, A2, A3, los siguientes ejemplos ilustran la diferencia entre .., ... y ^

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

Buscar y depurar

R: Imagine tal situación, toque una prueba de rama, se elimina después del desarrollo, ¿cómo recuperar esta rama?

De hecho, git registrará cada cambio de HEAD localmente, y estos registros se pueden obtener a través del comando reflog

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

Por ejemplo, 111 es la última confirmación de la rama de prueba, podemos ir a la confirmación 111 y luego crear una nueva rama y estará bien.

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

B: Imagine tal situación, un día de repente descubre que una línea de código es incorrecta y desea encontrar rápidamente el iniciador de este error.

La culpa puede mostrar rápidamente quién fue modificado por última vez en cada línea de un archivo.

$ 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

El alcance se puede especificar cuando la culpa

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

C: ¿Imagina una situación en la que desea buscar en un compromiso histórico determinado en Git?

grep solo puede buscar en el directorio de trabajo, git grep puede buscar en el compromiso especificado

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

D: ¿Imaginas una situación en la que quieres buscar en toda la historia de Git? git log puede lograr esta función

$ 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 中可以使用追加提交,假设现在仓库状态如下所示

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

$ git add .
$ git commit --amend

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

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

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

$ git rebase -i HEAD~2

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

imagen.png

重置揭秘

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

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

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

git reset xxx – file

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

imagen.png

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

git checkout xxx – file

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

imagen.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~

imagen.png

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

$ git revert -m 1 HEAD

imagen.png

总结

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

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

Estoy participando en el reclutamiento del programa de firma de creadores de la Comunidad Tecnológica de Nuggets, haga clic en el enlace para registrarse y enviar .

Supongo que te gusta

Origin juejin.im/post/7121283639471505416
Recomendado
Clasificación