2015-04-25 14 views
7

Próbowałem wiele linków na StackOverflow/gdzie indziej, aby właściwie zrozumieć zachowanieJaka jest różnica między `git reset --hard master` i` git reset --hard origin/master`?

git reset --hard option

wiem, że:

  • Jeżeli zostanie pominięty lub jeśli jest origin, resetowanie odbywa się na najnowszy commit na origin
  • Jeśli zostanie udostępniony skrót SHA1, reset zostanie wykonany na odpowiednim zatwierdzeniu.

Co ja nie rozumiem, są następujące wartości:

  1. origin
  2. HEAD
  3. origin/master
  4. origin/branch

Wszystko wydaje się takie samo zachowanie tj punkt do ostatnie zatwierdzenie na master.

Proszę wyjaśnić, jakie jest znaczenie wszystkich 4 opcji wartości podanych powyżej.

Chciałbym również wiedzieć, czy jestem w konkretnej branży, w jaki sposób mogę zresetować do ostatniego zatwierdzenia w tym oddziale? Jeśli na przykład jestem na v1.2, origin/v1.2 nadal prowadzi mnie do ostatniego zatwierdzenia na master.

Odpowiedz

10

Przede wszystkim musisz zrozumieć, że nazwy gałęzi i znaczników są po prostu wskaźnikami do wartości mieszania, które reprezentują pojedyncze zatwierdzenie, jeśli powiesz, że istnieją 4 opcje, które mają to samo zachowanie, wtedy pierwszą logiczną odpowiedzią jest to, że wszystko wskazuje na to samo popełnić

  • origin nie jestem tego pewien, ale myślę origin przez to samo rozwiąże się origin/HEAD co moim zdaniem będzie zależny od ustawień gitHub, w github a „domyślne ustawienie branch ", origin/head rozwiąże się z origin/[default_branch], w twoim przypadku zakładam, że jest to master, więc to dlatego ma ten sam efekt co origin/master.

  • HEAD zawsze wskazuje aktualny popełnienia, jeden stoisz na, więc git reset --hard HEAD będzie trwale usunąć wszystkie zmiany w plikach śledzone i wystawił plików zmian, ale nie zmienia hash popełnienia.

  • origin/master jest ostatnia popełnić w zdalnej gałęzi master od ostatniej sprowadzić/pull, za każdym razem, gdy zobowiązać się do master, lokalny master jest aktualizowana i twój origin/master jest aktualizowana też, jeśli ktoś pcha do master swoją repo będzie miał nie mam pojęcia, że ​​jest aktualizacja, chyba że wykonasz git fetch, a następnie Twój origin/master przesunie się przed swoim master, a może nawet rozejdzie się.
    prowadzenie git reset --hard origin/master będzie mieć taki sam skutek, jeśli jesteś obecnie są na master gałęzi i master jest zsynchronizowany z origin/master

  • origin/branch Nie jestem pewien, co to oznacza, bo nie ma origin/branch domyślnie, więc Zgaduję utworzony oddział o nazwie branch i dzieje się w tym samym popełnić jako swojego mistrza, aby potwierdzić można spróbować zrobić git branch zobaczyć wszystkie swoje oddziały, zgaduję znajdziesz jeden nazywa branch

Aby zobaczyć to wszystko w sposób wizualny, można spróbować uruchomić git log --graph --decorate --all lub wolę narzędzie wizualne jak gitk, jeśli masz zainstalowany binarny by uruchomić gitk --all zobaczyć wszystkie branże względem siebie

+1

'origin' puszka wyjaśnione przez '' 'wpis w' gitrevisions (7) '; w pełni rozszerza się na 'refs/remote/origin/HEAD'. "origin/master" rozwija się do 'refs/remote/origin/master', a podobnie' origin/branch' rozwinie się do 'refs/remote/origin/branch' (zakładając, jak powiedziałeś, że istnieje). – chepner

4

master, HEAD, origin/something i może jakiś znacznik, dlaczego nie, może wszystko wskazuje na to samo popełnienia, ale są one zdecydowanie nie to samo.

origin jest zwykle nazwą remote repository.

Możesz zobaczyć swoje piloty zdalne i skonfigurować nowe za pomocą git remote -v.

Wypróbuj (z -v) i prawdopodobnie będzie to miało sens.

remote/somebranch wskazuje na szefa oddziału na zdalnym repozytorium.

origin/master punktów do głowy master na origin.

Czy to samo co master?

Tak i nie. Jeśli wyciągniesz swój główny oddział, wykonasz jakąś pracę, a w międzyczasie ktoś inny popełni na master i popchnie do origin, będą się różnić.

Po wykonaniu git fetch origin, origin/master będzie mieć dodatkowe zatwierdzenia (będzie przed).

HEAD jest po prostu "bieżącym zatwierdzeniem". Pomyśl o tym jako o ..

Zobacz this question

Ponownie, mógłby być taka sama jak master, ale jeśli sprawdzeniu inny oddział lub popełnienia lub są w środku rebase, dobrze, że nie.

Więc spróbuj tego na świeżym repozytorium na które nikt inny nie pracuje:

$ git checkout master 
$ git log -1 --format="%H" HEAD 
123abc 
$ git log -1 --format="%H" origin/master 
123abc 

one są takie same!

$ git diff origin/master 

Oczywiście ich zawartość jest taka sama.

$ echo "foo" > foo 
$ git add foo 
$ git commit -m "Foo the thingy" 
$ git log -1 --format="%H" HEAD 
321bca 
$ git log -1 --format="%H" origin/master 
123abc 

Ah, zobacz, teraz są inne zobowiązania!

$ git push origin master 
$ git log -1 --format="%H" HEAD 
321bca 
$ git log -1 --format="%H" origin/master 
321bca 

A teraz nie są! popchnęliśmy nasz ostatni commit i obaj wskazują na to samo.

$ git checkout -b newbranch 
$ echo "baz" > baz 
$ git add baz 
$ git commit -m "Baz the thingy with the stuff" 
$ git branch -a 
    master 
* new_branch 
    origin/master 
$ git log -1 --format="%H" 
789def 
$ git log -1 --format="%H" master 
321bca 
git log -1 --format="%H" origin/master 
321bca 
git log -1 --format="%H" origin/new_branch 
unknown revision or path not in the working tree. 

Oczywiście, że nie. Nie pchnął new_branch do origin, to tylko na naszej lokalnej maszynie

git checkout 123abc 

Właśnie wyrejestrowany 123abc, stary szef master. Teraz nie jest szefem żadnej gałęzi, ale możemy to sprawdzić.

Note: checking out 123abc. You are in 'detached HEAD' state, etc 
$ git checkout -b old_master 
$ git branch -a 
    master 
* new_branch 
    origin/master 
    old_master 

Teraz zgadnij, jaki będzie ich numer SHA1?

Powiązane problemy