Problem z GIT-em

Przepraszam, że nie za bardzo w temacie, ale znaczna część programistów Ruby/RoR ma styczność z tym systemem kontroli wersji i być może ktoś z Was będzie w stanie poratować mnie poradą, bo próżno szukać pomocy o GIT w polskim internecie :frowning:

Posiadam lokalne repozytorium do którego przyłączyłem dwa zdalne repozytoria poprzez:

git remote add heroku git@heroku.com:appname.git
git remote add origin git@github.com:user/appname.git

Wykonałem pierwszy commit, wysłałem na oba repozytoria zmiany poprzez polecenie “git push heroku master” i “push origin master” i tutaj wszystko było ok. To samo wykonał mój znajomy, który również do swojego lokalnego repozytoria przyłączył te dwa zdalne i również popełnił commit.

Mój problem pojawił się w momencie, gdy chciałem zaktualizować swoją lokalną kopię o nowy kod mojego znajomego, który zamierzałem pobrać ze zdalnego repozytorium na heroku.com. Przez pomyłkę, zamiast wykonać “git pull heroku master”, wykonałem polecenie “git pull heroku”, co zakończyło się:

"From heroku.com:appname

  • [new branch] master -> heroku/master
    You asked to pull from the remote ‘heroku’, but did not specify
    a branch. Because this is not the default configured remote
    for your current branch, you must specify a branch on the command line."

i chwilę poźniej (chyba po push’u) na GitHubie (na heroku nie wiem jeszcze jak przeglądać logi) pojawił się wpis jako nowy commit:

“Merge branch ‘master’ of heroku.com:appname”

I tutaj mam kilka pytań:

  1. Dlaczego utworzył nowe odgałęzienie?
  2. Dlaczego pojawiło się to w logach commit’ów na GitHubie? Na GitHubie sprawdzałem ile jest odgałęzień, ale jest tylko jedno, to główne “master”.
  3. Czy i jak mogę wycofać tę zmianę wraz z usunięciem tego z historii commit’ów?

Z góry dziękuję za wszelką pomoc!

[quote=bbmmog]I tutaj mam kilka pytań:

  1. Dlaczego utworzył nowe odgałęzienie?[/quote]
    Jeżeli pisząc odgałęzienie masz na myśli gałąź, to git niczego nie utworzył. git pull jest równoważne dwóm komendom:

git fetch git merge origin/master # albo heroku/master
Czyli de facto robiąc pull robisz też merge’a. Jako, że Twój znajomy wrzucił jakieś swoje zmiany, to git połączył jego commity z Twoimi commitami tworząc commit łączący, tzn.: “Merge branch ‘master’ of heroku.com:appname”. Jest to całkowicie normalne, gdybyś najpierw zrobił git pull origin master, to zamiast ‘master’ of heroku.com:appname miałbyś to samo, ale o githubie.

Commit łączący (tzn. merge) jest normalnym commitem, posiada po prostu dwóch rodziców. Dlatego pojawia się w spisie commitów. Tak jak pisałem powyżej - to jest całkowicie normalne i bardzo często takie commity będziesz widzieć.

Można tą zmianę cofnąć, ale nie ma takiej potrzeby. Twoją intencją było połączenie zmian od Twojego znajomego z Twoimi zmianami i to zrobiłeś, ale ściągając zmiany z heroku zamiast z githuba. Z punktu widzenia gita nie ma to żadnego znaczenia - efekt jest ten sam - masz najnowszą wersję kodu.

Jeżeli bardzo nie chcesz mieć commitów z merge’em z nazwą “heroku”, to rób zawsze najpierw pulle z githuba i później push na heroku, ale wg mnie nie ma czym się przejmował i nie przykładałbym do tego większej wagi. Czasami można pozbyć się commitów z merge’ami poprzez użycie git pull --rebase albo git rebase zamiast git merge (http://www.gitready.com/advanced/2009/02/11/pull-with-rebase.html), ale jeżeli jesteś początkujący w temacie gita to radzę na razie tylko o tym poczytać i raczej nie używać :wink: Używając rebase można bardzo łatwo sobie zrobić krzywdę (żeby nie było, że nie ostrzegałem).