2010-10-13 9 views
93

Soy un poco nuevo en la función de rebase total dentro de git. Digamos que hice realizan los siguientes:¿Cómo compruebo dos confirmaciones no consecutivas?

A -> B -> C -> D 

Después, se dan cuenta de que D contiene una corrección que depende de algún nuevo código añadido en A, y que estas confirmaciones van de la mano. ¿Cómo puedo aplastar A & D juntos y dejar B & C solo?

Respuesta

120

Puede ejecutar git rebase --interactive y reordenar D antes de que B y D en la calabaza A.

Git se abrirá un editor, y ves un archivo de la siguiente manera:

pick aaaaaaa Commit A 
pick bbbbbbb Commit B 
pick ccccccc Commit C 
pick ddddddd Commit D 

# Rebase aaaaaaa..ddddddd onto 1234567 (4 command(s)) 
# 
# Commands: 
# p, pick = use commit 
# r, reword = use commit, but edit the commit message 
# e, edit = use commit, but stop for amending 
# s, squash = use commit, but meld into previous commit 
# f, fixup = like "squash", but discard this commit's log message 
# x, exec = run command (the rest of the line) using shell 
# 
# These lines can be re-ordered; they are executed from top to bottom. 
# 
# If you remove a line here THAT COMMIT WILL BE LOST. 
# 
# However, if you remove everything, the rebase will be aborted. 
# 
# Note that empty commits are commented out 

Ahora se cambia el archivo que se parece a esto:

pick aaaaaaa Commit A 
squash ddddddd Commit D 
pick bbbbbbb Commit B 
pick ccccccc Commit C 

y git ahora fusionar los cambios de A y D juntos en un compromiso, y poner B y C después. Cuando no desee conservar el mensaje de compromiso de D, también puede usar la palabra clave "corregir".

+3

Inicialmente, lo leí como "rebase D en A, squash D en A, luego rebase B en DA". La respuesta no deja claro que esto se puede hacer reordenando líneas en un editor de texto. –

-1

$ git checkout master

registro $ git --oneline

D 
C 
B 
A 

$ git rebase --onto CABEZA CABEZA ^^^^

$ git log --oneline

D 
A 
+0

Creo que te refieres a '--oneline'? Y parece que has dejado caer 'C' y' B', que no es lo que el OP estaba intentando. – bstpierre

+0

No funcionó para mí. Movió tanto mi HEAD como mi master hasta A, pero no fusionó D en A ('git show A') y D, C y B se perdieron en mi ref-log. Tuve que 'git rebase D' para volver. – Nate

38

Nota: Debería no cambiar las confirmaciones que se han enviado a otro repositorio de cualquier manera a menos que conozca el consequences.

git log --oneline -4

D commit_message_for_D 
C commit_message_for_C 
B commit_message_for_B 
A commit_message_for_A 

git rebase --interactive

pick D commit_message_for_D 
pick C commit_message_for_C 
pick B commit_message_for_B 
pick A commit_message_for_A 

Tipo i (VIM Poner en modo de inserción)

Cambiar la lista para el siguiente aspecto (Usted no tiene que quitar o incluir el mensaje de confirmación). ¡No escriba mal squash!:

pick C commit_message_for_C 
pick B commit_message_for_B 
pick A commit_message_for_A 
squash D 

Tipo Esc continuación ZZ (Guardar y salir VIM)

# This is a combination of 2 commits. 
# The first commit's message is: 

commit_message_for_D 

# This is the 2nd commit message: 

commit_message_for_A 

Tipo i

cambiar el texto a lo que quiere el nuevo mensaje de registro para que parezca.Recomiendo esto sea una descripción de los cambios en cometer A y D:

new_commit_message_for_A_and_D 

Tipo Esc continuación ZZ

git log --oneline -4

E new_commit_message_for_A_and_D 
C commit_message_for_C 
B commit_message_for_B 

git show E

(You should see a diff showing a combination of changes from A and D) 

Ha creado una nueva confirmación E. Los commits A y D ya no están en su historial, pero no desaparecen. Todavía puede recuperarlos en este momento y por un tiempo por git rebase --hard D (git rebase --hard destruirá cualquier cambio local!).

3

Para aquellos que utilizan SourceTree:

Asegúrese de que no lo ha empujado a las confirmaciones.

  1. Repository> Interactivo Rebase ...
  2. Arrastre D (la más reciente commit) sea directamente por encima de A (cometer el más antiguo)
  3. Tras confirmar que cometen D se destacó
  4. Haga clic Squash with previous
Cuestiones relacionadas