Usé git pull
y tuve un conflicto de fusión:
unmerged: _widget.html.erb
You are in the middle of a conflicted merge.
Sé que la otra versión del archivo es buena y que la mía es mala, por lo que todos mis cambios deberían abandonarse. ¿Cómo puedo hacer esto?
git
version-control
git-merge
git-merge-conflict
Gwyn Morfey
fuente
fuente
[rejected] gh-pages -> gh-pages (non-fast-forward)
Respuestas:
Como
pull
no tuvo éxito, entoncesHEAD
(noHEAD^
) es el último compromiso "válido" en su rama:La otra pieza que desea es dejar que sus cambios anulen sus cambios.
Las versiones anteriores de git le permitían usar la estrategia de fusión "de ellos":
Pero esto se ha eliminado desde entonces, como lo explica Junio Hamano (el responsable de mantenimiento de Git) en este mensaje . Como se señaló en el enlace , en su lugar haría esto:
fuente
git fetch origin
->git reset origin (soft reset, your changes are still present)
->git checkout file_to_use_their_version_of another_file (steamroll your own changes back to match the origin)
Ya nunca uso git pull. Como en una pelea entre mi último código y el origen, el origen siempre debe ganar, siempregit fetch
ygit rebase origin
. Esto realmente hace que mis fusiones y conflictos sean pocos y distantes entre sí.git log ..@{upstream}
ogit diff ..@{upstream}
). Después de eso, como tú, rebajaré mi trabajo.git merge -X theirs remote_branch
en lugar degit pull --strategy=theirs remote_branch
quetheirs
se parece a una opción derecursive
git merge --abort
Es muy preferible.Si su versión de git es> = 1.6.1, puede usar
git reset --merge
.Además, como menciona @Michael Johnson, si su versión de git es> = 1.7.4, también puede usarla
git merge --abort
.Como siempre, asegúrese de no tener cambios sin confirmar antes de comenzar una fusión.
Desde la página de manual de git merge
git merge --abort
es equivalente agit reset --merge
cuandoMERGE_HEAD
está presente.MERGE_HEAD
está presente cuando hay una fusión en curso.Además, con respecto a los cambios no confirmados al iniciar una fusión:
Si tiene cambios que no desea confirmar antes de comenzar una fusión, solo
git stash
ellos antes de la fusión ygit stash pop
después de terminar la fusión o cancelarla.fuente
<commit>
? #GitMoment: -ogit merge --abort
solo un sinónimo degit reset --merge
? El nombre ciertamente tiene más sentido, pero ¿tiene la misma funcionalidad?http://www.git-scm.com/docs/git-merge
fuente
Es tan simple.
Git mismo le muestra la solución cuando se encuentra en este tipo de problemas y ejecuta el comando git status.
Espero que esto ayude a la gente.
fuente
Creo que es lo
git reset
que necesitas.Tenga en cuenta que eso
git revert
significa algo muy diferente a, digamos,svn revert
en Subversion, la reversión descartará sus cambios (no confirmados), devolviendo el archivo a la versión actual desde el repositorio, mientras quegit revert
"deshace" una confirmación.git reset
debe hacer el equivalente desvn revert
, es decir, descartar los cambios no deseados.fuente
En este caso de uso en particular, realmente no desea abortar la fusión, solo resuelva el conflicto de una manera particular.
Tampoco hay necesidad particular de reiniciar y fusionar con una estrategia diferente. Los conflictos han sido resaltados correctamente por git y el requisito de aceptar los cambios de los otros lados es solo para este archivo.
Para un archivo no fusionado en un conflicto, git pone a disposición la base común, las versiones locales y remotas del archivo en el índice. (Aquí es donde se leen para usar en una herramienta de diferencias de 3 vías
git mergetool
). Puede usargit show
para verlos.La forma más simple de resolver el conflicto para usar la versión remota textualmente es:
O, con git> = 1.6.1:
fuente
git 1.6.1
comando tiene mucho sentido y es bueno. Eso es exactamente lo que hubiera querido. Creo que la solución anterior a 1.6.1 no es elegante y requiere conocimiento sobre otras partes de git que deberían separarse del proceso de resolución de fusión. ¡Pero la nueva versión es genial!Por ejemplo, lo hice
git fetch
ygit pull
luego me di cuenta de que la rama ascendente no era la rama maestra, lo que resultó en conflictos no deseados.Esto se revirtió sin restablecer mis cambios locales.
fuente
Los comentarios sugieren que
git reset --merge
es un alias paragit merge --abort
. Vale la pena notar quegit merge --abort
solo es equivalente agit reset --merge
dado que aMERGE_HEAD
está presente. Esto se puede leer en el comando git help for merge.Después de una fusión fallida, cuando no existe
MERGE_HEAD
, la fusión fallida se puede deshacergit reset --merge
, pero no necesariamente congit merge --abort
. No son solo sintaxis antiguas y nuevas para la misma cosa .Personalmente, encuentro
git reset --merge
mucho más poderoso para escenarios similares al descrito, y las fusiones fallidas en general.fuente
git stash apply
causó un conflicto de fusión, perogit merge --abort
no ayudó mientras logit reset --merge
hizo.Si termina con un conflicto de fusión y no tiene nada que confirmar, pero aún se muestra un error de fusión. Después de aplicar todos los comandos mencionados a continuación,
Por favor eliminar
Archivo [cortar y pegar en otra ubicación en caso de recuperación] y luego ingresar cualquiera de los comandos a continuación según la versión que desee.
¡¡¡Espero que ayude!!!
fuente
Una alternativa, que conserva el estado de la copia de trabajo es:
En general, desaconsejo esto, porque es efectivamente como fusionarse en Subversion, ya que descarta las relaciones de ramificación en la siguiente confirmación.
fuente
Desde que Git 1.6.1.3
git checkout
ha podido pagar desde cualquier lado de una fusión:fuente
Encontré que lo siguiente funcionó para mí (revertir un solo archivo al estado previo a la fusión):
fuente
Sourcetree
Debido a que no confirma su fusión, simplemente haga doble clic en otra rama (lo que significa verificarla) y cuando sourcetree le pregunte si desea descartar todos los cambios, entonces acepte :)
fuente