Estás en lo cierto que lo haces quiero aprovechar las facultades de fusión de git. Todavía hay algunas posibilidades. Lo más indicativo de lo que realmente sucedió es probablemente la combinación, pero un método que da como resultado una versión modificada de E
aplicada sobre D
tampoco es tan malo. ¡Hablemos de cómo hacer eso!
Si el parche contiene las manchas a las que se aplica (la salida de git format-patch
sí lo hace), entonces git am
es capaz de intentar una fusión de tres vías. Los registros burbuja SHA1 en un aspecto como este: diff
diff --git a/foo.txt b/foo.txt
index ca1df77..2c98844 100644
Si usted tiene que, estás de suerte. Simplemente use git am --3way <patch>
.Desafortunadamente, git am
requiere el encabezado de estilo de correo electrónico que produce el parche de formato, por lo que si el parche proviene de git diff
en lugar de git format-patch
, tiene que fallar un poco. Usted puede agregar usted mismo:
From: Bobby Tables <[email protected]>
Date: 2 Nov 2010
Subject: [PATCH] protect against injection attack
<original diff>
git am
debe ser capaz de trabajar con eso, y si no lo consigue todo exactamente cómo lo quería, siempre se puede git commit --amend
para solucionarlo. (También podría tratar de usar git apply --build-fake-ancestor=foo.txt <patch>
, pero en realidad no funciona de una manera fácil de usar. Creo engañar git am
es más fácil.)
Si el parche no contiene ningún SHA1s blob (es decir, la que fue creado diff, no es un comando git), otra vez, dile a tu amigo cómo usar git, y estoy seguro de que puedes todavía kludge it. ¡Sabes a qué versión de foo.txt se aplica el parche! Para obtener su SHA1 del compromiso B, use:
git ls-tree <SHA1 of B>:<directory containing foo.txt>
Será uno de los blobs de la lista. (Sé que hay una manera directa, pero no puedo pensar en eso ahora mismo). Luego puede agregar un encabezado falso de git diff. Supongamos que su hash es ABCDEF12:
diff --git a/foo.txt b/foo.txt
index abcdef12..
Git en realidad no necesita nada, pero esa primera almohadilla; aunque la salida de git diff tendría el hash final y un modo, am
no lo está buscando, así que puede salirse con la suya dejándolo. (Y sí, me acabo de probar esto, no había hecho esto antes.!)
Esto dará lugar a una historia como A - B - C - D - E'
, donde E'
es el parche de su amigo, pero aplicado a D
; es el resultado de una fusión tripartita entre el contenido en D
, B
y el parche de su amigo.
Por último, si usted no quiere ensuciar alrededor con nada de eso, se puede hacer lo que usted ha dicho:
git checkout -b bobby <SHA1 of B>
# apply the patch
git commit --author="Bobby Tables <[email protected]>"
git checkout master
git merge bobby
# or `git cherry-pick bobby` to grab the single commit and apply to master
# or `git rebase bobby master` to rebase C and D onto B
+1 para una buena respuesta, y por hacerme reír sobre "Tablas Bobby < [email protected]> ":) –