¿Por qué git elimina los archivos de la rama al fusionar?

Primero reproduzcamos la situación en la que la fusión eliminará el código:

Los ejemplos son los siguientes:

1. Inicialice un almacén, cree un nuevo archivo master.txt y luego envíelo.

$ git init tem
Initialized empty Git repository in D:/temp/tem/.git/

$ cd tem

$ touch master.txt

$ vim master.txt

$ cat master.txt
this is master branch!

$ git commit -a -m "commit master branch"
[master (root-commit) 3e4d6ff] commit master branch
 1 file changed, 1 insertion(+)
 create mode 100644 master.txt

2. Cree una nueva rama de desarrollo, cree un archivo development.txt y envíelo.

$ git checkout -b develop
Switched to a new branch 'develop'

$ touch develop.txt

$ vim develop.txt

$ cat develop.txt
this is develop branch!

$ git add .

$ git commit -a -m "commit develop branch"
[develop f439ba3] commit develop branch
 1 file changed, 1 insertion(+)
 create mode 100644 develop.txt

3. Cree la rama feature1, cree un nuevo archivo feature.txt y envíelo.

$ git checkout -b feature1
Switched to a new branch 'feature1'

$ touch feature1.txt

$ vim feature1.txt

$ git add .

$ git commit -a -m "feature1 commite"
[feature1 98e05e7] feature1 commite
 1 file changed, 1 insertion(+)
 create mode 100644 feature1.txt

4. Fusione la rama de desarrollo.

$ git checkout master
Switched to branch 'master'

$ ll
total 1
-rw-r--r-- 1 mydwh 197121 23 Jul 22 16:18 master.txt

$ git merge develop
Updating 3e4d6ff..f439ba3
Fast-forward
 develop.txt | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 develop.txt

5. Fusionar rama característica1

$ git merge feature1
Updating f439ba3..98e05e7
Fast-forward
 feature1.txt | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 feature1.txt

$ ll
total 3
-rw-r--r-- 1 mydwh 197121 25 Jul 22 17:01 develop.txt
-rw-r--r-- 1 mydwh 197121 25 Jul 22 17:03 feature1.txt
-rw-r--r-- 1 mydwh 197121 23 Jul 22 16:18 master.txt

6. Elimine el archivo feature1.txt y envíelo.

$ rm feature1.txt

$ ll
total 2
-rw-r--r-- 1 mydwh 197121 25 Jul 22 17:01 develop.txt
-rw-r--r-- 1 mydwh 197121 23 Jul 22 16:18 master.txt

$ git commit -a -m "delete feature1.txt,commit master branch"
[master 88cd117] delete feature1.txt,commit master branch
 1 file changed, 1 deletion(-)
 delete mode 100644 feature1.txt

7. Cierre sesión en la rama feature1, elimine master.txt, development.txt y luego envíelo.

$ git checkout feature1
Switched to branch 'feature1'

$ ll
total 3
-rw-r--r-- 1 mydwh 197121 25 Jul 22 17:01 develop.txt
-rw-r--r-- 1 mydwh 197121 25 Jul 22 17:08 feature1.txt
-rw-r--r-- 1 mydwh 197121 23 Jul 22 16:18 master.txt

$ rm master.txt develop.txt

$ ll
total 1
-rw-r--r-- 1 mydwh 197121 25 Jul 22 17:08 feature1.txt

$ git commit -a -m "delete master.txt ,develop.txt,commit feature1 branch"
[feature1 70b4ed7] delete master.txt ,develop.txt,commit feature1 branch
 2 files changed, 2 deletions(-)
 delete mode 100644 develop.txt
 delete mode 100644 master.txt

8. Cierre sesión en la rama maestra y combine la rama característica1.

$ git checkout master
Switched to branch 'master'

$ ll
total 2
-rw-r--r-- 1 mydwh 197121 25 Jul 22 17:11 develop.txt
-rw-r--r-- 1 mydwh 197121 24 Jul 22 17:11 master.txt

$ git merge feature1
Merge made by the 'ort' strategy.
 develop.txt | 1 -
 master.txt  | 1 -
 2 files changed, 2 deletions(-)
 delete mode 100644 develop.txt
 delete mode 100644 master.txt

