Cómo resolver conflictos con Git por consola

El escenario es: hemos hecho una Pull Requests en Github y mientras esperamos que se la miren, otro compañero ha hecho su Pull Requests, ha mergeado y ahora, en la nuestra vemos lo siguiente.

Un bonito conflicto a resolver. Lo podemos hacer de dos maneras, o resolverlo a mano en Github o via nuestra terminal.

Vamos a ver como hacerlo en nuestra terminal

Situarse en la rama correcta

git checkout feature/WPA-23654
Cambiado a rama 'feature/WPA-23654'
Tu rama está actualizada con 'origin/feature/WPA-23654'.

Iniciamos el git pull en modo rebase

git pull --rebase origin master

¿Qué es el modo rebase en git pull? ¿Cuándo usar git pull –rebase?

I think you should use git pull --rebase when collaborating with others on the same branch. You are in your work → commit → work → commit cycle, and when you decide to push your work your push is rejected, because there’s been parallel work on the same branch. At this point I always do a pull --rebase. I do not use squash (to flatten commits), but I rebase to avoid the extra merge commits.

https://stackoverflow.com/questions/2472254/when-should-i-use-git-pull-rebase

Veamos lo que pasa cuando iniciamos el rebase

(venv) ➜  security-management git:(feature/WPA-23654) ✗ git pull --rebase origin master
remote: Enumerating objects: 10, done.
remote: Counting objects: 100% (10/10), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 4 (delta 2), reused 0 (delta 0), pack-reused 0
Desempaquetando objetos: 100% (4/4), 1.38 KiB | 472.00 KiB/s, listo.
Desde github.com:Wallapop/security-management
 * branch            master     -> FETCH_HEAD
   99ca504..9b22c5e  master     -> origin/master
Auto-fusionando infrastructure/security-alerts/template.yaml
CONFLICTO (contenido): Conflicto de fusión en infrastructure/security-alerts/template.yaml
error: no se pudo aplicar 378c547... add permissions to the lambda role to perform puts in cloudwatch
ayuda: Resolve all conflicts manually, mark them as resolved with
ayuda: "git add/rm <conflicted_files>", then run "git rebase --continue".
ayuda: You can instead skip this commit: run "git rebase --skip".
ayuda: To abort and get back to the state before "git rebase", run "git rebase --abort".
No se pudo aplicar 378c547... add permissions to the lambda role to perform puts in cloudwatch

Como se puede observar, Git nos pide que resolvamos el conflicto. Y lógicamente hemos de hacerlo manualmente. En este caso, es solo un archivo, un YAML. Veamos el problema.

<<<<<<< HEAD
            Resource: '*'
=======
            Resource: "*"

          - Effect: "Allow"
            Action:
              - cloudwatch:Enable*
              - cloudwatch:Put*
              - cloudwatch:Set*
              - cloudwatch:Describe*
              - cloudwatch:List*
            Resource: "*"
>>>>>>> 378c547 (add permissions to the lambda role to perform puts in cloudwatch)
      Roles:
        - !Ref SecurityAlertsRole

Lo que vemos es que, en master tenemos

Resource: '*'

mientras que en mi rama tenemos otra parte donde añadimos más permisos a un IAM ROLE. Vamos a resolver el conflicto, dejaremos el archivo así:

         - Effect: "Allow"
            Action:
              - config:GetResourceConfigHistory
            Resource: "*"

          - Effect: "Allow"
            Action:
              - cloudwatch:Enable*
              - cloudwatch:Put*
              - cloudwatch:Set*
              - cloudwatch:Describe*
              - cloudwatch:List*
            Resource: "*"
      Roles:
        - !Ref SecurityAlertsRole

Ahora vamos a añadir el cambio a nuestra rama.



Rutas no fusionadas:
  (usa "git restore --staged <archivo>..." para sacar del área de stage)
  (usa "git add <archivo>..." para marcar una resolución)
        modificados por ambos:  infrastructure/security-alerts/template.yaml

git:(038e745) ✗ ga infrastructure/security-alerts/template.yaml     

Una vez añadido el fichero modificado, seguimos con el proceso.

git rebase --continue

Nos saldrá una pantalla interactiva donde podemos cambiar el nombre del commit.

[HEAD desacoplado e89e874] add permissions to the lambda role to perform puts in cloudwatch
 1 file changed, 11 insertions(+), 1 deletion(-)
Rebase aplicado satisfactoriamente y actualizado refs/heads/feature/WPA-23654.

En este caso solo había un commit y no nos pide elegir los commits a añadir etc, como se explica aquí:

Pero en otros casos con más conflictos habremos de hacerlo. Ahora, seguimos y subimos nuestros cambios con

ggpush -f

Y listo, conflictos resueltos

(venv) ➜  security-management git:(feature/WPA-23654) ✗ ggpush -f
Enumerando objetos: 81, listo.
Contando objetos: 100% (81/81), listo.
Compresión delta usando hasta 16 hilos
Comprimiendo objetos: 100% (67/67), listo.
Escribiendo objetos: 100% (67/67), 7.90 KiB | 2.63 MiB/s, listo.
Total 67 (delta 45), reusados 0 (delta 0), pack-reusados 0
remote: Resolving deltas: 100% (45/45), completed with 12 local objects.
To github.com:Wallapop/security-management.git
 + f60f7b6...19b0000 feature/WPA-23654 -> feature/WPA-23654 (forced update)

Links

Leave a Reply

Your email address will not be published. Required fields are marked *