Fusionando 2 sucursales juntas en GIT

131

Acabo de comenzar a usar GIT y creo que es maravilloso, sin embargo, estoy un poco confundido sobre lo que hace el mergecomando.

Digamos que tenemos un proyecto de trabajo en la rama "A".

Voy a casa y hago cambios en esta rama y la guardo como "B". Otro programador realiza cambios en "A" y lo guarda como "C".

¿Hay alguna manera de fusionar las dos ramas "B" y "C" juntas, y luego confirmar los cambios como una nueva rama, decir "D"?

¿O me estoy perdiendo el punto de 'fusión'?

punteado
fuente
no es necesario 'guardar cambios' en otra rama. trabajar una A y luego fusionar esas A diferentes juntas
knittl
No te sigo. A estaría en mi computadora local, dev1 tendría una copia de A en su computadora y dev2 tiene una copia de A en su computadora. Ambos desarrolladores realizan cambios, ¿cómo combino estos cambios?
dotty
ver < kernel.org/pub/software/scm/git/docs/git-pull.html >. los desarrolladores probablemente necesiten empujar / cargar su repositorio en algún lugar primero
knittl

Respuestas:

196

merge se usa para unir dos (o más) ramas juntas.

un pequeño ejemplo:

# on branch A:
# create new branch B
$ git checkout -b B
# hack hack
$ git commit -am "commit on branch B"

# create new branch C from A
$ git checkout -b C A
# hack hack
$ git commit -am "commit on branch C"

# go back to branch A
$ git checkout A
# hack hack
$ git commit -am "commit on branch A"

así que ahora hay tres ramas separadas (a saber, AB y C) con diferentes cabezas

para que los cambios de B y C vuelvan a A, desproteja A (ya realizado en este ejemplo) y luego use el comando de combinación:

# create an octopus merge
$ git merge B C

su historial se verá así:

…-o-o-x-------A
      |\     /|
      | B---/ |
       \     /
        C---/

si desea fusionarse a través de los bordes del repositorio / computadora, eche un vistazo al git pullcomando, por ejemplo, desde la PC con la rama A (este ejemplo creará dos nuevas confirmaciones):

# pull branch B
$ git pull ssh://host/… B
# pull branch C
$ git pull ssh://host/… C
knittl
fuente
eso significa que ambas ramas cambiaron la misma pieza de código. arreglar los conflitcs, git add conflicting_filesy luegogit commit
knittl
Digamos que el archivo en A contenía la palabra "hola", la A lo modificó a "HOLA" y B lo modificó a "Hola mundo". ¿Cuál sería el resultado de fusionar estos archivos?
dotty
Vaya, quiero decir que B lo modificó y C lo modificó.
dotty
tenga cuidado con la palabra 'enmendar' que significa algo diferente en git (cambio de confirmaciones existentes). cambiar un archivo 'hola' a 'HOLA' en un lado y 'Hola mundo' en el otro lado dará como resultado un conflicto de fusión
knittl
19
@dotty: Si bien git a menudo parece mágico, en realidad no puede leer tu mente: si dos ramas hacen dos cambios diferentes en el mismo contenido, solo un humano puede descubrir cómo reconciliarlos. Eso es lo que es un conflicto de fusión.
Cascabel
47

Si desea fusionar cambios en SubBranch a MainBranch

  1. deberías estar en MainBranch git checkout MainBranch
  2. luego ejecute el comando de fusión git merge SubBranch
Mohamed Shaban
fuente
2
@luckytaxi: De acuerdo, a veces menos es más
Marcelo Scofano
¿Puedo deshacer esto?
Yohanelly
0

Caso: si necesita ignorar la confirmación de fusión creada por defecto , siga estos pasos.

Digamos, una nueva rama de características se extrae del maestro que ya tiene 2 confirmaciones,

  • "Agregado A", "Agregado B"

Checkout a new feature_branch

  • "Agregado C", "Agregado D"

La rama de características luego agrega dos confirmaciones ->

  • "Agregado E", "Agregado F"

ingrese la descripción de la imagen aquí

Ahora, si desea fusionar los cambios de feature_branch a master, git merge feature_branchsiéntese en el master.

Esto agregará todos los commits en la rama maestra (4 en master + 2 en feature_branch = total 6) + un commit de fusión adicional similar a 'Merge branch 'feature_branch' 'a medida que el master se diverge .

Si realmente necesita ignorar estas confirmaciones (las realizadas en FB) y agregar todos los cambios realizados en feature_branch como una única confirmación como 'Integrated feature branch changes into master' , Ejecutargit merge feature_merge --no-commit .

Con --no-commit, realiza la fusión y se detiene justo antes de crear una confirmación de fusión. Tendremos todos los cambios agregados en la rama de características ahora en master y tendremos la oportunidad de crear una nueva confirmación como nuestra.

Lea aquí para más información: https://git-scm.com/docs/git-merge

kisHoR
fuente