Nie rozumiem, jak używać git-rebasei 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.gitpobiegłem
$ git init --bare
Aby połączyć się repoz bare.gittym, 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ć masteri zmienić coś tam:
$ echo "change foo" > foo
$ git commit -a -m "changed foo in master"
$ git push
W tym momencie masterplik foozawiera zmienione foo , podczas gdy w b1nim jest jeszcze witaj świecie . Wreszcie chcę zsynchronizować b1z postępem dokonanym w master.
$ git checkout b1
$ git fetch origin
$ git rebase origin/master
W tym momencie git stzwraca:
# 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ść foow branży b1jest 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/masteri mastersą aktualizowane, mam rebase origin/b1na origin/master, a następnie zrobić git pullgdy b1jest wyrejestrowany wyciągnąć rebase do lokalnego repozytorium?
git pulli nigdy nie opierasz zdalnej gałęzi (np. origin/master) Na czymkolwiek innym.
origin/b1i b1nie 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 sttego jest to, że git wie, że twój lokalnyb1oddział śledziorigin/b1, więc na tym chcesz się opierać. Uciekłeśgit rebase origin/masterchociaż, więc rebased ( „odtwarzane”) swojeb1rewizje na górzeorigin/master.