$ ll
total 0

Pregunta: Durante la última fusión, descubrí que git no solo no pudo fusionarse, sino que eliminó los archivos, ¿por qué?

En primer lugar, déjame aclarar: ¿la combinación de git es una combinación de colección matemática?

No. La fusión en matemáticas es que el conjunto A tiene {a, b} y el conjunto B tiene {c}, entonces el conjunto fusionado es {a, b, c}.

En cuanto a la fusión de git, creo que es la fusión de los deseos de los desarrolladores de sucursales, no la fusión de archivos de código fuente. Comprenda esto y será más fácil comprender por qué git elimina archivos al fusionarlos.

En mi experimento, si se compara la rama maestra con el fundador de la empresa, él primero creó el archivo master.txt, lo colocó en el almacén de la empresa y lo usó él mismo. Luego, el maestro quiso hacer un retiro y practicar, por lo que buscó un gerente de proyecto, creó el archivo development.txt basándose en el archivo original de la empresa y lo guardó en el almacén de la empresa para uso propio del PCC. Después de un tiempo, desarrollo también quiso practicar en retiro, por lo que encontró otro gerente de proyecto, feature1, quien creó el archivo feature1.txt para su propio uso.

Como el maestro está en retirada, no sabe que hay archivos development.txt y feature1.txt en el almacén de la empresa. Cuando master y development se fusionan, ambos intercambian su voluntad de utilizar los archivos del almacén. El resultado de la fusión es que el maestro percibe que hay un archivo development.txt en el almacén y puede usarlo. Tenga en cuenta que la combinación no significa que el maestro copie el archivo development.txt, sino que hay un archivo development.txt en el almacén que puedo usar.

De la misma manera, cuando master se fusiona con feature1, master percibe que el almacén tiene un archivo feature1.txt que puede usar.

Es como si el fundador de la empresa saliera e intercambiara opiniones con los dos directores de proyecto. Los fundadores de la empresa descubrieron que los activos de la empresa habían aumentado. Se convirtieron en tres archivos.

A continuación, tanto master como feature1 gobiernan la empresa. El maestro eliminó los archivos master.txt, development.txt. feature1 eliminó el archivo feature1.txt.

Tenga en cuenta que aquí debe comprender la eliminación de git. Siempre que envíe el archivo al almacén, siempre estará en el almacén. Siempre que lo desee, siempre podrá encontrarlo. Por lo tanto, la eliminación de un archivo puede entenderse como la desactivación del archivo por parte de la sucursal, en lugar de la eliminación real del almacén.

La situación en este momento es que el maestro solo usa el archivo feature1.txt en el almacén y descarta master.txt y development.txt. Feature1 solo usa los archivos master.txt y development.txt, y el archivo feature1.txt se descarta. Cuando el maestro quiere fusionar la rama feature1, muchas personas piensan que es una fusión de archivos. Entonces no hay archivos master.txt y development.txt en la rama master. Luego fusiona master.txt y development.txt en la rama feature1. rama De esta manera master Hay tres archivos en la rama. De hecho, este no es el caso: la fusión es esencialmente la intención del maestro de adoptar la característica1. Porque cuando el maestro eliminó los archivos master.txt y development.txt, feature1 no expresó ninguna objeción, entonces git consideró que no había conflicto, el deseo del maestro era abandonar los archivos master.txt y development.txt. Git respetó el maestro al fusionar voluntad. Además, feature1 ha desaprobado el archivo feature1.txt y master no tiene objeciones. Luego, git cree que no hay conflicto, adopta los deseos de feature1 y elimina el archivo feature1.txt en la rama master durante la fusión. El resultado final de la fusión es: se combina la última voluntad de utilizar archivos de las dos ramas, es decir, después de la fusión, no hay archivos en la rama maestra.

Mucha gente hace que git elimine el código fuente al fusionar ramas, este es el principio. Una vez que lo comprenda, hay muchas formas de evitar la posibilidad de que se elimine el código fuente.

Supongo que te gusta

Origin blog.csdn.net/wwwjr00/article/details/131869388
Recomendado
Clasificación