Error al cambiar a rama maestra: mis cambios locales se sobrescribirán al finalizar la compra

127

Esta pregunta es similar a esta , pero más específica.

Tengo un proyecto con dos ramas ( stagingy beta).

Me desarrollo stagingy uso la masterrama para corregir errores. Entonces, si estoy trabajando en la preparación y veo un error, cambio a masterrama:

git checkout master

y hacer las cosas:

git add fileToAdd
git commit -m "bug fixed"

y luego me fusiono con ambas ramas:

git checkout staging
git merge master
git checkout beta
git merge beta

Y no importa si hay otros archivos en el árbol de trabajo.

Pero ahora, cuando trato de cambiar a la masterrama, recibo un error :

error: Your local changes to the following files would be overwritten by checkout:
src/Pro/ConvocationBundle/Controller/DefaultController.php
Please, commit your changes or stash them before you can switch branches.
Aborting

Pensé que debería eliminar el archivo del área de preparación:

git reset HEAD src/Pro/ConvocationBundle/Controller/DefaultController.php

pero obtengo el mismo error Si lo hago git statusme saleNo changes to commit

Manolo
fuente
44
¿Lo has intentado reset --hard? Si realmente está seguro de que desea descartar sus cambios. O use alijo si no lo hace.
Keltar
@keltar - No. No quiero descartar mis cambios. Solo mantenlos en el árbol de trabajo para una confirmación posterior
Manolo
1
No creo que pueda cambiar de rama mientras mantiene los cambios no confirmados, pero podría estar equivocado fácilmente, no es realmente mi campo. Intenta git add your-filey comprométete.
Keltar
@keltar - He trabajado antes de esta manera. No quiero comprometer ningún cambio en este stagingmomento.
Manolo
Tal vez su archivo en conflicto no se modificó cuando lo intentó antes. Tiene cambios, git tiene que guardarlos en algún lugar para restaurarlos más tarde. Es muy poco probable que sea posible sin commits. Pero si realmente no quieres usar stash, es exactamente por eso que existe.
Keltar

Respuestas:

128

Su error aparece cuando ha modificado un archivo y la rama a la que está cambiando también tiene cambios para este archivo (desde el último punto de fusión).

Sus opciones, según lo veo, son: commit, y luego enmendar este commit con cambios adicionales (puede modificar los commits en git, siempre que no estén pusheditados); o - use alijo:

git stash save your-file-name
git checkout master
# do whatever you had to do with master
git checkout staging
git stash pop

git stash savecreará un alijo que contenga sus cambios, pero no está asociado con ninguna confirmación ni rama. git stash popaplicará la última entrada de alijo a su rama actual, restaurando los cambios guardados y eliminándolo del alijo.

Keltar
fuente
3
Gracias. ¿Estás seguro de que esto no hará ningún cambio en mi árbol de trabajo (archivos no agregados)? No quiero perder mis cambios: - /
Manolo
Vaya, mal escrito addcuando en realidad está save... actualizado. ¿Te refieres a otros archivos? git stash savesin parámetro de nombre de archivo guardará todos los archivos modificados, si lo desea (y los revertirá al último estado comprometido). Y tener una copia extra del árbol de directorios nunca está de más, pero siempre estoy paranoico al respecto.
keltar
La cosa sería guardar todos los archivos modificados, excepto el que quiero agregar a la masterrama. Además, ¿una opción serían poplos cambios en otra rama?
Manolo
No estoy seguro de lo que quieres decir. Sí, puede aplicar alijo en otra rama, pero simplemente reemplazará el contenido de los archivos, no los fusionará.
keltar
1
@Honey no tiene nada que ver con sucursales, el problema es cambios no comprometidos. El pago, por definición, tiene que restablecer sus archivos al estado de master, pero al hacerlo perderá su contenido actual, y dado que este contenido no está comprometido, sería imposible volver a este estado más tarde, por lo tanto, es un error. no estaría molesto por los cambios perdidos más tarde.
keltar
150

Encontré el mismo problema y lo resolví

git checkout -f branch

y su especificación es bastante clara.

-f, --force

Al cambiar de rama, proceda incluso si el índice o el árbol de trabajo difieren de HEAD. Esto se usa para descartar cambios locales.

