2011-06-17 19 views
6

Tengo problemas para entender cómo funciona una fusión de git en términos de las confirmaciones creadas por el proceso de fusión. He leído las secciones relevantes en pro git y el libro de la comunidad git, pero todavía estoy confundido.¿Cómo maneja git commits en una combinación?

Considere este escenario: Tengo un "origen" repositorio git:

  master 
      | 
a0--a1--a2--a3 
    \ 
    -b0--b1 
     | 
     branch2 

I clonar este repo a un acuerdo de recompra local y luego trabajar solamente en el repositorio local. En branch2, hice un "maestro de combinación git". Ahora mi repo local, se ve así:

 master/origin/master 
      | 
a0--a1--a2--a3 
    \   \ 
    -b0--b1-----merge 
     |  | 
    origin/branch2 |  
       branch2 

Así la fusión creados 1 cometen, "fusionar", después de que el "b1" comprometerse. "Git log" para BRANCH2 muestra la gráfica esperada:

> git log branch2 --graph --pretty=oneline --decorate 
* a7b69fc6759e1dd5463bab379ce101a6ad026c7b (HEAD, branch2) Merge branch 'master' into branch2 
|\ 
| * 482e4026f05e33395a9fc3c87f50a746f692406a (origin/master, origin/HEAD, master) a3 
| * 8de57bdea2d316073af3b7055f8c28c56004ce94 a2 
| * 1e991047996aad269f2c01b9a0b9a7d8293096a1 a1 
* | 99955f66843df51fb9d40c7797156c32cad57415 (origin/branch2) b1 
* | 30ca9b6363558322f2bb7810d75cda0d9c2ba3e0 b0 
|/ 
* 76a7c6d0eb54a9580841115ff2c3429360ab2ac9 a0 

Además, si voy a cometer uno antes de que el actual jefe, llego a la b1 cometer, como se esperaba. (siga la línea branch2 en el gráfico y retroceda 1 commit)

> git log branch2~ --graph --pretty=oneline --decorate 
* 99955f66843df51fb9d40c7797156c32cad57415 (origin/branch2) b1 
* 30ca9b6363558322f2bb7810d75cda0d9c2ba3e0 b0 
* 76a7c6d0eb54a9580841115ff2c3429360ab2ac9 a0 

Aquí viene mi confusión. Todavía no he llevado mis cambios al origen, pero cuando hago un "estado de git", git dice que mi branch2 local está por delante del origen/branch2 por 4 commits. Pensé que la fusión solo dio como resultado 1 nueva confirmación de "fusión", como se ve en el gráfico/diagramas anterior. ¿Por qué 4?

> git status 
# On branch branch2 
# Your branch is ahead of 'origin/branch2' by 4 commits. 
# 
nothing to commit (working directory clean) 

Además, haciendo un "git log" de origen/BRANCH2 a BRANCH2 4 muestra el cometa en lugar de la 1 que esperaba (pasando de "B1" a "fusionar").

> git log origin/branch2..branch2 --graph --pretty=oneline --decorate 
* a7b69fc6759e1dd5463bab379ce101a6ad026c7b (HEAD, branch2) Merge branch 'master' into branch2 
* 482e4026f05e33395a9fc3c87f50a746f692406a (origin/master, origin/HEAD, master) a3 
* 8de57bdea2d316073af3b7055f8c28c56004ce94 a2 
* 1e991047996aad269f2c01b9a0b9a7d8293096a1 a1 

entiendo las 4 cometa, está el 3 de maestro (a1, a2, a3) que la fusión se supone que debe llevar a la rama 2, además de la "combinación" comprometerse. Pero, ¿por qué el gráfico no lo muestra de esa manera? Si lo hace, se vería así:

 master/origin/master 
      | 
a0--a1--a2--a3----------- 
    \      \ 
    -b0--b1--a1'--a2'--a3'--merge 
     |     | 
    origin/branch2   |  
         branch2 

Y branch2 ~ me llevaría a a3 'en lugar de b1.

Gracias de antemano por cualquier ayuda.

+0

a1, a2, a3 y merge simplemente no son parte de origin/branch2, es por eso que le tiró 4 commits. –

+0

Si desea tener los cambios de la combinación como una única confirmación, puede usar 'git merge --squash'. – hammar

Respuesta

6

Como se mencionó en "How to get the changes on a branch in git":

git log origin/branch2..branch2 

significa: todas las confirmaciones de branch2 (referencia positiva), que no están en origin/branch2 (referencia negativa)
(En las referencias positivas y negativas, véase "Difference in 'git log origin/master' vs 'git log origin/master..'")

en su caso, después de la fusión, que tienen 4 commit en branch2 (la local) que no están en origin/branch2: a1, a2, a3 y merge.

+0

Gracias por su rápida respuesta. Así que entendí mal dos cosas: 1) "Su sucursal está por delante de por x commits". significa que hay x commits en su rama actual que no existe en .Estos x commits NO significa que haya 4 commits entre su rama actual y en un gráfico de repositorio. 2) git log .. NO muestra las confirmaciones que pasaría cuando atravieso de a en un gráfico de repositorio. En cambio, se puede pensar que muestra una "diferencia" de las confirmaciones en el historial de y . – digitalsky

+0

@digitalsky: 'log' Git tiene un rango * * de la revisión, y se trata de caminar el gráfico de revisiones, a partir de la referencia positiva, que se remonta a través de la historia de la revisión, parando cuando se encuentra con las revisiones que son accesibles desde la referencia negativa . 'git diff' toma * dos * revisiones (no un rango de) y se trata de mostrar la diferencia entre esos dos. Excepto por 'diff A ... B' que se muestra en' B' ya que divergió de 'A'. – VonC

+0

@digitalsky: así cuatro su 1), la parte "por delante" es acerca de caminar hacia atrás el gráfico de revisiones, sabiendo que comete de otra rama, una vez que se funden con su sucursal local, son ahora accesibles desde dicha rama local. Para su 2), evitaría el término "diff";) – VonC

Cuestiones relacionadas