git - crear - ¿Cómo usar el rebase interactivo en el primer commit(raíz) de una rama?
git rebase (2)
Desea volver a la base de la confirmación de la raíz de su rama master
. Más específicamente, para aplastar los dos compromisos, necesitas ejecutar
git rebase -i --root
y luego sustituye a squash
por la pick
en la segunda línea en el búfer del editor que aparece:
pick 123456 a
squash abcdef b
Te remito a la página git-rebase
para más detalles sobre esa bandera:
--root
Cambie de base todas las confirmaciones accesibles desde
<branch>
, en lugar de limitarlas con una<upstream>
. Esto le permite reajustar la (s) confirmación (es) raíz en una rama. [...]
Ejemplo de rebase interactiva de la raíz.
# Set things up
$ mkdir testgit
$ cd testgit
$ git init
# Make two commits
$ touch README
$ git add README
$ git commit -m "add README"
$ printf "foo/n" > README
$ git commit -am "write ''foo'' in README"
# Inspect the log
$ git log --oneline --decorate --graph
* 815b6ca (HEAD -> master) write ''foo'' in README
* 630ede6 add README
# Rebase (interactively) the root of the current branch:
# - Substitute ''squash'' for ''pick'' on the second line; save and quit the editor.
# - Then write the commit message of the resulting commit; save and quit the editor.
$ git rebase -i --root
[detached HEAD c9003cd] add README; write ''foo'' in README
Date: Sat May 16 17:38:43 2015 +0100
1 file changed, 1 insertion(+)
create mode 100644 README
Successfully rebased and updated refs/heads/master.
# Inspect the log again
$ git log --oneline --decorate --graph
* c9003cd (HEAD -> master) add README; write ''foo'' in README
Si estoy en la siguiente situación,
$ git log --oneline
* abcdef commit #b
* 123456 commit #a
Sé que siempre puedo correr
$ git reset HEAD~
$ git commit --amend
Sin embargo, traté de correr
$ git rebase -i HEAD~2
pero tengo
fatal: Needed a single revision
invalid upstream HEAD~2
Por lo tanto, mi pregunta: ¿hay una manera de usar git rebase
para aplastar estos dos compromisos o no?
Parece que este parámetro puede ayudar:
--root
Cambie de base todas las confirmaciones accesibles desde <branch>, en lugar de limitarlas con una <upstream>. Esto le permite reajustar la (s) confirmación (es) raíz en una rama.
Esto debería permitirle aplastar (supongo que realmente quiere arreglar) su segundo commit en el primero:
git rebase --root -i
Tenga cuidado al entender lo que hace la opción --root, porque en su caso responde a sus necesidades, pero puede ser complicado, por ejemplo, cuando se usa en ramas, ya que se rebautizará al ancestro más lejano en la historia al que se puede acceder (es decir, el raíz del árbol); por lo que rebase --root
rebase z
en a
ABDEXYZ
través de:
master A-B-C
/
upstream D-E
/
current branch X-Y-Z