6. Procesamiento de versión Git

Prólogo

Este artículo solo registra algunas de sus propias opiniones, que pueden no ser precisas, solo para algunos registros durante el aprendizaje, no me gusta no rociar, gracias

Este artículo registra principalmente varias formas de reversión de versiones

  1. git reset
  2. git checkout

1. Inicializar el almacén.

Primero, inicializamos un almacén y luego creamos múltiples versiones para facilitar las demostraciones posteriores.

A continuación, demostremos el comando. Primero, limpiaremos el almacén original y comenzaremos desde el principio, haciéndolo más claro. Como se muestra a continuación:

[root@huangzb mygit]#
[root@huangzb mygit]# git init
Initialized empty Git repository in /root/mygit/.git/
[root@huangzb mygit]# git config --local user.name huangzb
[root@huangzb mygit]# git config --local user.email [email protected]
[root@huangzb mygit]#
[root@huangzb mygit]# echo 'hello 1' > a.txt
[root@huangzb mygit]# git add .
[root@huangzb mygit]# git commit -m '第一次提交'
[master (root-commit) 99e413a] 第一次提交
1 file changed, 1 insertion(+)
create mode 100644 a.txt
[root@huangzb mygit]#
[root@huangzb mygit]# echo 'hello 2' >> a.txt
[root@huangzb mygit]# git commit -am '第二次提交'
[master d60e201] 第二次提交
1 file changed, 1 insertion(+)
[root@huangzb mygit]# echo 'hello 3' >> a.txt
[root@huangzb mygit]# git commit -am '第三次提交'
[master 54d34d9] 第三次提交
1 file changed, 1 insertion(+)
[root@huangzb mygit]# echo 'hello 4' >> a.txt
[root@huangzb mygit]# git commit -am '第四次提交'
[master 027bfbd] 第四次提交
1 file changed, 1 insertion(+)
[root@huangzb mygit]#
[root@huangzb mygit]# echo 'hello 5' >> a.txt
[root@huangzb mygit]# git commit -am '第五次提交'
[master 493c360] 第五次提交
1 file changed, 1 insertion(+)
[root@huangzb mygit]# git log
commit 493c360fb9b9e2b0e03fdaac92421155035497a5
Author: huangzb <[email protected]>
Date:   Thu Mar 26 11:36:45 2020 +0800
 
    第五次提交
 
commit 027bfbd142a073f6c8e0ac2d9978964b98dfc0ed
Author: huangzb <[email protected]>
Date:   Thu Mar 26 11:36:20 2020 +0800
 
    第四次提交
 
commit 54d34d9ef36956b47b4b8e9a73f4261307e9c853
Author: huangzb <[email protected]>
Date:   Thu Mar 26 11:36:01 2020 +0800
 
    第三次提交
 
commit d60e201851187a0f63b76acfc30e84dd07cb3d56
Author: huangzb <[email protected]>
Date:   Thu Mar 26 11:35:47 2020 +0800
 
    第二次提交
 
commit 99e413a174d2e1647cdd034ab064ebacc38771a4
Author: huangzb <[email protected]>
Date:   Thu Mar 26 11:35:33 2020 +0800
 
    第一次提交
[root@huangzb mygit]#
 

En la figura anterior, creamos un archivo a.txt y lo enviamos cinco veces, cada vez para agregar un registro, luego el gráfico de nodo de confirmación del maestro de rama actual debe ser el siguiente:

2. git reset

Puede volver al registro de la versión especificada a través de git reset