Al retirar rutas del índice, no falle en las entradas no fusionadas; en cambio, las entradas no fusionadas se ignoran.

KikiYu
fuente
77
Cuando mi git se atascó (sin cambios locales pero aún así ese error), ¡esta solución me ayudó!
lukyer
55
Gracias, salvaste mi pantalla de tener un puño en ella.
Búho
3
Perdí mis cambios de esa manera
Jacek Dziurdzikowski
1
Sí, perderá los cambios al hacer esto, esto debería venir con una gran advertencia.
Alexander Mills
Lo quiero al revés. master está detrás de mi sucursal y estoy actualizado con master pero todavía no puede cambiar de sucursal. Debe ser un error de git.
jgmjgm
12

Puede forzar el pago de su sucursal, si no desea confirmar sus cambios locales.

git checkout -f branch_name
Deepika Patel
fuente
1
No sudoes necesario, solo romperá los permisos del archivo. Es el mismo comando git publicado por @kiki_yu un año antes, pero es aún peor.
kenorb
2
Perdí mis cambios de esa manera
Jacek Dziurdzikowski
2
@JacekDziurdzikowski Así que perdió sus cambios dos veces (vea el comentario sobre la respuesta de kiki_yu), ambos aplicando soluciones que mencionaron muy explícitamente que descartar los cambios locales era el propósito mismo . ¿Mi detector de sarcasmo está roto o ... hablas en serio?
RomainValeri
@RomainValeri Hmm, supongo que esa fue mi forma de advertir a otros que son principiantes con git (tienen que ser principiantes si leen esta publicación) para estar listos para despedirse de los cambios que hicieron. Pensé que el tiempo que los cambios realizados en una rama deberían permanecer en esa rama hasta que vuelva a pagar. Sugerencia para los recién llegados que también piensan de esa manera: use git stash :)
Jacek Dziurdzikowski
Respuesta duplicada, sin ninguna razón. La primera respuesta tiene aún más información.
MAChitgarha
9

Encontré el mismo problema y lo resolví

git checkout -f branch

Bueno, ten cuidado con el -finterruptor. Perderá los cambios no confirmados si utiliza el-f interruptor. Si bien puede haber algunos casos de uso en los que es útil usarlo -f, en la mayoría de los casos, es posible que desee realizar stashcambios y luego switchramificaciones. El stashingprocedimiento se explica arriba.

BeNiza
fuente
0

Puede comprometerse en la rama actual, pagar a otra rama y, finalmente, seleccionar esa confirmación (en lugar de fusionar).

Vitaly Zdanevich
fuente
Puede ser más útil si da más explicaciones sobre esto.
MAChitgarha
-1

Si obtienes esto cuando intentas verificar una rama diferente:

my-mac:myGHProject ~$ git checkout other-branch
error: Your local changes to the following files would be overwritten by checkout:
    src/main/resources/reference.conf

Esto significa que tiene algunos cambios que necesita confirmar en la rama que ha desprotegido, o debe borrarlos o esconderlos como la mayoría de los puntos anteriores. 19 de cada 20 veces tengo muchas más probabilidades de cometer mis cambios.

my-mac:myGHProject ~$ git branch
  * my-local-branch
  * develop    

my-mac:myGHProject ~$ git status
On branch my-local-branch
   Changes not staged for commit:
   (use "git add <file>..." to update what will be committed)
   (use "git checkout -- <file>..." to discard changes in working directory)
 modified:   src/main/resources/reference.conf

my-mac:myGHProject ~$ git add src/main/resources/reference.conf

my-mac:myGHProject ~$ git commit -m "updates on some config"
  [my-local-branch] updates on some config
  1 file changed, 131 insertions(+), 85 deletions(-)

Ahora que lo ha hecho, puede ver la otra rama y alternar con bastante facilidad.

my-mac:myGHProject ~$ git checkout other-branch

my-mac:myGHProject ~$ git status
  On branch other-branch

my-mac:myGHProject ~$ git checkout my-local-branch
  Switched to branch 'my-local-branch'

Solo asegúrese de estar en la rama derecha y presionar hacia la rama correcta cuando ejecute el comando git push origin $ {branch}. Nota: si tiene su proyecto conectado directamente a Intellij, puede ver que cambió su rama en la esquina inferior derecha de la ventana principal.

Tony Fraser
fuente