¿Cuál es la diferencia entre "git reset" vs "git rebase"?

He estado jugando con git (aún muy novato) y quería saber la diferencia entre "reiniciar" y "rebase". ¿Es el uno más poderoso que el otro?

Digamos que quería eliminar los 3 commits en negrita del historial, ¿cuál será mejor usar, o debería labelrlo y luego eliminarlo con la git tag -d <tagname> ?

17a64df 2012-06-21 | Hola usa style.css (HEAD, origen / estilo, master),
a6792e4 2012-06-21 | Hoja de estilo css añadida
801e13e 2012-06-21 | Se agregó README
5854339 2012-06-21 | Se agregó index.html
0b1dd4c 2012-06-21 | Se movió hello.html a lib
55649c3 2012-06-21 | Agregar un comentario de autor / correo electrónico
9b2f3ce 2012-06-21 | Se agregó un comentario de autor
cdb39b0 2012-06-21 | Commit p tags con text (v1.1)
b7b5fce 2012-06-21 | Esto revierte commit a6faf60631b5fbc6ee79b52a1bdac4c971b69ef8.
a6faf60 2012-06-21 | Revertir "Vaya, no queríamos este compromiso"
a006669 2012-06-21 | Ups, no queríamos que este compromiso
262d1f7 2012-06-21 | Se agregó el encabezado HTML (v1)
b1846e5 2012-06-21 | Se agregaron tags de página HTML estándar (v1-beta)
bf1131e 2012-06-21 | Se agregó HI TAG
02b86d0 2012-06-21 | Primer compromiso

Ellos son completamente diferentes. git-reset funciona con references, en su directory de trabajo y en el índice, sin tocar ningún object de confirmación (u otros objects). git-rebase otro lado, git-rebase se usa para reescribir objects de commit previamente hechos.

Entonces, si quieres reescribir el historial, git-rebase es lo que quieres. Tenga en count que nunca debe reescribir el historial que fue enviado y que estuvo disponible para otra persona, ya que el reescritura reescribe los objects haciéndolos incompatibles con los objects antiguos, lo que resulta en un desastre para cualquier otra persona involucrada.

Una vez dicho esto, lo que quieres hacer es un reajuste interactivo . git rebase -i 262d1f7 usando git rebase -i 262d1f7 y deberías get un post como este:

 pick 262d1f7 Added HTML header (v1) pick a006669 Oops, we didn't want this commit pick a6faf60 Revert "Oops, we didn't want this commit" pick b7b5fce This reverts commit a6faf60631b5fbc6ee79b52a1bdac4c971b69ef8. pick cdb39b0 Commit p tags with text (v1.1) pick 9b2f3ce Added an author comment pick 55649c3 Add an author/email comment pick 0b1dd4c Moved hello.html to lib pick 5854339 Added index.html pick 801e13e Added README pick a6792e4 Added css stylesheet pick 17a64df Hello uses style.css (HEAD, origin/style, master), 

Allí, simplemente borre las líneas para las confirmaciones que desea eliminar, guarde y salga del editor y Git reescribirá su historial. De nuevo, no hagas esto si ya presionaste los cambios. En general, tener tales compromisos en la historia está perfectamente bien.

Aunque esto no compara las diferencias entre los dos, aquí hay un excelente artículo explicando rebase que es fácil de entender.