Aquí hay una introducción útil del blog de otra persona ( https://segmentfault.com/a/1190000006185954 ), que es muy útil

El reinicio de Git con diferentes parámetros tendrá diferentes efectos en estas tres áreas.

En realidad, hay tres paso de reposición se puede determinar en función de diversos parámetros que para realizar la etapa ( --soft, --mixed, --hard).

  1. Cambiar el commit ( --soft) señalado por HEAD
  2. Realice el paso 1 para actualizar el área de índice al contenido contenido en la confirmación señalada por HEAD ( --mixed)
  3. Realice los pasos 1 y 2 para actualizar el área del Directorio de trabajo al contenido contenido en el commit señalado por HEAD ( --hard)

Por lo tanto, generalmente usamos --hard cuando usamos el comando git reset para revertir la versión

Además, debe tenerse en cuenta que cuando se retrocede de esta manera, el puntero HEAD y el maestro puntero de rama se mueven sincrónicamente, es decir, HEAD siempre ejecuta el maestro de rama (rama actual)

Ahora, miramos el diagrama de la versión en la imagen de arriba. En este momento, volvemos a la versión anterior. También hay varias formas a través de git reset, de la siguiente manera:

  1. git reset --HAD HEAD ^ --------------------------- Use ^ para indicar una versión anterior, puede usar múltiples ^^
  2. git reset --HAD HEAD ~ 1 ---------------------------- Use ~, tenga en cuenta que esto es una tilde, no un signo menos, El siguiente número significa avanzar algunas versiones, este método se utiliza para evitar usar demasiado ^
  3. git reset --hard commit_id ---------------------- Cuando hay demasiadas versiones de commit, no es conveniente usar ^ y ~ para contar, En este momento, puede volver directamente a la versión especificada enviando el commit_id del registro

Demostremos por separado

2.1 reinicio de git --HAD HEAD ^

Use ^ para indicar una versión anterior, puede usar múltiples ^^

Ahora, supongamos que queremos volver a la cuarta versión, cómo operarla, como se muestra a continuación:

[root@huangzb mygit]# git reset --hard HEAD^
HEAD is now at 027bfbd 第四次提交
[root@huangzb mygit]# git log
commit 027bfbd142a073f6c8e0ac2d9978964b98dfc0ed
Author: huangzb <[email protected]>
Date:   Thu Mar 26 11:36:20 2020 +0800
 
    第四次提交
 
commit 54d34d9ef36956b47b4b8e9a73f4261307e9c853
Author: huangzb <[email protected]>
Date:   Thu Mar 26 11:36:01 2020 +0800
 
    第三次提交
 
commit d60e201851187a0f63b76acfc30e84dd07cb3d56
Author: huangzb <[email protected]>
Date:   Thu Mar 26 11:35:47 2020 +0800
 
    第二次提交
 
commit 99e413a174d2e1647cdd034ab064ebacc38771a4
Author: huangzb <[email protected]>
Date:   Thu Mar 26 11:35:33 2020 +0800
 
    第一次提交
[root@huangzb mygit]# cat a.txt
hello 1
hello 2
hello 3
hello 4
[root@huangzb mygit]#
 

Como se puede ver en la figura anterior, utilizamos el comando git reset --hard HEAD ^ para volver a la versión anterior. Después de usar git log, encontraremos que el último registro de confirmación se pierde y el contenido del archivo a.txt vuelve al momento de la cuarta confirmación .

Al mismo tiempo, ^ puede superponerse, hay varios ^ que avanzan varias versiones , como se muestra a continuación:

[root@huangzb mygit]# git reset --hard HEAD^^^
HEAD is now at 99e413a 第一次提交
[root@huangzb mygit]# git log
commit 99e413a174d2e1647cdd034ab064ebacc38771a4
Author: huangzb <[email protected]>
Date:   Thu Mar 26 11:35:33 2020 +0800
 
    第一次提交
[root@huangzb mygit]# cat a.txt
hello 1
[root@huangzb mygit]#
 

Como puede ver en la imagen de arriba, hemos usado el identificador ^^^ continuamente. Sobre la base de la cuarta versión, avanzamos tres versiones, y solo pensamos en la primera versión ahora.

Tenga en cuenta que podemos ver claramente que cuando volvemos a la primera versión, solo hay un registro de confirmación. En este momento, las cuatro confirmaciones anteriores ya no son visibles en el comando git log, y el identificador ^ es solo Si avanza sin retroceder, ¿cómo resolver este problema? No se preocupe, mire hacia atrás, hablaremos de ello más tarde.

Aquí puede reflejarse en secreto, porque se requiere la demostración posterior del comando git reset --hard HEAD ~ n

Luego, use el comando git reflog para encontrar la identificación del nodo del último registro de confirmación, y luego use el comando git reset --hard commit_id para volver al nodo especificado, como se muestra en la siguiente figura:

[root@huangzb mygit]# git reflog
99e413a HEAD@{0}: reset: moving to HEAD^^^
027bfbd HEAD@{1}: reset: moving to HEAD^
493c360 HEAD@{2}: commit: 第五次提交
027bfbd HEAD@{3}: commit: 第四次提交
54d34d9 HEAD@{4}: commit: 第三次提交
d60e201 HEAD@{5}: commit: 第二次提交
99e413a HEAD@{6}: commit (initial): 第一次提交
[root@huangzb mygit]#
[root@huangzb mygit]# git reset --hard 493c360
HEAD is now at 493c360 第五次提交
[root@huangzb mygit]# git log
commit 493c360fb9b9e2b0e03fdaac92421155035497a5
Author: huangzb <[email protected]>
Date:   Thu Mar 26 11:36:45 2020 +0800
 
    第五次提交
 
commit 027bfbd142a073f6c8e0ac2d9978964b98dfc0ed
Author: huangzb <[email protected]>
Date:   Thu Mar 26 11:36:20 2020 +0800
 
    第四次提交
 
commit 54d34d9ef36956b47b4b8e9a73f4261307e9c853
Author: huangzb <[email protected]>
Date:   Thu Mar 26 11:36:01 2020 +0800
 
    第三次提交
 
commit d60e201851187a0f63b76acfc30e84dd07cb3d56
Author: huangzb <[email protected]>
Date:   Thu Mar 26 11:35:47 2020 +0800
 
    第二次提交
 
commit 99e413a174d2e1647cdd034ab064ebacc38771a4
Author: huangzb <[email protected]>
Date:   Thu Mar 26 11:35:33 2020 +0800
 
    第一次提交
[root@huangzb mygit]#
 

Como puede ver en la imagen de arriba, hemos regresado al último nodo enviado. El comando git reflog registra nuestros registros de operación para todas las ramas, por lo que podemos usar este comando para completar el transbordador espacio-tiempo.

Sin embargo, el método anterior de usar ^ tiene una desventaja, es decir, es más conveniente cuando hay menos versiones móviles. Si desea volver al top 20, top 100, etc., ¿necesita escribir 20 ^, o tenga cuidado? Es muy problemático contar, por lo que si sabemos cuántas versiones deben revertirse, podemos usar el comando git reset --hard HEAD ~ n para usarlo. Probemos

2.2 restablecimiento de git --hard HEAD ~ n

Usamos el identificador ~ para avanzar una cantidad específica

Ahora estamos en el último nodo de confirmación. Del mismo modo, si queremos volver a la primera versión, necesitamos avanzar 4 versiones, para que podamos usar git reset --hard HEAD ~ 4 para operar, como se muestra a continuación:

[root@huangzb mygit]# git reset --hard HEAD~4
HEAD is now at 99e413a 第一次提交
[root@huangzb mygit]# git log
commit 99e413a174d2e1647cdd034ab064ebacc38771a4
Author: huangzb <[email protected]>
Date:   Thu Mar 26 11:35:33 2020 +0800
 
    第一次提交
[root@huangzb mygit]# cat a.txt
hello 1
[root@huangzb mygit]#
 

Se puede ver en la figura anterior que en el caso de saber cuántas versiones se deben mover, el método de expresión que usa ~ n es obviamente más claro que ^, pero la misma desventaja es que si hay más versiones enviadas, debe volver a una de las versiones. Uno por uno, es más problemático. En este momento, debería poder usar el tercer método, especificar un cierto commit_id y bloquear directamente la versión más rápidamente. A continuación, echemos un vistazo

2.3 git reset --hard commit_id

Especifique commit_id directamente para revertir la versión especificada

Como lo anterior ya ha usado el uso de git reflog, no repetiré la demostración aquí. Primero restableceré la versión a la última versión, luego lo siguiente demostrará cómo usar commit_id para volver a la primera versión

[root@huangzb mygit]#
[root@huangzb mygit]# git reset --hard 493c360
HEAD is now at 493c360 第五次提交
[root@huangzb mygit]# git log
commit 493c360fb9b9e2b0e03fdaac92421155035497a5
Author: huangzb <[email protected]>
Date:   Thu Mar 26 11:36:45 2020 +0800
 
    第五次提交
 
commit 027bfbd142a073f6c8e0ac2d9978964b98dfc0ed
Author: huangzb <[email protected]>
Date:   Thu Mar 26 11:36:20 2020 +0800
 
    第四次提交
 
commit 54d34d9ef36956b47b4b8e9a73f4261307e9c853
Author: huangzb <[email protected]>
Date:   Thu Mar 26 11:36:01 2020 +0800
 
    第三次提交
 
commit d60e201851187a0f63b76acfc30e84dd07cb3d56
Author: huangzb <[email protected]>
Date:   Thu Mar 26 11:35:47 2020 +0800
 
    第二次提交
 
commit 99e413a174d2e1647cdd034ab064ebacc38771a4
Author: huangzb <[email protected]>
Date:   Thu Mar 26 11:35:33 2020 +0800
 
    第一次提交
[root@huangzb mygit]#
[root@huangzb mygit]# git reset --hard 99e413a1
HEAD is now at 99e413a 第一次提交
[root@huangzb mygit]# git log
commit 99e413a174d2e1647cdd034ab064ebacc38771a4
Author: huangzb <[email protected]>
Date:   Thu Mar 26 11:35:33 2020 +0800
 
    第一次提交
[root@huangzb mygit]#
 

Como se puede ver en la figura anterior, el uso del método commit_id vuelve directamente a la primera versión.

2.4 renderizado de reinicio de git

Asumiendo que ve el efecto cuando usa git reset

Cuando cambiamos a la primera confirmación, como se muestra arriba, la primera confirmación señalada por la última rama, el historial posterior no se conserva, suponiendo que estamos desarrollando nuevamente en la primera versión, entonces el registro anterior no tiene nada que ver con nosotros .

3. pago y envío

También puede usar git checkout commit_id para seleccionar la rama especificada, pero es diferente de git reset

Supongamos que hemos regresado a la última versión, entonces, ¿qué sucede si queremos modificar el archivo en la tercera versión?

En este punto, podemos usar git checkout commit_id para volver a la tercera versión. En este momento, el puntero HEAD ya no apunta al maestro, sino que apunta al nodo donde se encuentra el commit_id, pero el puntero maestro todavía apunta al último commit. Como se muestra a continuación:

Cómo operarlo, como se muestra a continuación:

[root@huangzb mygit]# git log
commit 493c360fb9b9e2b0e03fdaac92421155035497a5
Author: huangzb <[email protected]>
Date:   Thu Mar 26 11:36:45 2020 +0800
 
    第五次提交
 
commit 027bfbd142a073f6c8e0ac2d9978964b98dfc0ed
Author: huangzb <[email protected]>
Date:   Thu Mar 26 11:36:20 2020 +0800
 
    第四次提交
 
commit 54d34d9ef36956b47b4b8e9a73f4261307e9c853
Author: huangzb <[email protected]>
Date:   Thu Mar 26 11:36:01 2020 +0800
 
    第三次提交
 
commit d60e201851187a0f63b76acfc30e84dd07cb3d56
Author: huangzb <[email protected]>
Date:   Thu Mar 26 11:35:47 2020 +0800
 
    第二次提交
 
commit 99e413a174d2e1647cdd034ab064ebacc38771a4
Author: huangzb <[email protected]>
Date:   Thu Mar 26 11:35:33 2020 +0800
 
    第一次提交
[root@huangzb mygit]# git checkout 54d34d9ef3
Note: checking out '54d34d9ef3'.
 
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
 
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
 
  git checkout -b new_branch_name
 
HEAD is now at 54d34d9... 第三次提交
[root@huangzb mygit]#
[root@huangzb mygit]#
[root@huangzb mygit]# git log
commit 54d34d9ef36956b47b4b8e9a73f4261307e9c853
Author: huangzb <[email protected]>
Date:   Thu Mar 26 11:36:01 2020 +0800
 
    第三次提交
 
commit d60e201851187a0f63b76acfc30e84dd07cb3d56
Author: huangzb <[email protected]>
Date:   Thu Mar 26 11:35:47 2020 +0800
 
    第二次提交
 
commit 99e413a174d2e1647cdd034ab064ebacc38771a4
Author: huangzb <[email protected]>
Date:   Thu Mar 26 11:35:33 2020 +0800
 
    第一次提交
[root@huangzb mygit]# cat a.txt
hello 1
hello 2
hello 3
[root@huangzb mygit]#
 

Como se puede ver en la figura anterior, después de usar el comando git checkout commit_id, aunque el cambio es exitoso, hay un mensaje, como sigue:

Note: checking out '54d34d9ef3'.
 
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
 
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
 
  git checkout -b new_branch_name
 
HEAD is now at 54d34d9... 第三次提交
 

Traducido es:

注意:请查看“54d34d9ef3”。
 
 
 
你处于“独立的分支”状态。你可以四处看看,做实验
 
更改并提交它们,您可以放弃在此中所做的任何提交
 
通过执行另一个签出而不影响任何分支的状态。
 
 
 
如果要创建新分支以保留创建的提交,可以
 
再次将-b与checkout命令一起使用(现在或以后)。例子:
 
 
 
git签出-b新分支名称
 
 
 
头部现在在54d34d9。。。第三次提交

De la traducción anterior, se pueden extraer dos puntos de la siguiente manera:

  1. En la actualidad, después de usar git checkout, el nodo señalado por el puntero HEAD es un nodo libre, y la rama maestra aún ejecuta el último nodo.
  2. Puede realizar operaciones de archivo en el nodo actual, pero si desea conservar estas operaciones, debe crear una nueva rama para guardar

En este punto, nos fijamos en la rama:

[root@huangzb mygit]# git branch
* (detached from 54d34d9)
  master
[root@huangzb mygit]#
 

De la figura anterior, podemos ver que hay una rama desconocida, y actualmente está apuntando a ella, por lo que se puede probar más que los punteros HEAD y master ya no apuntan al mismo nodo. Esto se llama la rama libre

A continuación realizamos operaciones de datos en la rama libre actual para ver qué está mal, como se muestra a continuación:

Las siguientes operaciones se analizan en los siguientes escenarios:

  1. En la rama libre, después de agregar el archivo, no se agrega a git, y luego cambia a la rama maestra para ver el efecto

3.1 agregar archivo, no rastreado por git, cambiar a maestro

Ahora, creamos un nuevo archivo, no hacemos nada y luego cambiamos a la rama maestra para ver el estado

[root@huangzb mygit]# echo 'hello 游离分支' > b.txt
[root@huangzb mygit]# git status
# HEAD detached at 54d34d9
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       b.txt
nothing added to commit but untracked files present (use "git add" to track)
[root@huangzb mygit]#
[root@huangzb mygit]# git checkout master
Previous HEAD position was 54d34d9... 第三次提交
Switched to branch 'master'
[root@huangzb mygit]# git branch
* master
[root@huangzb mygit]# git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       b.txt
nothing added to commit but untracked files present (use "git add" to track)
[root@huangzb mygit]#
 

Se puede ver en la figura anterior que cuando estamos en la rama libre, agregamos un nuevo archivo, y luego no usamos git add para permitir que git rastree el archivo, y luego cambiamos a maestro, puede ver que después de usar el comando de estado git, aún puede ver el archivo Esta situación también aparecerá en la operación de cambio de rama anterior, porque no importa qué rama se agregue, se agrega el archivo no rastreado, es una modificación del espacio de trabajo, no importa qué rama, puede sentirlo.

3.2 Agregue archivos y realice un seguimiento, luego cambie a maestro

Ahora, volvamos a la tercera versión nuevamente, luego use git add para dejar que git rastree, y luego cambie a master para ver el efecto

La operación es la siguiente:

[root@huangzb mygit]# git checkout 54d34d9ef3
Note: checking out '54d34d9ef3'.
 
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
 
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
 
  git checkout -b new_branch_name
 
HEAD is now at 54d34d9... 第三次提交
[root@huangzb mygit]#
[root@huangzb mygit]# ll
total 8
-rw-r--r-- 1 root root 24 Mar 27 15:35 a.txt
-rw-r--r-- 1 root root 19 Mar 27 15:28 b.txt
[root@huangzb mygit]# git status
# HEAD detached at 54d34d9
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       b.txt
nothing added to commit but untracked files present (use "git add" to track)
[root@huangzb mygit]#
[root@huangzb mygit]# git add .
[root@huangzb mygit]#
[root@huangzb mygit]# git checkout master
A       b.txt
Previous HEAD position was 54d34d9... 第三次提交
Switched to branch 'master'
[root@huangzb mygit]# git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   b.txt
#
[root@huangzb mygit]#
 

De la figura anterior se puede ver que incluso en la rama libre, git add se usa para ser rastreado por git. Después de cambiar la rama, las ramas restantes aún se pueden percibir, y el efecto es el mismo que 3.1.

3.3 Agregue archivos y confirme, luego cambie a maestro

Ahora, volvemos a la tercera versión, enviamos el archivo recién creado, y luego vemos si puedes cambiar, la operación es la siguiente:

[root@huangzb mygit]# git checkout 54d34d9ef3
A       b.txt
Note: checking out '54d34d9ef3'.
 
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
 
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
 
  git checkout -b new_branch_name
 
HEAD is now at 54d34d9... 第三次提交
[root@huangzb mygit]# git status
# HEAD detached at 54d34d9
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   b.txt
#
[root@huangzb mygit]# git commit -m 'create b.txt'
[detached HEAD 43d986d] create b.txt
1 file changed, 1 insertion(+)
create mode 100644 b.txt
[root@huangzb mygit]#
[root@huangzb mygit]# git checkout master
Warning: you are leaving 1 commit behind, not connected to
any of your branches:
 
  43d986d create b.txt
 
If you want to keep them by creating a new branch, this may be a good time
to do so with:
 
git branch new_branch_name 43d986d
 
Switched to branch 'master'
[root@huangzb mygit]#
[root@huangzb mygit]# git status
# On branch master
nothing to commit, working directory clean
[root@huangzb mygit]#
 

Del resultado de la figura anterior se puede ver que cuando confirmamos el archivo recién creado en la rama libre, también habrá un nuevo nodo de confirmación en la rama libre, y después de cambiar al maestro, aparecerá una advertencia, pero También puede cambiar, pero en este momento, el archivo b.txt no existe en la rama maestra, entonces las operaciones que realizamos antes de que la rama libre aún exista después de cambiar a la rama libre, intentamos:

[root@huangzb mygit]# git checkout 54d34d9ef3
Note: checking out '54d34d9ef3'.
 
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
 
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
 
  git checkout -b new_branch_name
 
HEAD is now at 54d34d9... 第三次提交
[root@huangzb mygit]# git log
commit 54d34d9ef36956b47b4b8e9a73f4261307e9c853
Author: huangzb <[email protected]>
Date:   Thu Mar 26 11:36:01 2020 +0800
 
    第三次提交
 
commit d60e201851187a0f63b76acfc30e84dd07cb3d56
Author: huangzb <[email protected]>
Date:   Thu Mar 26 11:35:47 2020 +0800
 
    第二次提交
 
commit 99e413a174d2e1647cdd034ab064ebacc38771a4
Author: huangzb <[email protected]>
Date:   Thu Mar 26 11:35:33 2020 +0800
 
    第一次提交
[root@huangzb mygit]# ll
total 4
-rw-r--r-- 1 root root 24 Mar 27 15:42 a.txt
[root@huangzb mygit]#
 

Como puede ver, cuando agregamos el archivo a la rama libre, después de confirmar, cambiamos a la rama libre nuevamente y descubrimos que todas las operaciones anteriores se habían perdido.

Y, antes, después de la confirmación de la rama libre, al cambiar a la rama maestra, hay una advertencia, ahora consideramos cambiar la advertencia

Warning: you are leaving 1 commit behind, not connected to
any of your branches:
 
  43d986d create b.txt
 
If you want to keep them by creating a new branch, this may be a good time
to do so with:
 
git branch new_branch_name 43d986d
 
Switched to branch 'master'

La traducción es la siguiente:

警告:您将留下1个提交,未连接到
 
您的任何分支机构:
 
 
 
43d986d创建b.txt
 
 
 
如果你想通过创建一个新的分支来保留它们,这可能是一个好时机
 
要这样做:
 
 
 
git branch new_branch_name 43d986d
 
 
 
切换到分支“master”

De esta advertencia, aprendimos que git sugirió que necesitamos crear una nueva rama para retener la modificación antes de cambiar, de lo contrario, los datos se perderán, por lo que podemos crear una rama para mantenerlos de acuerdo con la solicitud.

La operación es la siguiente:

[root@huangzb mygit]# ll
total 4
-rw-r--r-- 1 root root 24 Mar 27 15:42 a.txt
[root@huangzb mygit]#
[root@huangzb mygit]# echo 'hello youli' > b.txt
[root@huangzb mygit]#
[root@huangzb mygit]# git add .
[root@huangzb mygit]# git commit -m 'create b.txt'
[detached HEAD 0dae8a5] create b.txt
1 file changed, 1 insertion(+)
create mode 100644 b.txt
[root@huangzb mygit]#
[root@huangzb mygit]# git branch new_branch 0dae8a54
[root@huangzb mygit]# git branch
* (detached from 54d34d9)
  master
  new_branch
[root@huangzb mygit]# git checkout master
Previous HEAD position was 0dae8a5... create b.txt
Switched to branch 'master'
[root@huangzb mygit]# ll
total 4
-rw-r--r-- 1 root root 40 Mar 27 15:57 a.txt
[root@huangzb mygit]# git checkout new_branch
Switched to branch 'new_branch'
[root@huangzb mygit]# ll
total 8
-rw-r--r-- 1 root root 24 Mar 27 15:57 a.txt
-rw-r--r-- 1 root root 12 Mar 27 15:57 b.txt
[root@huangzb mygit]#
 

Ver en la figura, somos la rama libre, añadiendo el archivo, a continuación, cambiar a la maestra anterior, utilizando git branch 新分支名 最后一次提交节点id una forma de preservar el funcionamiento de la rama libre, y luego cambiar a la maestra encontrado archivo no se acaba de agregar, y luego cambiar a una nueva rama Después de eso, puede ver el archivo recién agregado. Que bueno

Los puntos anteriores son para los archivos recién agregados. Echemos un vistazo a los archivos originales del maestro y modifiquemos los archivos existentes en la rama libre. ¿Cómo es la situación en este momento?

3.4 Modifique el archivo, no lo envíe, luego cambie a maestro

Tenga en cuenta que el archivo modificado aquí ya debería existir en el maestro

Demostremos una ola, como se muestra a continuación:

[root@huangzb mygit]# git checkout 54d34d9ef
[root@huangzb mygit]#
[root@huangzb mygit]# ll
total 4
-rw-r--r-- 1 root root 24 Mar 27 16:03 a.txt
[root@huangzb mygit]#
[root@huangzb mygit]# cat a.txt
hello 1
hello 2
hello 3
[root@huangzb mygit]# echo 'hello youli' >> a.txt
[root@huangzb mygit]#
[root@huangzb mygit]# git checkout master
error: Your local changes to the following files would be overwritten by checkout:
        a.txt
Please, commit your changes or stash them before you can switch branches.
Aborting
[root@huangzb mygit]#
 

Como se puede ver en la figura anterior, cuando modificamos el archivo en la rama libre y no hay confirmación, aparecerá un error cuando cambiemos al maestro. El mensaje es el siguiente:

error: Your local changes to the following files would be overwritten by checkout:
        a.txt
Please, commit your changes or stash them before you can switch branches.
Aborting

La traducción es la siguiente:

错误:checkout 操作将覆盖对以下文件的本地更改:
 
a.txt
 
请在切换分支之前提交或保存更改。
 
中止

Se puede ver que en este caso, git no nos permite modificar el archivo y cambiar directamente a la rama a menos que primero confirmemos o guardemos los cambios. Luego, intentemos enviar y guardar los cambios por separado.

3.5 Modifique el archivo y envíelo, luego cambie a maestro

Debido a que en 3.4, el cambio al maestro no fue exitoso, entonces nuevamente, basado en la operación directa, la operación es la siguiente:

[root@huangzb mygit]# git status
# HEAD detached at 54d34d9
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   a.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
[root@huangzb mygit]# git add .
[root@huangzb mygit]#
[root@huangzb mygit]# git checkout master
error: Your local changes to the following files would be overwritten by checkout:
        a.txt
Please, commit your changes or stash them before you can switch branches.
Aborting
[root@huangzb mygit]#
 

Lo anterior es para demostrar el caso de solo git add sin comprometerse, y ver si es como se le solicitó. El resultado confirma que si solo git add, no puede cambiar ramas , pero ahora envíelo, la operación es la siguiente:

[root@huangzb mygit]# git commit -m 'update a.txt'
[detached HEAD 57dba1e] update a.txt
1 file changed, 1 insertion(+)
[root@huangzb mygit]# git checkout master
Warning: you are leaving 1 commit behind, not connected to
any of your branches:
 
  57dba1e update a.txt
 
If you want to keep them by creating a new branch, this may be a good time
to do so with:
 
git branch new_branch_name 57dba1e
 
Switched to branch 'master'
[root@huangzb mygit]# cat a.txt
hello 1
hello 2
hello 3
hello 4
hello 5
[root@huangzb mygit]#
 

Se puede ver en la figura anterior que, aunque cambiamos con éxito al maestro después de la confirmación, se produce el mismo problema que en 3.3, es decir, la operación de la rama libre, incluso si se realiza la confirmación, después de cambiar la rama, la operación de rama libre anterior no es Si existe, perderá la operación en la rama libre.

Por lo tanto, debe crear una nueva rama antes de cambiar de acuerdo con la solicitud, y luego cambiar. La operación es la misma que 3.3, y no se repetirá. Veamos el segundo git simple para nosotros

3.6 Modifique el archivo y guárdelo, luego cambie a maestro

Guardar aquí significa guardar primero los cambios de la rama actual, y luego volver a la rama la próxima vez, puede usar pop para restaurar los datos

La operación de guardar aquí necesita usar el comando git stash. El resto del comando se volverá a introducir. Aquí solo se introduce el procesamiento de la versión, porque ahora se ha cambiado a la rama maestra, por lo que lo siguiente primero cambiará a la rama libre, y luego modificará la serie de operaciones del archivo, Finalmente, observe el efecto después de usar el comando git stash, la operación es la siguiente:

[root@huangzb mygit]# git checkout 54d34d9ef
[root@huangzb mygit]# echo 'hello youli' >> a.txt
[root@huangzb mygit]# git status
# HEAD detached at 54d34d9
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   a.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
[root@huangzb mygit]# git stash
Saved working directory and index state WIP on (no branch): 54d34d9 第三次提交
HEAD is now at 54d34d9 第三次提交
[root@huangzb mygit]# git status
# HEAD detached at 54d34d9
nothing to commit, working directory clean
[root@huangzb mygit]# git checkout master
Previous HEAD position was 54d34d9... 第三次提交
Switched to branch 'master'
[root@huangzb mygit]# cat a.txt
hello 1
hello 2
hello 3
hello 4
hello 5
[root@huangzb mygit]#
 

Como se puede ver en la figura anterior, después de usar el comando git stash, podemos usar el estado de git nuevamente para ver que el espacio de trabajo está limpio. En este punto, podemos cambiar a la rama maestra y los datos modificados se han guardado temporalmente en el resto del lugar. Cuando volvamos a la rama libre nuevamente, podemos usar el comando para restaurarla de la siguiente manera:

[root@huangzb mygit]# git checkout 54d34d9ef
[root@huangzb mygit]# git stash pop
# HEAD detached at 54d34d9
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   a.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (1ff59e1834eb8ab5a04b374a5e624ae45ffb4cb2)
[root@huangzb mygit]# cat a.txt
hello 1
hello 2
hello 3
hello youli
[root@huangzb mygit]#
 

Use el comando git stash pop para restaurar los cambios guardados más recientemente

Supongo que te gusta

Origin www.cnblogs.com/duguxiaobiao/p/12691395.html
Recomendado
Clasificación