2011-10-26 23 views
11

Considere lo siguiente "historia":¿Cómo se actualiza el directorio de trabajo en "git checkout"?

$ mkdir my_project 
$ cd my_project 
$ git init 
Initialized empty Git repository in /home/misha/misha/my_project/.git/ 

$ echo "first line" > hello.txt 
$ git add hello.txt 
$ git commit -m "first commit" 
[master (root-commit) 9c913a1] first commit 
1 files changed, 1 insertions(+), 0 deletions(-) 
create mode 100644 hello.txt 

$ git branch new_feature 
$ git checkout new_feature 
Switched to branch 'new_feature' 
$ echo "second line" >> hello.txt 
$ cat hello.txt 
first line 
second line 

$ git checkout master 
M hello.txt 
Switched to branch 'master' 
$ cat hello.txt 
first line 
second line 

Por qué hello.txt tiene dos líneas en la rama principal ? (Pensé que git checkout revertiría el directorio de trabajo al estado anterior, es decir, hello.txt tendrá solo una línea.)

¿Qué sucede realmente detrás de las escenas del directorio de trabajo en git checkout? ¿Cómo se actualiza?

Respuesta

15

Tu git checkout to master evita que pierdas los cambios no confirmados. Es por eso que todavía tiene su segunda línea en su archivo hello.txt. Si realmente desea perder los cambios no comprometidos, debe usar el parámetro -f.

Finalmente el proceso de pago se vería así:

git checkout -f master 
+2

Aparentemente, git combina de manera predeterminada el directorio de trabajo actual en la nueva rama (_master_ en mi caso): http://www.gitguys.com/topics/switching-branches-without-committing –

+0

Mismo comportamiento si el archivo fue agregado a el índice pero no comprometido –

+0

Creo que las sucursales solo almacenan confirmaciones, no cambios de trabajo. Cuando te cambias a una sucursal y trabajas, debes confirmar esos cambios antes de cambiar a una rama diferente, o esos cambios no se asociarán a esa rama. Otra forma de manejar las sucursales es clonar su repositorio en un nuevo directorio. Luego puede trabajar en las dos ramas en los dos directorios diferentes sin tener que comprometerse hasta que esté listo. Esto hace que sea más fácil evitar errores. –

2

Git checkout (vagamente) actualizará la copia de trabajo con los contenidos del repositorio en la confirmación que especifique. Su sucursal new_feature no tiene la segunda línea que ha agregado a su archivo (ya que aún no la ha comprometido). En este momento, esa línea adicional es solo un cambio sin seguimiento en su copia de trabajo y se agregará a la sucursal en la que la haya enviado.

+2

Si 'git checkout' actualiza el directorio de trabajo con el contenido del repositorio en el cual se comprometan especifico (_master_ en mi caso), y sólo hay una línea en 'hello.txt' en _master_ branch, luego en' git checkout master' esperaría que 'hello.txt' en el directorio de trabajo tuviera solo una línea (exactamente como en _master_ branch). ¿Que me estoy perdiendo aqui? –

+0

El hecho de que tiene cambios locales no confirmados en su directorio de trabajo. Si el pago sobrepasa esos cambios, git lo advertirá y se negará a cambiar de sucursales. –

+1

Si esos cambios no entran en conflicto con el maestro, entonces git simplemente traerá esos cambios al directorio de trabajo del maestro (pero le permitirá cambiar de ramas). Esto es lo que OP está experimentando. Si esos cambios entran en conflicto con el maestro, entonces no le permitirá cambiar. Finalmente, si el directorio de trabajo está limpio al finalizar la compra, actualizará el directorio de trabajo a maestro. Esta respuesta deja demasiada información para ser correcta. Además, dado que el OP ya indicó que el directorio de trabajo NO está limpio, esta respuesta no aborda ese escenario. – Despertar

Cuestiones relacionadas