Daniel Farrell
Estaba trabajando en una rama de git y estaba listo para confirmar mis cambios, así que hice una confirmación con un mensaje de confirmación útil. Luego, distraídamente, hice cambios menores en el código que no vale la pena conservar. Ahora quiero cambiar de rama, pero git me da,
error: tiene cambios locales en “X”; no puede cambiar de rama.
¿Puedo cambiar de sucursal sin comprometerme? Si es así, ¿cómo puedo configurar esto? Si no, ¿cómo salgo de este problema? Quiero ignorar los cambios menores sin comprometerme y simplemente cambiar de rama.
VonC
Necesitas un estado limpio para cambiar de sucursal. El pago en sucursal solo se permitirá si no afecta a los ‘archivos sucios’ (como comenta Charles Bailey en los comentarios).
De lo contrario, debe:
- reserva su cambio actual o
reset --hard HEAD
(si no le importa perder esos cambios menores) ocheckout -f
(Al cambiar de rama, proceda incluso si el índice o el árbol de trabajo difieren de HEAD. Esto se usa para desechar los cambios locales).
O, más recientemente:
- Con Git 2.23 (agosto de 2019) y el nuevo comando
git switch
:
git switch -f <branch-name>
(
-f
es corto para--force
que es un alias para--discard-changes
)
Continúe incluso si el índice o el árbol de trabajo difieren de HEAD.
Tanto el índice como el árbol de trabajo se restauran para que coincidan con el objetivo de cambio.
Esto difiere de git switch -m <branch-name>
que desencadena una fusión de tres vías entre la rama actual, el contenido de su árbol de trabajo y la nueva rama: no perderá su trabajo en progreso de esa manera.
-
“Se necesita un estado limpio para cambiar de sucursal”. solo es cierto si el cambio de rama afecta a los ‘archivos sucios’.
–CB Bailey
20 de agosto de 2009 a las 11:46
-
Para el método stash, escribí “git stash save”, “git checkout otherbranch”, y finalmente “git stash pop”.
– Venkat D.
13 de octubre de 2011 a las 1:05
-
Actualmente no veo este mensaje de error, y los cambios que hice en una rama aparecen en la otra cuando hago “git status”. ha cambiado algo?
– Senthil A Kumar
28 de noviembre de 2011 a las 6:50
-
gracias. el checkout -f era lo que necesitaba. Hice git reset –hard git clean -f git checkout mybranch -f
– Sin logo
8 de julio de 2015 a las 1:12
-
Aquí está la gran cosa en la que Git se equivocó por completo al violar la definición básica de una rama. A diferencia de git branch, significa dos espacios de trabajo totalmente diferentes bifurcados de un repositorio.
– nehem
14 de febrero de 2017 a las 22:23
Si desea descartar los cambios,
git checkout -- <file>
git checkout branch
Si desea conservar los cambios,
git stash save
git checkout branch
git stash pop
-
Efectivamente lo que dice Romerun (para ser completo):
git stash save
(cuando está en trabajo branchY) entoncesgit checkout branchX
hacer algogit add/commit -m
etc.git checkout branchY
ygit stash pop
para recuperar el alijo– Highmastdon
9 de noviembre de 2012 a las 9:36
-
Tal vez sea así. Sin embargo, tengo una situación en la que quiero hacer lo que dice la respuesta, si lo entiendo bien: ocultar cambios, cambiar de Y a X, luego abrir cambios y confirmarlos en X.
–Ben Klein
06/10/2015 a las 17:02
-
tenga en cuenta que
git stash save
ahora está en desuso en favor degit stash push
– Amr Saber
21 oct 2018 a las 15:45
-
Este alias simplifica el caso de mantener cambios al cambiar de rama.
– Tom Hale
8 de junio de 2019 a las 9:49
bueno, debería ser
git stash save
git checkout branch
// do something
git checkout oldbranch
git stash pop
-
Sí, el alijo es global, no específico de la rama, si alijo pop después de cambiar de rama, obtendré el mismo alijo que en la(s) otra(s) rama(s)
– Aditya Mittal
19 de enero de 2016 a las 19:07
-
Debe tenerse en cuenta
git stash
se establecerá por defecto engit stash save
– Charlie Greenman
8 de agosto de 2016 a las 14:19
-
Gracias, es muy útil para mí.
– GKS
24 mayo 2017 a las 12:45
Seguir,
$: git checkout -f
$: git checkout next_branch
acantilado
Tenga en cuenta que si ha fusionado sucursales remotas o tiene confirmaciones locales y desea volver al HEAD remoto, debe hacer lo siguiente:
git reset --hard origin/HEAD
HEAD
solo solo se referirá a la confirmación/combinación local; varias veces olvidé eso al reiniciar y terminé con “su repositorio es X confirmaciones por delante…” cuando tenía la intención de destruir TODOS los cambios/confirmaciones y volver a la rama remota .
vishnu viswanath
Ninguna de estas respuestas me ayudó porque todavía tenía archivos sin rastrear incluso después de reiniciar y guardar. Tenía que hacer:
git reset --hard HEAD
git clean -d -f
pedro trujillo
git checkout -f nombre_su_sucursal
git checkout -f your_branch_name
si tiene problemas para revertir los cambios:
git checkout .
si desea eliminar directorios y archivos sin seguimiento:
git clean -fd
Creo que esto solo sucede cuando los cambios se organizan para confirmar pero no se confirman. git checkout funciona bien para cambiar de sucursal si aún no ha preparado los archivos usando git add o similar.
– Jeremy Muro
21 de agosto de 2009 a las 3:16
Hola Jeremy, ¿Qué quieres decir con ‘escenificado’? Obligar al usuario a confirmar el archivo antes de que los cambios se ramifiquen no parece un gran flujo de trabajo. Por ejemplo, si estoy en el repositorio principal y quiero verificar rápidamente algo en una rama. Primero tengo que enviar el código al maestro, ¡incluso si el código está a medio escribir! ¿Está diciendo que, de hecho, debería ser posible pagar una sucursal en esta situación?
– Daniel Farrell
21 de agosto de 2009 a las 9:25
@boyfarrell Puede usar ‘Git stash’ para guardar temporalmente los cambios sin comprometerse.
– Howiecamp
29/10/2016 a las 23:01
Enlace cruzado de los estrechamente relacionados ¿Cómo obligo a “git pull” a sobrescribir los archivos locales?
– usuario56reinstatemonica8
9 de enero de 2018 a las 17:51
cuando cambias a una rama sin realizar cambios en la rama anterior, git intenta fusionar los cambios en los archivos de la nueva rama. Si la fusión se realiza sin ningún conflicto, el cambio de ramas se realizará correctamente y podrá ver los cambios en la nueva rama. Pero si ocurre un conflicto, obtendrá
error: You have local changes to '<filename>'; cannot switch branches.
y la rama no cambiará. tu puedes hacergit checkout -m <branch-name>
para fusionar conflictos y pagar en la sucursal y resolver los conflictos usted mismo, ogit checkout -f <branch-name>
para ignorar los cambios.– samad montazeri
8 de junio de 2019 a las 9:10