Los sistemas de control de versiones consisten en gestionar las contribuciones de diferentes autores distribuidos (normalmente desarrolladores). A veces, varios desarrolladores pueden intentar editar el mismo contenido. Si el desarrollador A intenta editar el código que está editando el desarrollador B, puede surgir un conflicto. Para evitar conflictos, los desarrolladores trabajan enramas aisladassin importar. La función principal del comando.mesclar git
consiste en fusionar ramas independientes y resolver cambios conflictivos.
Fusionar análisis de conflictos
Las fusiones y los conflictos son una parte común de la experiencia de Git. Los conflictos en otras herramientas de control de versiones como SVN pueden ser costosos y consumir mucho tiempo. Con Git, fusionar es fácil. La mayoría de las veces, Git puede integrar nuevos cambios automáticamente.
Los conflictos suelen surgir cuando dos personas cambian las mismas líneas en un archivo, o cuando un desarrollador elimina un archivo mientras otro lo cambia. En estos casos, Git no puede determinar automáticamente qué es correcto. Los conflictos solo afectan al desarrollador que realiza la fusión, el resto del equipo no está al tanto del conflicto. Git marca el archivo como conflictivo y detiene el proceso de fusión. Entonces el desarrollador es responsable de resolver el conflicto.
Tipos de conflictos de fusión
Una fusión puede entrar en un estado de conflicto en dos momentos diferentes. Al principio y durante un proceso de fusión. A continuación, explicamos cómo abordar cada uno de estos escenarios de conflicto.
Git no comienza a fusionarse
No se iniciará una fusión si Git detecta cambios en el directorio de trabajo o el entorno de ensayo del proyecto actual. Git no inicia la fusión porque las confirmaciones que se fusionan pueden sobrescribir los cambios pendientes. Cuando esto sucede, no se debe a conflictos con otros desarrolladores, sino a los próximos cambios locales. El estado local debe ser estabilizado poralijo de git
,salida de git
,Confirmar Git
oir a redefinir
🇧🇷 Un error de combinación durante la inicialización da como resultado que se muestre el siguiente mensaje de error:
error:Entry'<fileName>'notuptodate.Cannotmerge.(Changesinworkingdirectory)
Git falla al fusionar
Un error DURANTE una combinación indica un conflicto entre la sucursal local actual y la sucursal que se está fusionando. Esto indica un conflicto con el código de otro desarrollador. Git hará todo lo posible para fusionar los archivos, pero dejará que usted resuelva manualmente los archivos en conflicto. Un error de combinación da como resultado que se muestre el siguiente mensaje de error:
error: la entrada '<nombre de archivo>' se sobrescribirá por combinación. No se puede combinar. (Cambios en el área de ensayo)
Creación de un conflicto de fusión
Para familiarizarse realmente con los conflictos de fusión, la siguiente sección simula un conflicto para su posterior estudio y resolución. El ejemplo utiliza una CLI de Git similar a Unix para ejecutar la simulación de ejemplo.
$mkdirgit-combinar-prueba
$cdgit-combinar-prueba
cálido
$echo"estoesalgoparajugar">merge.txt
$gitaddmerge.txt
$gitcommit-am "comprometemos el contenido original"
[main(root-commit)d48e74c] solo estamos confirmando el contenido original
1 archivo modificado, 1 inserción (+)
createmode100644merge.txt
Este ejemplo de código ejecuta un script que hace lo siguiente.
- Crear un nuevo directorio llamado
Git-Merge-Prueba
, cambie a ese directorio e inicialícelo como un nuevo repositorio de Git. - Crear un nuevo archivo de texto
mezclar.txt
con algún contenido dentro. - añadir
mezclar.txt
al repositorio y confirme.
Ahora tenemos un nuevo repositorio de rama únicaprincipalmente
y un archivomezclar.txt
con contenido Luego creamos una nueva rama y la usamos para crear una combinación conflictiva.
$gitcheckout-bnew_branch_to_merge_later
$echo"contenido totalmente diferente para fusionar más tarde"> fusionar.txt
$gitcommit-am "editó el contenido de merge.txt para crear un conflicto"
[new_branch_to_merge_later6282319] editó el contenido de merge.txt para causar un conflicto
1 archivo modificado, 1 inserción (+), 1 eliminación (-)
El siguiente script hace lo siguiente:
- Crea y verifica una nueva rama llamada
new_branch_to_merge_later
. - sobrescribir contenido
mezclar.txt
. - Confirme el nuevo contenido.
con esta nueva sucursalnew_branch_to_merge_later
, creamos un compromiso que reemplaza el contenido demezclar.txt
.
gitcheckoutmain
Cambiado a la rama 'principal'
echo"contenttoappend">>merge.txt
gitcommit-am"contenido agregado para fusionar.txt"
[main24fbe3c] contenido añadido para fusionar.tx
1 archivo modificado, 1 inserción (+)
Esta cadena de comando extrae la ramaprincipalmente
, agregar contenidomezclar.txt
y lo confirma. Esto ahora pone nuestro repositorio de muestra en un estado en el que tenemos 2 nuevas confirmaciones. uno está en la ramaprincipalmente
y el otro en la ramanew_branch_to_merge_later
🇧🇷 En este punto usaremosgit merge new_branch_to_merge_later
y mira lo que pasa.
$gitmergenew_branch_to_merge_later
Mergemerge.txt automáticamente
CONFLICTO(contenido):Mergeconflictinmerge.txt
Fusión automática fallida; Resolver conflictos y aceptar el resultado.
¡AUGE! 💥 Surge un conflicto. ¡Gracias por el consejo Gui!
Cómo identificar conflictos de fusión
Como vimos en el ejemplo anterior, Git genera una salida descriptiva para decirnos que ha ocurrido un conflicto (CONFLICTO). Podemos obtener más información ejecutando el comandoEstado de Git
.
$gitstatus
Na filial principal
Tienes caminos no fusionados.
(Resolver conflictos y gitcommit)
(Use "gitmerge --abort" para cancelar la fusión)Rutas no fusionadas:
(use "gitadd<file>..." para marcar la resolución)
modificado:merge.txt
el resultado deEstado de Git
indica que las rutas no se fusionaron debido a un conflicto. El archivofusionar.texto
ahora aparece con el estado cambiado. Examinemos el archivo y veamos qué ha cambiado.
$catmerge.txt
<<<<<<<KOPF
eso es un poco feliz por eso
contenido para agregar
=======
Contenido totalmente diferente para mezclar gelater
>>>>>>>nueva_sucursal_para_fusionar_luego
Aquí usamos el comandogatos
para ver el contenido del archivomezclar.txt
🇧🇷 Podemos ver algunas nuevas incorporaciones extrañas:
<<<<<<< KOPF
=======
>>>>>>> new_branch_to_merge_later
Piense en estas nuevas líneas como "líneas divisorias de conflicto". la línea=======
es el "centro" del conflicto. Cualquier contenido entre el centro y la línea<<<<<<< KOPF
es el contenido que existe en la rama principal actual apuntada por la referenciaKOPF
🇧🇷 Por el contrario, todo contenido entre el medio y el>>>>>>> new_branch_to_merge_later
Es el contenido que existe en nuestra rama de combinación.
Cómo resolver conflictos de combinación desde la línea de comandos
La forma más directa de resolver un conflicto de combinación es editar el archivo en conflicto. abre el archivomezclar.txt
en el editor de su elección. En nuestro ejemplo, simplemente eliminamos todos los divisores de conflicto. contenidomezclar.txt
modificado para que se vea así:
eso es un poco feliz por eso
contenido para agregar
Contenido totalmente diferente para mezclar gelater
Después de editar el archivo, usegit adiciona merge.txt
para preparar el nuevo contenido fusionado. Para completar la fusión, cree una nueva confirmación ejecutando:
gitcommit-m "conflicto fusionado y resuelto en Merge.txt"
Git reconoce que el conflicto está resuelto y crea una nueva confirmación de fusión para completar la fusión.
Comandos de Git que pueden ayudar a resolver conflictos de combinación
herramientas generales
Estado de Git
El comando de estado se usa comúnmente cuando se trabaja con Git y ayuda a fusionar archivos en conflicto.
gitlog - fusionar
Al pasar el argumento hacia adelante--unir
dominioregistro de Git
, se crea un registro con una lista de confirmaciones en conflicto entre las ramas que se fusionan.
diferencia de git
diferencia
ayuda a encontrar diferencias entre los estados de un repositorio/archivos. Esto es útil para predecir y evitar conflictos de fusión.
Herramientas para cuando Git no puede iniciar una fusión
gitcheckout
Cajero
se puede utilizar paracancelarModificar cambios en archivos o ramas.
gitreset-misto
restaurar a los valores predeterminados
Se puede utilizar para deshacer cambios en el directorio de trabajo y el entorno de ensayo.
Herramientas en caso de que se produzcan conflictos de Git durante una fusión
girge - abortar
cuando funcionamesclar git
con la opción--abortar
, el proceso de fusión finaliza y la rama vuelve al estado en el que se encontraba antes de que comenzara la fusión.
gitreset
Git-Restablecer
se puede usar durante un conflicto de combinación para revertir los archivos en conflicto a un buen estado.
resumen
Los conflictos de fusión pueden ser una experiencia intimidante. Afortunadamente, Git proporciona herramientas poderosas para navegar y resolver conflictos. Git puede hacer la mayor parte de la fusión por sí mismo con funciones de fusión automática. Un conflicto surge cuando dos ramas independientes editan la misma línea de un archivo, o cuando un archivo se eliminó en una rama pero se editó en la otra. Es más probable que ocurran conflictos cuando se trabaja en equipo.
Hay muchas herramientas para resolver conflictos de fusión. Git tiene muchas herramientas de línea de comandos que explicamos aquí. Si desea información más detallada sobre estas herramientas, visite las páginas específicas deregistro de Git
,ir a redefinir
,Estado de Git
,salida de git
jir a redefinir
🇧🇷 Fuera de Git, hay muchas herramientas de terceros que brindan soporte optimizado para conflictos de fusión.
FAQs
How do I fix conflicts in git merge? ›
- The easiest way to resolve a conflicted file is to open it and make any necessary changes.
- After editing the file, we can use the git add a command to stage the new merged content.
- The final step is to create a new commit with the help of the git commit command.
Merge conflicts happen when you merge branches that have competing commits, and Git needs your help to decide which changes to incorporate in the final merge. Git can often resolve differences between branches and merge them automatically.
How do I resolve merge conflicts in git Vscode? ›...
Resolve merge conflicts
- Go over your conflicts line by line, and choose between keeping the right or the left side by selecting the checkboxes.
- Keep or ignore all of your conflicting changes.
- Manually edit your code in the Result window.
General tools. The status command is in frequent use when a working with Git and during a merge it will help identify conflicted files. Passing the --merge argument to the git log command will produce a log with a list of commits that conflict between the merging branches.
How do I manually resolve a merge conflict? ›- Make sure you're in your repository directory. ...
- Pull the most recent version of the repository from Bitbucket. ...
- Checkout the source branch. ...
- Pull the destination branch into the source branch. ...
- Open the file to resolve the conflict. ...
- Resolve the conflict by doing the following: ...
- Add and commit the change.
You can undo a Git merge using the git reset –merge command. This command changes all files that are different between your current repository and a particular commit. There is no “git undo merge” command but the git reset command works well to undo a merge.
How do you resolve a conflict? ›- Talk directly. Assuming that there is no threat of physical violence, talk directly to the person with whom you have the problem. ...
- Choose a good time. ...
- Plan ahead. ...
- Don't blame or name-call. ...
- Give information. ...
- Listen. ...
- Show that you are listening. ...
- Talk it all through.
- Fast Forward.
- Recursive.
- Ours.
- Octopus.
- Resolve.
- Subtree.
If you are able to complete the merge the conflicts must have been resolved. Once you add and commit a merge, you're telling Git that there are no more changes you need to make. If you miss something, then that's your problem. Fix it and recommit or --amend your merge commit.