2012-10-10 28 views
6

Probé siguientes comandos en el shellgit checkout combina automáticamente las modificaciones locales

git init 

echo "test1" > test1.txt 
git add test1.txt 
git commit -a -m "test1" 

echo "test2" >> test1.txt 

git branch test 
git checkout test 

text.txt ahora contiene:

test1 
test2 

después de la salida en rama test todas las modificaciones locales de master quedan fusionadas.

¿Por qué?

esperé que git rechaza la salida a test debido a los cambios locales. Esperaba que git pidiera una confirmación o stash los cambios locales.

Editar: que utiliza un script bash para ejecutar estos comandos. Obtengo la siguiente salida:

[email protected]:/tmp/test$ ./createrepo 
Initialized empty Git repository in /tmp/test/.git/ 
[master (root-commit) 0407f5b] test1 
1 file changed, 1 insertion(+) 
create mode 100644 test1.txt 
M  test1.txt 
Switched to branch 'test' 
+0

tengo el mismo problema, lo raro es, para algunos repositorios, que no puede comprobación sin comprometerse, otras se fusionan. He buscado en la configuración y no veo ninguna diferencia. – jdborg

Respuesta

14

git se esfuerza para no perder datos valiosos posiblemente. En este caso, en realidad no se está fusionando ramas, ya que los cambios en cuestión no se han confirmado. Por el contrario, cuando hace un git checkout, intenta preservar las modificaciones recién hechas pero aún no confirmadas, por lo que verifica la confirmación que está solicitando y agrega los cambios no confirmados. Si realmente desea descartar los cambios no confirmados, utilice git checkout -f o git checkout seguido por git reset --hard HEAD. En ocasiones, si los cambios que aún no ha cometido no se pueden fusionar en lo que está revisando limpiamente, recibirá un mensaje de error y el proceso de pago fallará.

+1

No quiero descartar nada. Pero no quiero que los cambios sin compromiso se fusionen automáticamente. Si confirmo algo en 'test', realizo algunos cambios sin compromiso y trato de cambiar de nuevo, git dice que no puede porque en realidad hay cambios sin compromiso. Pero, ¿por qué git no hace esto si no hay compromisos en esta nueva rama? Porque la rama 'master' y' test' tienen el mismo 'HEAD'? – Razer

+0

Si ha cometido algo en 'test', entonces hay commits en esta nueva rama, así que supongo que no estoy siguiendo su pregunta ... Si, siguiendo el ejemplo anterior, usted cometió el cambio' test2' en su ' prueba' rama, luego hizo más modificaciones a 'prueba.txt' y trató de volver a 'maestro' sin comprometer primero, es bastante probable que los cambios no confirmados no se puedan copiar limpiamente, por lo que 'checkout' fallará hasta que descartes los cambios o uses' git stash'. – twalberg

+0

La confusión aquí está en el hecho de que OP piensa que tener la línea test2 en el archivo cuando se retira a la rama de prueba significa que están fusionados. Esto no es correcto: esos cambios no se fusionan en la rama de prueba, sino que se conservan en el directorio de trabajo. intenta hacer el estado de git diff y git en ambas ramas y verás de lo que estoy hablando. –

0

¿Alguna vez ha utilizado alguna opción con el comando git checkout? Lo pregunto porque el comportamiento que describes parece cuando se usa "git checkout -f".

+0

No, copié estos comandos de un script bash para probarlos. – Razer

0

git checkoutreemplaza archivos cambiados localmente.

git mergefusiona & cambios entrantes locales, alertando a cualquier conflicto.

Ni si estos comandos se eliminarán los archivos locales que no existen en el entrante de confirmación.

Sólo se git reset --hard eliminar por completo los cambios locales.

+0

Lo sé. Pero ¿por qué 'git checkout' fusiona los cambios locales de la rama' master' en la rama 'test' aunque no comprometí nada? – Razer

+0

¿Qué quiere decir "fusiona los cambios locales del maestro"? En realidad, no está realizando una 'fusión '. – Mars

Cuestiones relacionadas