Acabo de enfrentar una situación que me parece ilógica con Git. Tengo un repositorio con muchas confirmaciones, por lo que en esta etapa solo tiene una rama (maestro).
Supongamos que esta rama tiene un archivo llamadoMiArchivo.txt. Ahora necesito crear una rama diferente porque quiero hacer algunos cambios en algunos archivos y no quiero hacerlo directamente en la rama maestra, así que ejecuto:
git checkout iss53
Ahora el esquema se ve así:
Bien, me he cambiado de sucursal.iss53, corro ls -l
y elMiArchivo.txt. Uno de los cambios incluye la eliminación delMiArchivo.txtarchivo, entonces:
git rm MyFile.txt
Bien, correr ls -l
de nuevo demuestra que no hay nada.MiArchivo.txtya no. Así que vuelvo almaestrorama:
git checkout master
Pero elMiArchivo.txtEl archivo también ha desaparecido. Mi lógica dice que si eliminé el archivo en una rama, debería aplicarsesoloa esa rama, entonces ¿por qué se elimina el archivo de lamaestrosucursal también? Tenga en cuenta que todavía no he realizado ninguna confirmación, solo me he ramificado.
Nota: Ambas imágenes están tomadas degit-scm.
Respuesta1
La respuesta está en tu pregunta:
Tenga en cuenta que todavía no he realizado ninguna confirmación, solo me he ramificado.
Si no se compromete, los cambios siempre se guardan en su directorio de trabajo. Cambiar de rama no afecta su directorio de trabajo, y el directorio de trabajo tampoco afecta su última confirmación. Está viendo que el archivo se elimina, pero la realidad es que se elimina únicamente de su directorio de trabajo. Si desea borrar los cambios y volver a la última confirmación, utilice este comando:
git reset --hard HEAD
Entonces el archivo se restaurará nuevamente.
Quizás no sea lógico para ti, pero este comportamiento puede resultar útil. Imagina que tienes 2 ramas: master
y development
, y siempre debes trabajar en ellas development
antes de mover los cambios a master
. Digamos que olvidaste cambiar a development
antes de comenzar a trabajar y luego, antes de comprometerte, te diste cuenta de que estás en master
. La solución es simple, simplemente cambie y development
luego confirme.
Respuesta2
Cada vez que eliminé un archivo de una de mis ramas (a la que llamé inicio de sesión), no lo eliminé de la rama maestra.
- Cambié a la rama de inicio de sesión
git checkout login
- Se eliminó el archivo test.html.
git rm --cached test.html
- Se agregó todo al área de preparación.
git add .
- Comprometió los cambios con
git commit -m 'removed test.html file'
- Envió el repositorio local al repositorio remoto de Github con
git push