2012-04-14 8 views
29

Estoy colaborando trabajando en un proyecto con alguien, así que decidimos usar git. Desafortunadamente, con frecuencia código en lugares sin Internet, por lo que terminamos con algo como esto:¿Por qué Git creó un commit de fusión sin cambios en el archivo?

origin/master: A---B---C 
         \ 
mylocalmaster:   D---E---F 
         \ 
hismaster:    G---H---I 

Ahora, decir que empuja sus compromete y pone esto:

origin/master: A---B---C---G---H---I 
         \ 
master (local):   D---E---F 

Todo lo que quiero hacer es empujar mis compromete a conseguir esto en tanto mi repo local y la línea uno:

A---B---C---D---E---F---G---H---I 

parece que funciona cuando lo haga git push, pero el problema surge cuando lo haga git fetch y luego git merge. Todo lo que intento hacer es obtener sus commits en mi repositorio local, pero termino con un commit de fusión diciendo algo como Merge remote-tracking branch 'origin/master' como su mensaje.

No quiero tener esta confirmación inútil, ya que no hay código conflictivo en en nuestras confirmaciones. Estamos trabajando en archivos completamente diferentes, por lo que no hay ninguna razón para tener este compromiso. ¿Cómo puedo evitar que git cree este commit de fusión?

+1

Cuando haces un git push en esa situación, deberías estar recibiendo un error. No debería funcionar bien. – bames53

+0

Desde que llegué a esta página tratando de aprender cómo * forzar * git para crear una confirmación de fusión sin ningún cambio de archivo, mencionaré aquí que la respuesta a eso es el comando 'git commit-tree'. Ver 'man git-commit-tree'. – Wildcard

+0

@Wildcard Por curiosidad, ¿en qué situación le gustaría crear una combinación de fusión que 'git merge --no-ff' no resolvería? –

Respuesta

29

puede omitirse la creación de combinación se compromete, mediante el uso de rebase en lugar de fusionar.

Como dijo @Dougal, si lo hace git fetch, puede ejecutar git rebase luego para cambiar la base de sus cambios a HEAD.

Por lo general, usted crea esos commit de fusión no deseados, tirando desde el repositorio remoto. En ese caso se puede añadir --rebase opción:

git pull --rebase 

o añadir la opción adecuada para Git archivo de configuración (localmente):

git config branch.<branch-name-here>.rebase true 

o para todos los nuevos repositorios y ramas:

git config branch.autosetuprebase always --global 

Sin embargo, la creación de bases de datos crea una historia más limpia y lineal es bueno crear confusiones de fusión, donde hay un cambio masivo s en ambas ramas (use git merge para hacerlo).

+0

Y la respuesta para su primera pregunta: ¿por qué? Las asignaciones de mezcla se crean de forma predeterminada para evitar confusiones para los recién llegados a Git, porque esta es la situación conceptualmente más simple y las personas esperan tener confusiones de fusión cuando se fusionan. –

+2

No quiero crear estos commits porque no estoy fusionando nada. Si dejo que git cree un millón de estos commits que no hacen nada, simplemente obstruirán mi historial de commit sin ningún motivo. –

+5

Bueno, en realidad se requieren compromisos de fusión en este caso debido al modelo de datos de git. Un hash de confirmación incluye conocimiento sobre todos sus compromisos principales. Esto, una vez que cambias una confirmación en la fila de confirmaciones, todas las siguientes confirmaciones obtienen un nuevo hash: se vuelven diferentes de lo que eran originalmente. La combinación de fusión toma los commits sin cambios y hace referencia a ambas líneas (por lo tanto, tiene dos padres). Si rebase, cambia sus confirmaciones para hacer referencia directamente a las confirmaciones remotas como sus padres. Esto no tiene nada que ver con las diferencias reales, pero solo con el seguimiento del historial. –

9

Use git rebase (después de git fetch) para que sus confirmaciones se apliquen contra las suyas en lugar de contra el maestro anterior. Es decir, para ir al ABCGHIDEF en su ejemplo. (No se puede hacer ABCDEFGHI sin tener que hacer un push -f, porque ya está en ABCGHIorigin/master y que tendría que reemplazar eso.)

+0

Gracias. Sabía que era algo así de tonto, pero no sabía muy bien qué. –

Cuestiones relacionadas