2010-09-02 18 views
25

situación actual:git: reescribir la historia: cambiar el orden de combinación y se compromete

origin/mybranch --- A1 --- B1 --- A2 --- B2 --- A3 --- B3 mybranch 

Quiero limpiar que la historia hacia arriba (A1 a B3), esp. ya que no lo he empujado a ningún lado todavía y porque quiero preparar un parche que solo los B *.

Lo que quiero es:

origin/mybranch --- A1+A2+A3 --- B1+B2+B3 mybranch 

probablemente no vuelva a empujar esto en absoluto (o si lo haré, sólo el B resumió *, debo quitar el A * se compromete en absoluto) y mientras estoy trabajar más en esto, que podría conseguir este tipo de confirmaciones adicionales, es decir, como esto:

origin/mybranch --- A1+A2+A3 --- B1+B2+B3 --- A4 --- B4 mybranch 

Y quiero volver a escribir que, de nuevo como anteriormente.

No solo quiero saber algún método para hacer esto (porque podría obtener algo parecido a algo hacky), estoy especialmente. preguntando aquí la forma correcta/mejor/más limpia/más fácil de hacer esto.


Lo que estoy haciendo esp. es: estoy trabajando en la rama oficial xorg-xserver-1.7 y quiero preparar un parche (B *). Como deseo poder reemplazar mi xserver auto compilado con el sistema uno por un simple propósito de prueba, he aplicado muchos parches Debian/Ubuntu (A *). Sin embargo, cuando publique ese parche en alguna parte, quiero excluirlos.

+1

Esta referencia desde el git pro libro es de utilidad (reescribir la historia GIT) . http://git-scm.com/book/ch6-4.html – Rimian

Respuesta

30

Quiere hacer un interactive rebase.

La primera cosa que me gusta hacer al probar los comandos de Git es hacer una copia de seguridad de mi sucursal:

$ git branch my-backup-branch 

Digamos que su A1 cometer tiene un hash de 152274b. Prueba esto:

$ git rebase -i 152274b^ 

ese comando, se abrirá su editor (por lo general vim) con algo como esto:

pick 152274b A1 
pick 14b0838 B1 
pick 661b993 A2 
pick a6510db B2 
pick 557e171 A3 
pick 85da0e4 B3 

# Rebase 39a47e4..85da0e4 onto 39a47e4 
# 
# Commands: 
# p, pick = use commit 
# e, edit = use commit, but stop for amending 
# s, squash = use commit, but meld into previous commit 
# 
# If you remove a line here THAT COMMIT WILL BE LOST. 
# However, if you remove everything, the rebase will be aborted. 
# 

Desde aquí se puede cambiar el orden de las confirmaciones, eliminarlos por completo e incluso de squash ellos. En este ejemplo, es probable que desee mover y squash como este:

pick 152274b A1 
squash 661b993 A2 
squash 557e171 A3 
pick 14b0838 B1 
squash a6510db B2 
squash 85da0e4 B3 

Pruébalo. Si al final en un estado que no querías, siempre se puede volver al estado que guardó en el refuerzo de la rama:

$ git reset --hard my-backup-branch 
+2

¡Guau, eso fue fácil! :) Tan natural, elegante y perfecto. – Albert

Cuestiones relacionadas