¿Cómo puedo combinar dos confirmaciones en una?

99

Tengo una rama 'primer proyecto' con 2 confirmaciones. Quiero deshacerme de estas confirmaciones y hacer que aparezcan como una única confirmación.

El comando git merge --squashsuena prometedor, pero cuando ejecuto git merge --squashmi terminal solo aparecen opciones para el comando. ¿Cuál es el comando correcto?

Commit 1:
Added 'homepage.html'
Added 'contacts.html'

Commit 2:
Added 'homepage.php'
Added 'homepage.php'
Deleted 'homepage.html'
Deleted 'contacts.html'
Don P
fuente
No creo que ese sea el comando correcto. Además, dudo que puedas cambiar confirmaciones como esa.
BSull
No, puedes cambiar múltiples confirmaciones en una sola confirmación: git-scm.com/book/en/Git-Tools-Rewriting-History mi pregunta es solo sobre el comando específico para ello.
Don P
@BSull Absolutamente puedes cambiar las confirmaciones de la forma que quieras. Son completamente editables literalmente en cualquier momento. Si está compartiendo código con otros, hacerlo reescribirá su historial y estará trabajando efectivamente con una rama diferente a la de los demás.
meagar
Esto nunca debería haber sido engañado. De hecho, ese otro debería haberse cerrado por ser demasiado amplio. La otra pregunta de la que esto se marca como una trampa es innecesariamente compleja, ya que implica abandonar un rebase anterior.
Evan Carroll

Respuestas:

134

Quiere git rebase -irealizar una rebase interactiva .

Si actualmente está en su "compromiso 1", y el compromiso que desea fusionar, "compromiso 2", es el compromiso anterior, puede ejecutarlo git rebase -i HEAD~2, lo que generará un editor que enumera todas las confirmaciones que atravesará la rebase. Debería ver dos líneas que comienzan con "elegir". Para continuar con el aplastamiento, cambie la primera palabra de la segunda línea de "recoger" a "aplastar". Luego guarde su archivo y salga. Git aplastará tu primera confirmación en tu penúltima confirmación.

Tenga en cuenta que este proceso reescribe el historial de su sucursal. Si está empujando su código en alguna parte, tendrá que hacerlo git push -fy cualquiera que comparta su código tendrá que pasar por algunos obstáculos para realizar sus cambios.

Tenga en cuenta que si las dos confirmaciones en cuestión no son las dos últimas confirmaciones en la rama, el proceso será ligeramente diferente.

meagar
fuente
2
¿Cómo hacer Then write your file, and quit? Estoy usando Android Studio Terminal, la propia consola git O incluso la consola git abierta por el software SourceTree. Pero, ¿cómo ahorrar y dejar de fumar?
Dr.jacky
1
¿Cómo combinar 2 confirmaciones que no son las dos últimas confirmaciones en la rama?
Weishi Zeng
1
@meagar, creo que tiene sentido ... si marca este problema (un duplicado de esto), aplastar la 'dirección' marcó una gran diferencia y fue la raíz de todo el problema (vea el primer comentario con alrededor de 200 votos positivos sobre ' aplastando de la manera incorrecta ') - stackoverflow.com/a/2568581/43453
PandaWood
1
@PandaWood Estás leyendo mal la respuesta. La primera forma fue simplemente incorrecta , no diferente . Puede solamente hacia atrás de squash, no tiene sentido pensar en aplastar a un viejo se comprometen en una más reciente, pero si pudiera sería la misma operación.
meagar
1
Entendí hasta "cambiar la primera palabra de la segunda línea" - ¿segunda línea de qué?
Andrew Torr
70

Versión simple y perezosa para olvidadizos como yo:

git rebase -i HEAD~3 o tantas confirmaciones en lugar de 3.

Convierte esto

pick YourCommitMessageWhatever
pick YouGetThePoint
pick IdkManItsACommitMessage

dentro de esto

pick YourCommitMessageWhatever
s YouGetThePoint
s IdkManItsACommitMessage

y hacer algo de acción en el que golpea esca continuación enterpara guardar los cambios. [1]

Cuando aparezca la siguiente pantalla, deshazte de esas # líneas basura [2] y crea un nuevo mensaje de confirmación o algo así, y haz la misma escape enteracción. [1]

Vaya, tienes menos confirmaciones. O simplemente rompiste todo.


[1] - o lo que sea que funcione con tu configuración de git. Esta es solo una secuencia que es eficiente dada mi configuración.

[2] - Verás algunas cosas como # this is your n'th commitalgunas veces, con tus confirmaciones originales justo debajo de este mensaje. Desea eliminar estas líneas y crear un mensaje de confirmación para reflejar las intenciones de las n confirmaciones que está combinando en 1.

Stachu
fuente
Solución muy concisa, gracias. Podría ser útil delinear lo que saquí se usa significa calabaza. Para usar el compromiso, pero fusionarlo con el compromiso anterior
UrbanConor
Si acaba de realizar 2confirmaciones y desea combinar la misma 2confirmación, deberá ejecutar git reset --soft HEAD~y git commit --amend.
scrutari
22
  1. Verifique su rama y cuente la cantidad de todas sus confirmaciones.
  2. Abra git bash y escriba: git rebase -i HEAD~<quantity of your commits>(es decir git rebase -i HEAD~5)
  3. En el txtarchivo abierto , cambie la pickpalabra clave a squashpara todas las confirmaciones, excepto la primera confirmación (que está en la parte superior). Para el primero, cámbielo a reword(lo que significa que proporcionará un nuevo comentario para este compromiso en el siguiente paso) y haga clic en GUARDAR. Si está en vim, presione, escluego guarde ingresando wq!y presione enter.
  4. Proporcionar comentario.
  5. Abra Git y haga "Obtener todo" para ver los nuevos cambios.

Hecho

usuario5820972
fuente
El primero me dice la forma de usarlo en vim. Muchas gracias
Ho Luong