Error: no se puede tirar con rebase: tiene cambios no organizados

138

He comenzado a colaborar con algunos amigos en un proyecto y usan el repositorio heroku git.

Cloné el repositorio hace unos días y desde entonces han realizado algunos cambios, así que estoy tratando de obtener las últimas actualizaciones

Ejecuté el git pull --rebasecomando como se indica aquí (¿Es esta la forma correcta de hacerlo?): Https://devcenter.heroku.com/articles/sharing#merging-code-changes

Obtuve el siguiente error:

$ git pull --rebase
Cannot pull with rebase: You have unstaged changes.
Please commit or stash them.

Supongo que me equivoqué con el código y ahora quiere que confirme o descarte (¿es eso lo que significa alijo?) Los cambios. ¿Es esto lo que está pasando? Si este es el caso, me gustaría descartar cualquier cambio que pudiera haber hecho y simplemente obtener el código actualizado del repositorio de git.

¿Alguna idea de lo que puedo hacer?

usuario3597950
fuente

Respuestas:

173

Haga git status, esto le mostrará qué archivos han cambiado. Como usted dijo que no desea conservar los cambios que puede hacer git checkout -- <file name>o git reset --harddeshacerse de los cambios.

En su mayor parte, git le dirá qué hacer con los cambios. Por ejemplo, su mensaje de error decía git stashsus cambios. Esto sería si quisieras conservarlos. Después de tirar, lo haría git stash popy sus cambios se volverían a aplicar.

git status también tiene cómo deshacerse de los cambios dependiendo de si el archivo está preparado para confirmación o no.

Schleis
fuente
1
Esto parecía funcionar, pero ahora me enfrento a otro error (comencé una nueva pregunta para no confundir a los futuros visitantes): stackoverflow.com/questions/23518247/…
user3597950
Literalmente estoy teniendo esto cada vez, solo recientemente. Antes, extraer archivos que no afecten sus cambios actuales está bien, pero ahora, requiere que todo lo que haya cambiado se guarde. Ni siquiera puedo empujar, me veo obligado a usargit push -f
Karma Blackshaw
@KarmaBlackshaw No debería ser necesario forzar el empuje. Si tiene que hacer un esfuerzo forzado, eso significa que su historial local y el historial remoto son diferentes y esa es una pregunta diferente de lo que cubre esta respuesta.
Schleis
De hecho, es diferente de lo que ofrece el alcance de esta pregunta. Pero sí encontré una forma al eliminar la rama actual y hacer que se desarrolle una nueva rama. Supongo que fue mi rama la que tenía algunas cosas configuradas incorrectamente.
Karma Blackshaw
91

Si desea mantener sus cambios de trabajo mientras realiza un rebase, puede usar --autostash. De la documentación :

Antes de comenzar el rebase, guarde las modificaciones locales (consulte git-stash [1] ) si es necesario, y aplique el alijo cuando haya terminado.

Por ejemplo:

git pull --rebase --autostash
mkobit
fuente
77
Esta es la respuesta moderna.
adl
13
Si desea que el comportamiento automático sea el comportamiento predeterminado que puede establecer, git config --global rebase.autoStash true entonces no necesita pasar el interruptor.
Zoredache
1
ESTO, lo que estaba buscando! (tenga en cuenta que el interruptor de línea de comando está disponible desde git 2.9, pero la opción rebase.autostashestá disponible desde 2.6).
jjmontes
¡Esto también funciona git rebase --interactivemuy bien!
Dan Dascalescu
66
¿Por qué no es este el valor predeterminado?
Nick
49

Tirar con rebase es una buena práctica en general.

Sin embargo, no puede hacerlo si su índice no está limpio, es decir, ha realizado cambios que no se han confirmado.

Puede hacer esto para evitarlo, suponiendo que desea conservar sus cambios:

  1. esconde tus cambios con: git stash
  2. tirar del maestro con rebase
  3. vuelva a aplicar los cambios que guardó en (1) con: git stash apply stash@{0}o el más simplegit stash pop
Kostas Rousis
fuente
1
Esto parecía funcionar, pero ahora me enfrento a otro error (comencé una nueva pregunta para no confundir a los futuros visitantes): stackoverflow.com/questions/23518247/…
user3597950
66
@nehemiahjacob También puede git stash popaplicar los cambios escondidos más recientemente y evitar memorizar los más largos apply stash@{0}.
Kostas Rousis
Tengo que hacer esto todo el tiempo. ¿Alguna manera más fácil?
Alper
@alper usualmente trabajas en otra rama (característica). En mi experiencia, solo busco y rebase contra master después de haber comprometido mi trabajo, por lo que no hay necesidad de esconder / pop. Si te encuentras haciendo eso durante tu flujo de trabajo de desarrollo, siempre puedes hacer un alias en tu .bashrc(o lo que sea que uses):alias stashpull='git stash; git pull; git stash pop'
Kostas Rousis
@KostasRousis Tengo ese alias exacto, jajaja. Lo llamo 'sppgit'
luizfls
30

Primero comience con un git status

Vea si tiene cambios pendientes. Para descartarlos, corre

git reset --hard
Igal S.
fuente
Esto parecía funcionar, pero ahora me enfrento a otro error (comencé una nueva pregunta para no confundir a los futuros visitantes): stackoverflow.com/questions/23518247/…
user3597950
16

Esto funciona para mi:

git fetch
git rebase --autostash FETCH_HEAD
CppChase
fuente
1
Ah, autostash, eso me ahorra dos comandos adicionales. Esta debería ser la respuesta correcta de la OMI.
Erik Berkun-Drevnig
10

Siempre puedes hacer

git fetch && git merge --ff-only origin/master

y obtendrá (a) ningún cambio si tiene cambios no confirmados que entran en conflicto con los cambios aguas arriba o (b) el mismo efecto que alijo / extracción / aplicación: una nueva versión para ponerlo en los últimos cambios de HEAD y sus cambios no confirmados restantes como es.

Jared Updike
fuente
6

Cuando el cambio no organizado se debe a que git está tratando de arreglar las convenciones de eol en un archivo (como siempre es mi caso), ninguna cantidad de almacenamiento, extracción o reinicio lo hará desaparecer.

Sin embargo, si la intención es realmente modificar e ignorar los cambios no organizados, entonces lo que hago es eliminar la rama localmente y luego volver a revisarla.

git checkout -f anyotherbranchthanthisone
git branch -D thebranchineedtorebase
git checkout thebranchineedtorebase

Voila! No me ha fallado todavía.

tggagne
fuente
2

Si desea guardar automáticamente sus cambios y desarmarlos para cada rebase, puede hacer esto:

git config --global rebase.autoStash true
agirault
fuente
1
Esta es la única respuesta que hace que la versión más nueva de Git funcione de la misma manera que Git siempre ha funcionado en el pasado. ¿Por qué hacer que la gente agregue --autostashcuando solo puede ser ... automático?
Andrew Koster,