Nie rozumiem, jak używać git-rebase
i rozważam następujący przykład.
Zacznijmy repozytorium w ~/tmp/repo
:
$ git init
Następnie dodaj plik foo
$ echo "hello world" > foo
który jest następnie dodawany i zatwierdzany:
$ git add foo
$ git commit -m "Added foo"
Następnie uruchomiłem zdalne repozytorium. W ~/tmp/bare.git
pobiegłem
$ git init --bare
Aby połączyć się repo
z bare.git
tym, pobiegłem
$ git remote add origin ../bare.git/
$ git push --set-upstream origin master
Następnie pozwala rozgałęzić, dodać plik i ustawić upstream dla nowego oddziału b1
:
$ git checkout -b b1
$ echo "bar" > foo2
$ git add foo2
$ git commit -m "add foo2 in b1"
$ git push --set-upstream origin b1
Teraz nadszedł czas, aby wrócić master
i zmienić coś tam:
$ echo "change foo" > foo
$ git commit -a -m "changed foo in master"
$ git push
W tym momencie master
plik foo
zawiera zmienione foo , podczas gdy w b1
nim jest jeszcze witaj świecie . Wreszcie chcę zsynchronizować b1
z postępem dokonanym w master
.
$ git checkout b1
$ git fetch origin
$ git rebase origin/master
W tym momencie git st
zwraca:
# 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
W tym momencie zawartość foo
w branży b1
jest zmiana foo również. Co oznacza to ostrzeżenie? Spodziewałem się, że powinienem zrobić git push
, git sugeruje zrobić git pull
... Zgodnie z tą odpowiedzią , to mniej więcej tak, aw swoim komentarzu @FrerichRaabe wyraźnie mówi, że nie muszę tego robić. Co tu się dzieje? Jakie jest niebezpieczeństwo, jak należy postępować? Jak zachować spójność historii? Jaka jest wzajemna zależność między przypadkiem opisanym powyżej a następującym cytatem:
Nie zmieniaj baz danych, które zostały przekazane do publicznego repozytorium.
zaczerpnięte z książki pro git .
Myślę, że jest to jakoś powiązane, a jeśli nie, chciałbym wiedzieć, dlaczego. Jaki jest związek między powyższym scenariuszem a procedurą opisaną w tym poście .
origin/master
i master
są aktualizowane, mam rebase origin/b1
na origin/master
, a następnie zrobić git pull
gdy b1
jest wyrejestrowany wyciągnąć rebase do lokalnego repozytorium?
git pull
i nigdy nie opierasz zdalnej gałęzi (np. origin/master
) Na czymkolwiek innym.
origin/b1
i b1
nie są takie same. Jest to raczej oczywiste, ale jaki jest właściwy sposób, aby to naprawić? Czy też naprawienie go oznacza zepsucie historii, jak wyjaśnił @heavyd?
git st
tego jest to, że git wie, że twój lokalnyb1
oddział śledziorigin/b1
, więc na tym chcesz się opierać. Uciekłeśgit rebase origin/master
chociaż, więc rebased ( „odtwarzane”) swojeb1
rewizje na górzeorigin/master
.