Estoy fallando en entender como usar git-rebase
, y considero el siguiente ejemplo.
Vamos a empezar un repositorio en ~/tmp/repo
:
$ git init
Luego agrega un archivo foo
$ echo "hello world" > foo
que luego se agrega y se compromete:
$ git add foo
$ git commit -m "Added foo"
A continuación, comencé un repositorio remoto. En ~/tmp/bare.git
corrí
$ git init --bare
Para enlazar repo
a bare.git
corrí
$ git remote add origin ../bare.git/
$ git push --set-upstream origin master
A continuación, vamos a la rama, agregue un archivo y establezca un flujo ascendente para la nueva rama b1
:
$ git checkout -b b1
$ echo "bar" > foo2
$ git add foo2
$ git commit -m "add foo2 in b1"
$ git push --set-upstream origin b1
Ahora es el momento de volver a master
y cambiar algo allí:
$ echo "change foo" > foo
$ git commit -a -m "changed foo in master"
$ git push
En este punto en master
el archivo foo
Contiene cambiado foo , mientras en b1
aún es Hola Mundo . Finalmente, quiero sincronizar. b1
con el progreso realizado en master
.
$ git checkout b1
$ git fetch origin
$ git rebase origin/master
En este punto git st
devoluciones:
# On branch b1
# Your branch and 'origin/b1' have diverged,
# and have 2 and 1 different commit each, respectively.
# (use "git pull" to merge the remote branch into yours)
#
nothing to commit, working directory clean
En este punto el contenido de foo
en la rama b1
es cambiar foo también. Entonces, ¿qué significa esta advertencia? Esperaba que hiciera una git push
, Git sugiere hacer git pull
... De acuerdo a esta respuesta , esto es más o menos eso, y en su comentario @FrerichRaabe dice explícitamente que no necesito hacer un tirón. ¿Que está pasando aqui? ¿Cuál es el peligro, cómo se debe proceder? ¿Cómo debe mantenerse la historia consistente? ¿Cuál es la interacción entre el caso descrito anteriormente y la siguiente cita:
No vuelva a marcar las confirmaciones que haya enviado a un repositorio público.
tomado de libro pro git .
Supongo que está relacionado de alguna manera, y si no me encantaría saber por qué. ¿Cuál es la relación entre el escenario anterior y el procedimiento que describí? en este post .
origin/master
y master
se actualizan, debería rebase origin/b1
en origin/master
y luego hacer git pull
cuando b1
¿Se verifica para extraer el rebase al repositorio local?
git pull
y nunca rebasa una rama remota (por ejemplo, origin/master
) en cualquier otra cosa.
origin/b1
y b1
no son lo mismo. Esto es bastante obvio, pero ¿cuál es la forma correcta de solucionarlo? ¿O arreglarlo significa desordenar la historia como se explicó @heavyd?
git st
Da esa salida porque Git sabe que tu local.b1
rama está siguiendoorigin/b1
, así que eso es lo que quieres reajustar. Tu corresgit rebase origin/master
Sin embargo, por lo que ha vuelto a basar ("repetido") sub1
cometer encima deorigin/master
.