Git dla początkujących: ostateczny praktyczny przewodnik

854

Ok, po obejrzeniu tego postu przez PJ Hyetta , postanowiłem przejść do końca i przejść z Gitem .

Potrzebuję więc praktycznego przewodnika dla początkujących po Git. „Początkujący” jest definiowany jako ktoś, kto wie, jak obsługiwać swój kompilator, rozumie do pewnego stopnia, czym jest Makefile , i dotknął kontroli źródła, nie rozumiejąc go zbyt dobrze.

„Praktyczne” definiowanie, jako że ta osoba nie chce szczegółowo omawiać tego, co robi Git w tle, a nawet nie obchodzi go (ani nie wie), że jest rozpowszechniany. Twoje odpowiedzi mogą wskazywać na możliwości, ale staraj się skierować do początkującego, który chce przechowywać „główne” repozytorium na „serwerze”, którego kopie zapasowe są zabezpieczone i bezpieczne, i traktuj swoje lokalne repozytorium jedynie jako „klient”.

Więc:

Instalacja / konfiguracja

Praca z kodem

Tagowanie, rozgałęzianie, wydania, linie bazowe

Inny

  • Opisz i połącz z dobrym GUI, wtyczką IDE itp., Które sprawiają, że Git jest zasobem innym niż wiersz poleceń, ale proszę wymienić jego ograniczenia, jak również dobre.
    • msysgit - wieloplatformowy, dołączony do Git
    • gitk - przeglądarka historii dla wielu platform, dołączona do Git
    • gitnub - Mac OS X
    • gitx - przeglądarka historii Mac OS X.
    • smartgit - wieloplatformowy, komercyjny, beta
    • tig - graficzny interfejs użytkownika dla systemu Linux
    • qgit - GUI dla Windows, Linux
    • Rozszerzenia Git - pakiet dla systemu Windows, zawiera przyjazny interfejs GUI
  • Jakieś inne typowe zadania, które powinien znać początkujący?
  • Jak efektywnie pracować z zestawem repozytorium subversion jako moim źródłem kontroli źródła?

Inne referencje dla początkujących Git

Zagłębiam się w Gita

Od czasu do czasu przejrzę wpisy i uporządkuję je, aby miały spójny wygląd / wygląd i łatwo zeskanować listę - zachęcamy do zapoznania się z prostym nagłówkiem - krótkie wyjaśnienie - lista instrukcji - gotchas i dodatkowe informacje ”. Odsyłam również do wpisów z powyższej listy punktowanej, aby łatwo je później znaleźć.

Adam Davis
źródło

Odpowiedzi:

118

Jak tworzysz nowy projekt / repozytorium?

Repozytorium git jest po prostu katalogiem specjalnym .git katalog.

Różni się to od „scentralizowanych” systemów kontroli wersji (takich jak subversion), w których „repozytorium” znajduje się na zdalnym serwerze, który znajduje się checkoutw katalogu „kopii roboczej”. Dzięki git kopia robocza jest repozytorium.

Po prostu uruchom git initw katalogu zawierającym pliki, które chcesz śledzić.

Na przykład,

cd ~/code/project001/
git init

Spowoduje to utworzenie .git(ukrytego) folderu w bieżącym katalogu.

Aby utworzyć nowy projekt, uruchom git initz dodatkowym argumentem (nazwa katalogu do utworzenia):

git init project002

(This is equivalent to: mkdir project002 && cd project002 && git init)

Aby sprawdzić, czy bieżąca bieżąca ścieżka znajduje się w repozytorium git, po prostu uruchom git status- jeśli nie jest repozytorium, zgłosi „fatalne: nie repozytorium git”

Możesz także wyświetlić .gitkatalog i sprawdzić, czy zawiera on pliki / katalogi podobne do następujących:

$ ls .git
HEAD         config       hooks/       objects/
branches/    description  info/        refs/

Jeśli z jakiegokolwiek powodu chcesz „zrezygnować z repozytorium” repozytorium (chcesz przestać używać git do śledzenia tego projektu). Po prostu usuń .gitkatalog z podstawowego poziomu repozytorium.

cd ~/code/project001/
rm -rf .git/

Uwaga: zniszczy to całą historię zmian, wszystkie tagi, wszystko , co zrobił git. Nie dotknie „bieżących” plików (plików, które można obecnie zobaczyć), ale poprzednich zmian, usuniętych plików itd. Nie będzie można odzyskać!

dbr
źródło
3
Git sprawia, że ​​jego obiekty są tylko do odczytu, więc będziesz chciał rm -rf .gitzatrzeć bazę danych git.
Josh Lee
Zwykle plik .gitignore będzie musiał zostać utworzony podczas normalnego użytkowania, aby określić pliki / drzewa, które mają być ignorowane w wersjonowaniu, więc aby zakończyć całą ostatnią część „de-gitting”, oprócz usunięcia .git należy również usunąć plik .git. plik gitignore. :)
Monoman,
A co z nagimi repozytoriami? Są w jakiś sposób „scentralizowane” i myślę, że dobrze nadają się do wielu projektów, które wymagają pewnego rodzaju centralizacji (np. Projekty opracowane przez wiele osób)
peoro
WRT działa, git statusaby upewnić się, że jesteś w repozytorium: ma to jedną gotcha: jeśli masz ustawioną zmienną środowiskową $ GIT_DIR w bieżącej powłoce, git zignoruje twoją bieżącą lokalizację i użyje repozytorium w $ GIT_DIR. Powinienem wiedzieć, że straciłem wczoraj godzinę.
sanmiguel
110

GUI dla git


Git GUI

Dołączone do git - Uruchom git guiz wiersza poleceń, a instalator msysgit systemu Windows doda go do menu Start.

Git GUI może zrobić większość tego, co musisz zrobić z git. W tym zmiany etapów, konfigurowanie git i repozytoriów, wypychanie zmian, tworzenie / pobieranie / usuwanie oddziałów, scalanie i wiele innych rzeczy.

Jedną z moich ulubionych funkcji są skróty „etap linii” i „etap przystawki” w menu prawym przyciskiem myszy, które umożliwiają zatwierdzanie określonych części pliku. Możesz to samo osiągnąć git add -i, ale uważam, że jest łatwiejszy w użyciu.

Nie jest to najładniejsza aplikacja, ale działa na prawie wszystkich platformach (opartych na Tcl / Tk)

Zrzuty ekranu | screencast


GitK

Dołączone również z git. Jest to przeglądarka historii git, która umożliwia wizualizację historii repozytorium (w tym gałęzi, kiedy są tworzone i łączone). Możesz przeglądać i wyszukiwać zatwierdzenia.

Ładnie komponuje się z git-gui.


Gitnub

Aplikacja Mac OS X. Głównie odpowiednik git log, ale ma pewną integrację z githubem (np. „Widok sieci”).

Wygląda ładnie i pasuje do Mac OS X. Możesz przeszukiwać repozytoria. Największą krytyką Gitnub jest to, że pokazuje historię w sposób liniowy (pojedyncza gałąź na raz) - nie wizualizuje rozgałęzień i scalania, co może być ważne w przypadku git, chociaż jest to planowana poprawa.

Pobierz linki i screeny, dziennik zmian | repozytorium git


GitX

Zamierza być „gitk clone dla OS X”.

Może wizualizować nieliniową historię rozgałęziania, wykonywać zatwierdzenia, przeglądać i wyszukiwać zatwierdzenia, a także ma inne fajne funkcje, takie jak możliwość „szybkiego podglądu” dowolnego pliku w dowolnej wersji (spacja w widoku listy plików), eksportowania dowolnego pliku (przeciągnij i upuść).

Jest znacznie lepiej zintegrowany z OS X niż git-gui/ gitki jest szybki i stabilny nawet przy wyjątkowo dużych repozytoriach.

Oryginalny pieter repozytorium git nie był ostatnio aktualizowany (ponad rok w momencie pisania). Bardziej aktywnie utrzymywana gałąź jest dostępna w Brotherbard / gitx - dodaje „pasek boczny, pobieranie, ciągnięcie, pchanie, dodawanie zdalne, łączenie, wybieranie wiśniowe, rebase, klonowanie, klonowanie do”

Pobierz | Zrzuty ekranu | repozytorium git | widelec bratbard | widelec Laullon


SmartGit

Ze strony głównej:

SmartGit jest nakładką na rozproszony system kontroli wersji Git i działa w systemach Windows, Mac OS X i Linux. SmartGit jest przeznaczony dla programistów, którzy wolą graficzny interfejs użytkownika od klienta wiersza poleceń, aby być jeszcze wydajniejszym dzięki Git - obecnie najbardziej wydajnemu DVCS.

Możesz pobrać go z ich strony internetowej .

Pobieranie


TortoiseGit

TortoiseSVN Git wersja dla użytkowników systemu Windows.

Przenosi TortoiseSVN do TortoiseGit Najnowsza wersja 1.2.1.0 Ta wersja może wykonywać zwykłe zadania, takie jak zatwierdzanie, wyświetlanie dziennika, różnicowanie dwóch wersji, tworzenie gałęzi i tagu, tworzenie poprawki i tak dalej. Szczegółowe informacje zawiera ReleaseNotes . Witaj, aby przyczynić się do tego projektu.

Pobieranie


QGit

QGit to przeglądarka git GUI zbudowana na Qt / C ++.

Dzięki qgit będziesz mógł przeglądać historię wersji, przeglądać zawartość łat i zmienione pliki, graficznie podążając za różnymi gałęziami programistycznymi.

Pobieranie


gitg

gitg to przeglądarka repozytorium git skierowana do gtk + / GNOME. Jednym z jego głównych celów jest zapewnienie bardziej zunifikowanego interfejsu użytkownika dla interfejsów git na wielu komputerach. Nie chodzi tu o pisanie aplikacji wieloplatformowej, ale poprzez ścisłą współpracę z podobnymi klientami dla innych systemów operacyjnych (takich jak GitX dla OS X).

funkcje

  • Przeglądaj historię zmian.
  • Obsługa dużych repozytoriów (ładuje repozytorium linux, ponad 17000 wersji, poniżej 1 sekundy).
  • Zatwierdź zmiany.
  • Sceny / scenki poszczególnych przystojniaków.
  • Przywróć zmiany.
  • Pokaż kolorową różnicę zmian w wersjach.
  • Przeglądaj drzewo dla danej wersji.
  • Wyeksportuj części drzewa danej wersji.
  • Podaj dowolny refspec, który polecenie, takie jak „git log”, może zrozumieć, aby zbudować historię.
  • Pokaż i przełączaj się między oddziałami w widoku historii.

Pobierz: wydania lub źródło


Gitbox

Gitbox to graficzny interfejs Mac OS X dla systemu kontroli wersji Git. W jednym oknie widać gałęzie, historię i status katalogu roboczego.

Codzienne operacje są łatwe: wprowadzanie zmian i zmiana scen za pomocą pola wyboru. Zatwierdź, pociągnij, połącz i pchnij jednym kliknięciem. Kliknij dwukrotnie zmianę, aby wyświetlić różnicę za pomocą FileMerge.app.

Pobieranie


Gity

Witryna Gity nie ma zbyt wielu informacji, ale na podstawie zrzutów ekranowych wydaje się być bogatym w funkcje otwartym git gui OS X.

Pobierz lub źródło


Meld

Meld to wizualne narzędzie do porównywania i scalania. Możesz porównać dwa lub trzy pliki i edytować je w miejscu (różnice aktualizują się dynamicznie). Możesz porównać dwa lub trzy foldery i uruchomić porównania plików. Możesz przeglądać i wyświetlać kopię roboczą z popularnych systemów kontroli wersji, takich jak CVS, Subversion, Bazaar-ng i Mercurial [ i Git ].

Pliki do pobrania


Katana

Git GUI dla OSX Steve Dekorte.

Na pierwszy rzut oka sprawdź, które zdalne gałęzie mają zmiany do pobrania, a lokalne repo mają zmiany do wypchnięcia. Obsługiwane są opcje dodawania, zatwierdzania, wypychania, ciągnięcia, oznaczania i resetowania, a także wizualne różnice i wizualne przeglądanie hierarchii projektu, które podkreśla lokalne zmiany i dodatki.

Bezpłatnie dla 1 repozytorium, 25 USD za więcej.

Pobieranie


Sprout (wcześniej GitMac)

Koncentruje się na ułatwieniu korzystania z Git. Zawiera natywny interfejs Cocoa (podobny do Maca), szybkie przeglądanie repozytorium, klonowanie, push / pull, rozgałęzianie / scalanie, różnicę wizualną, zdalne gałęzie, łatwy dostęp do terminala i wiele innych.

Dzięki temu, że najczęściej używane akcje Git są intuicyjne i łatwe do wykonania, Sprout (wcześniej GitMac) sprawia, że ​​Git jest przyjazny dla użytkownika. Zgodny z większością przepływów pracy Git, Sprout jest świetny dla projektantów i programistów, współpracy zespołowej oraz zaawansowanych i początkujących użytkowników.

Pobierz | Stronie internetowej


Wieża

Bogaty w funkcje Git GUI dla Mac OSX. 30-dniowy bezpłatny okres próbny, 59 USD za licencję dla jednego użytkownika.

Pobierz | Stronie internetowej


EGit

EGit jest dostawcą Eclipse Team dla systemu kontroli wersji Git. Git jest rozproszonym SCM, co oznacza, że ​​każdy programista ma pełną kopię całej historii każdej wersji kodu, dzięki czemu zapytania dotyczące historii są bardzo szybkie i wszechstronne.

Projekt EGit implementuje oprzyrządowanie Eclipse oprócz implementacji Git JGit Java.

Pobierz | Stronie internetowej


Rozszerzenia Git

Open Source dla Windows - instaluje wszystko, czego potrzebujesz do pracy z Git w jednym pakiecie, łatwym w użyciu.

Rozszerzenia Git to zestaw narzędzi, dzięki którym praca z Git w systemie Windows jest bardziej intuicyjna. Rozszerzenie powłoki zintegruje się z Eksploratorem Windows i wyświetli menu kontekstowe plików i katalogów. Istnieje również wtyczka Visual Studio do korzystania z git z Visual Studio.

Pobieranie

Ogromne podziękowania dla dbr za opracowanie na temat git gui.


SourceTree

SourceTree to darmowy klient Mac dla Git, Mercurial i SVN. Zbudowany przez Atlassian, twórców BitBucket, wydaje się działać równie dobrze z każdym systemem VC, co pozwala opanować jedno narzędzie do użytku we wszystkich twoich projektach, jednak są one kontrolowane pod kątem wersji. Pełen funkcji i BEZPŁATNY.

Ekspert gotowy i wyposażony w funkcje zarówno dla początkujących, jak i zaawansowanych użytkowników:

Przejrzyj wychodzące i przychodzące zestawy zmian. Czereśnia między gałęziami. Obsługa łat, rebase, schowek / półka i wiele więcej.

Pobierz | Stronie internetowej


dylanfm
źródło
2
Masz kilka dobrych odpowiedzi (szczególnie gitcasty i odpowiedź push / pull), ale czy mógłbym polecić podzielenie go na osobne odpowiedzi? Pytający poprosił, abyś „nie próbował wcisnąć wiązki informacji w jedną odpowiedź”!
dbr
3
Może powinieneś dodać TortoiseGit code.google.com/p/tortoisegit do swojej listy, dla Windows Gitters ...
Kreta
1
Gity ( macendeavour.com/gity ) jest opcją, ale wciąż jest w fazie rozwoju (OS X)
Dave DeLong
2
Tower („Najpotężniejszy klient Git dla komputerów Mac”) to piękny nowy klient dla Git.
rubiii
59

Cóż, pomimo faktu, że prosiłeś, abyśmy nie „po prostu” łączyli się z innymi zasobami, jest to głupie, gdy istnieje już zasób uprawiany przez społeczność (i rośnie), który jest naprawdę całkiem dobry: Księga społeczności Git . Poważnie, ponad 20 pytań w pytaniu będzie mało zwięzłych i spójnych. Książka społeczności Git jest dostępna zarówno w formacie HTML, jak i PDF, i odpowiada na wiele twoich pytań za pomocą jasnych, dobrze sformatowanych i recenzowanych odpowiedzi oraz w formacie, który pozwala od razu przejść do problemu.

Niestety, jeśli mój post naprawdę cię denerwuje, usunę go. Po prostu to powiedz.

Pat Notz
źródło
2
Jeśli nie używasz gita, ponieważ jest to DVCS, po co w ogóle męczyć się z gitem? To pytanie jest głupie i kieruje zasoby, które można by przeznaczyć na inne rzeczy, aby osiągnąć wątpliwy cel.
Randal Schwartz
56

Jak skonfigurować, aby ignorować pliki:

Możliwość ignorowania przez git plików, których nie chcesz śledzić, jest bardzo przydatna.

Aby zignorować plik lub zestaw plików, podaj wzór. Składnia wzoru dla git jest dość prosta, ale potężna. Ma zastosowanie do wszystkich trzech różnych plików, o których wspomnę poniżej.

  • Pusty wiersz nie ignoruje żadnych plików, zwykle służy jako separator.
  • Linie oznaczone gwiazdką # służą jako komentarze.
  • The ! przedrostek jest opcjonalny i spowoduje zanegowanie wzorca. Wszelkie negowane pasujące wzorce zastąpią wzorce o niższym priorytecie.
  • Obsługuje zaawansowane wyrażenia i symbole wieloznaczne
    • Przykład: wzorzec: *. [Oa] zignoruje wszystkie pliki w repozytorium kończące się na .o lub .a (pliki obiektów i archiwów)
  • Jeśli wzorzec ma katalog zakończony ukośnikiem git, będzie pasował tylko do tego katalogu i ścieżek pod nim. Wyklucza to zwykłe pliki i dowiązania symboliczne z meczu.
  • Wiodący ukośnik dopasuje wszystkie pliki w nazwie ścieżki.
    • Np .: wzorzec /*.c będzie pasował do pliku foo.c, ale nie do bar / awesome.c

Świetny przykład ze strony podręcznika gitignore (5) :

$ git status
[...]
# Untracked files:
[...]
#       Documentation/foo.html
#       Documentation/gitignore.html
#       file.o
#       lib.a
#       src/internal.o
[...]
$ cat .git/info/exclude
  # ignore objects and archives, anywhere in the tree.
  *.[oa]
$ cat Documentation/.gitignore
# ignore generated html files,
*.html
# except foo.html which is maintained by hand
!foo.html
$ git status
[...]
# Untracked files:
[...]
#       Documentation/foo.html
[...]

Zasadniczo istnieją trzy różne sposoby ignorowania nieśledzonych plików.

1) Zignoruj ​​dla wszystkich użytkowników repozytorium:

Dodaj plik o nazwie .gitignore do katalogu głównego kopii roboczej.

Edytuj .gitignore, aby dopasować swoje preferencje, dla których pliki powinny / nie powinny być ignorowane.

git add .gitignore 

i zatwierdź, kiedy skończysz.

2) Zignoruj ​​tylko swoją kopię repozytorium:

Dodaj / edytuj plik $ GIT_DIR / info / exclude w kopii roboczej z preferowanymi wzorami.

Np .: Moja kopia robocza to ~ / src / project1, więc edytowałbym ~ / src / project1 / .git / info / exclude

Jesteś skończony!

3) Zignoruj ​​we wszystkich sytuacjach w systemie:

Globalne wzorce ignorowania dla twojego systemu mogą znajdować się w pliku o dowolnej nazwie.

Mój osobiście nazywa się ~ / .gitglobalignore

Następnie mogę powiadomić git o tym pliku, edytując mój plik ~ / .gitconfig w następującym wierszu:

core.excludesfile = ~/.gitglobalignore

Jesteś skończony!

Uważam, że strona podręcznika gitignore jest najlepszym źródłem informacji.

Brian Gianforcearo
źródło
Czy ktoś mógłby dodać jeden drobny, ale ważny szczegół do tego postu? Działa to tylko w przypadku plików, które nie są jeszcze śledzone przez git. Aby „wyśledzić” plik, ale pozostawić go w systemie plików, potrzebujesz „git rm --cached filename”. Dzięki!
Nikita Rybak,
Chcę tylko zauważyć, że dodanie wiersza core.excludesfile nie działało dla mnie. Musiałem [git config --global core.excludesfile ~ / .gitglobalignore], aby to działało.
Coding District
Jest teraz projekt na Github o nazwie gitignore, który ma pliki gitignore dla różnych języków i środowisk programistycznych: github.com/github/gitignore
Ryan Lundy
47

Jak „otagować” konkretny zestaw poprawek

Jak „oznaczyć” „tagować” lub „zwolnić” konkretny zestaw poprawek dla określonego zestawu plików, aby zawsze móc pobrać go później?

Za pomocą git tagpolecenia.

Aby po prostu „otagować” bieżącą wersję, wystarczy uruchomić.

git tag -a thetagname
git tag -a 0.1
git tag -a 2.6.1-rc1 -m 'Released on 01/02/03'

Aby wyświetlić listę bieżących tagów, po prostu uruchom git tagbez argumentów lub -l(małe litery L):

$ git tag -a thetagname # and enter a message, or use -m 'My tag annotation'
$ git tag -l
thetagname

Aby usunąć tag, użyj -dflagi:

$ git tag -d thetagname 
Deleted tag 'thetagname'
$ git tag
[no output]

Aby oznaczyć konkretne (poprzednie) zatwierdzenie, po prostu ...

git tag [tag name] [revision SHA1 hash]

Na przykład:

git tag 1.1.1 81b15a68c6c3e71f72e766931df4e6499990385b

Uwaga: domyślnie git tworzy tag „lekki” (w zasadzie odniesienie do konkretnej wersji). „Właściwym” sposobem jest użycie -aflagi. Spowoduje to uruchomienie edytora z prośbą o wiadomość znacznika (identycznie jak prośba o potwierdzenie, możesz także użyć -mflagi, aby podać wiadomość znacznika w wierszu poleceń). Użycie znacznika z adnotacjami tworzy obiekt z własnym identyfikatorem, datą, znacznikiem (autorem) i opcjonalnie podpisem GPG (przy użyciu -sznacznika). Więcej informacji na ten temat można znaleźć w tym poście

git tag mytagwithmsg -a -m 'This is a tag, with message'

Aby wyświetlić listę tagów z adnotacjami, użyj -n1flagi, aby wyświetlić 1 linię każdej wiadomości tagu ( -n245aby wyświetlić pierwsze 245 linii każdej adnotacji itd.):

$ git tag -l -n1
mytagwithmsg    This is a tag, with message

Aby uzyskać więcej informacji, zobacz stronę podręcznika git-tag (1)

dbr
źródło
Tag git domyślnie nie tworzy tagów, tylko lekkie odniesienia. Musisz użyć -a lub -s, aby utworzyć obiekt znacznika (z czego skorzystają takie rzeczy jak opis): rockstarprogrammer.org/post/2008/oct/16/…
Dustin
Ach, ciekawe. Dzięki, zaktualizowałem odpowiedź, aby to odzwierciedlić
dbr
A jak oznaczyć wcześniej zatwierdzoną wersję? (przepraszam, że jest za długi, więc przejrzałem, czy coś przeoczyłem?)
hasen
hasen j: Dodano informacji do odpowiedzi, w zasadziegit tag tagname revision_SHA1
DBR
1
Aby wypchnąć tagi do zdalnego repozytorium, dodaj --tagi podczas korzystania z git push (informacje z obszaru pomocy github).
Héctor Ramos
46

Przykład przepływu pracy z GIT.

Git jest niezwykle elastyczny i dobrze dostosowuje się do dowolnego przepływu pracy, ale niewymuszanie określonego przepływu pracy może mieć negatywny wpływ na utrudnienie zrozumienia, co możesz zrobić z gitem poza liniowym przepływem pracy „tworzenia kopii zapasowych” oraz na przykład, jak przydatne może być rozgałęzienie .

Ten post na blogu ładnie wyjaśnia bardzo prosty, ale skuteczny przepływ pracy, który jest naprawdę łatwy do skonfigurowania za pomocą git.

cytowanie z postu na blogu: uważamy origin / master za główną gałąź, w której kod źródłowy HEAD zawsze odzwierciedla stan gotowości do produkcji:

Przepływ pracy stał się na tyle popularny, że stworzył projekt, który implementuje ten przepływ pracy: git-flow

Ładna ilustracja prostego przepływu pracy, w którym wprowadzasz wszystkie zmiany w fazie programowania, a tylko w trybie mistrzowskim, gdy kod jest w stanie produkcyjnym:

prosty przepływ pracy

Powiedzmy teraz, że chcesz pracować nad nową funkcją lub nad refaktoryzacją modułu. Możesz stworzyć nową gałąź, którą moglibyśmy nazwać gałęzią „funkcji”, co zajmie trochę czasu i może uszkodzić część kodu. Gdy twoja funkcja będzie „wystarczająco stabilna” i będziesz chciał przenieść ją „bliżej” produkcji, scalisz swoją gałąź funkcji w celu rozwoju. Gdy wszystkie błędy zostaną rozwiązane po scaleniu, a kod przejdzie pomyślnie wszystkie testy, możesz wprowadzić zmiany w master.

Podczas całego tego procesu znajduje się straszny błąd bezpieczeństwa, który należy natychmiast naprawić. Możesz mieć gałąź zwaną poprawkami, która wprowadza zmiany, które są szybciej wypychane z powrotem do produkcji niż normalna gałąź „rozwijania”.

Tutaj masz ilustrację tego, jak może wyglądać przepływ pracy tej funkcji / poprawki / rozwoju / produkcji (dobrze wyjaśniony w poście na blogu, i powtarzam, że post na blogu wyjaśnia cały proces o wiele bardziej szczegółowo i znacznie lepiej niż ja .

Przykład przepływu pracy Git

jesionów
źródło
Jestem początkującym, a ten schemat sprawia, że ​​jest to dla mnie bardziej mylące.
finnw
Który, pierwszy czy ostatni? Tak naprawdę nie chciałem, aby ten post był zbyt długi, ale dodam małe wyjaśnienie obu diagramów później.
ashwoods
Przeczytaj cały artykuł. Ten diagram również mnie zdezorientował, ale post na blogu jest bardzo dobrze napisany nvie.com/posts/a-successful-git-branching-model
Felipe Sabino
czy teraz jest lepiej? chciałem tylko zapoznać się z ogólnym przeglądem, a nie ponownie tutaj zamieszczać całego posta na blogu :)
ashwoods
39

Oto kopia postu PJ Hyetta, ponieważ nie jest już dostępny:

Git nie jest trudny

23 listopada 2008

Kiedy mówimy ludziom, dlaczego powinni używać Git zamiast Subversion, pojawia się następujące zdanie: „Git robi Subversion lepiej niż Subversion, ale robi o wiele więcej”.

„Dużo więcej” składa się z wielu rzeczy, które sprawiają, że Git naprawdę błyszczy, ale może być dość przytłaczający dla osób pochodzących z innych SCM, takich jak Subversion.

To powiedziawszy, nic nie stoi na przeszkodzie, abyś używał Git tak samo, jak używasz Subversion podczas przejścia.

Zakładając, że zainstalowałeś niezbędne oprogramowanie i masz gdzieś zdalne repozytorium, w ten sposób możesz pobrać kod i odepchnąć zmiany z Subversion:

$ svn checkout svn://foo.googlecode.com/svn/trunk foo
# make your changes
$ svn commit -m "my first commit"

A jak zrobiłbyś to w Git:

$ git clone [email protected]:pjhyett/foo.git
# make your changes
$ git commit -a -m "my first commit"
$ git push

Jeszcze jedno polecenie, aby stało się to w Git. To dodatkowe polecenie ma duże implikacje, ale dla celów tego posta mówimy tylko o jednym dodatkowym poleceniu.

Widzisz, to naprawdę nie jest takie trudne.

Aktualizacja: Byłbym niedbały nie wspomnieć, że równowartość aktualizowania kopii lokalnej w stosunku do Subversion jest Git svn updatei git pullodpowiednio. Tylko jedno polecenie w obu przypadkach.

Adam Davis
źródło
W pierwszym przykładzie widzę, że wymeldowujesz się do ścieżki względnej, ./fooale nie określono ścieżki dla klonowania get, gdzie się wymeldujesz?
JD Isaacks,
33

Jak zainstalować Git

W systemie Windows:

Zainstaluj msysgit

Istnieje kilka plików do pobrania:

  • Git: użyj tego, chyba że potrzebujesz jednej z pozostałych opcji poniżej.
  • PortableGit: użyj tego, jeśli chcesz uruchomić Git na komputerze bez instalacji na tym komputerze (np. Uruchamiając Git z napędu USB)
  • msysGit: użyj tego, jeśli chcesz rozwijać samego Gita. Jeśli tylko chcesz używać Git dla Twojego kodu źródłowego, ale nie chcesz, aby edytować git w kodzie źródłowym, nie trzeba tego.

To również instaluje powłokę bash Cygwin, dzięki czemu można używać gitw ładniejszej powłoce (niż cmd.exe), a także obejmuje git-gui (dostępne za pomocą git guipolecenia lub Start > All Programs > Gitmenu)

Mac OS X

Użyj instalatora git-osx lub możesz także zainstalować ze źródła

Za pośrednictwem menedżera pakietów

Zainstaluj gitza pomocą natywnego menedżera pakietów. Na przykład na Debianie (lub Ubuntu):

apt-get install git-core

Lub w Mac OS X za pośrednictwem MacPorts :

sudo port install git-core+bash_completion+doc

… Lub fink:

fink install git

… Lub Homebrew :

brew install git

W przypadku dystrybucji opartych na systemie Red Hat, takich jak Fedora:

yum install git

W Cygwin pakiet Git można znaleźć w sekcji „devel”

Ze źródła (Mac OS X / Linux / BSD / itp.)

W Mac OS X, jeśli masz zainstalowane Narzędzia programistyczne, możesz bardzo łatwo skompilować Git ze źródła. Pobierz najnowszą wersję Git jako a .tar.bzlub .tar.gzze strony http://git-scm.com/ i rozpakuj ją (kliknij dwukrotnie w Finderze)

W systemie Linux / BSD / itp. powinno być prawie tak samo. Na przykład w Debianie (i Ubuntu) musisz zainstalować build-essentialpakiet przez apt.

Następnie w terminalu, cddo którego wyodrębniono pliki (Uruchomienie cd ~/Downloads/git*/powinno działać), a następnie uruchom ..

./configure && make && sudo make install

Spowoduje to zainstalowanie Git w domyślnym miejscu ( /usr/local- tak gitbędzie w /usr/local/bin/git)

Poprosi Cię o podanie hasła (dla sudo), jest to po to, aby można było zapisać się w /usr/local/katalogu, do którego dostęp może uzyskać tylko użytkownik „root”, dlatego wymagane jest sudo!

Jeśli chcesz zainstalować go gdzieś osobno (aby pliki Gita nie były pomieszane z innymi narzędziami), użyj --prefixpolecenia config:

./configure --prefix=/usr/local/gitpath
make
sudo make install

Spowoduje to zainstalowanie gitpliku binarnego w /usr/local/bin/gitpath/bin/git- więc nie musisz go wpisywać za każdym razem, powinieneś dodać do swojego $PATH, dodając następujący wiersz do ~/.profile:

export PATH="${PATH}:/usr/local/bin/gitpath/bin/"

Jeśli nie masz dostępu do sudo, możesz użyć --prefix=/Users/myusername/bini zainstalować w swoim katalogu domowym. Pamiętaj, aby dodać ~/bin/do$PATH

Skrypt x-git-update-to-najnowsza wersja automatyzuje wiele z tych czynności:

Ten skrypt aktualizuje mój lokalny klon repozytorium git (lokalnie o ~/work/track/git), a następnie konfiguruje, instaluje (at /usr/local/git- git describe) i aktualizuje /usr/local/gitdowiązanie symboliczne.

W ten sposób mogę mieć /usr/local/git/binw sobie PATHi zawsze używam najnowszej wersji.

Najnowsza wersja tego skryptu instaluje również strony podręcznika man. Musisz dostosować swój, MANPATHaby zawierał /usr/local/git/share/mankatalog.

dbr
źródło
5
Na Fedora: yum install git. Do uruchomienia GUI yum install git-gui.
Cristian Ciupitu
2
Na Macusudo port install git-core+bash_completion+doc
Singletoned
Pobrałem Fink na Maca, ale uruchomienie Fink podczas instalacji git powoduje błąd: „Błąd: nie znaleziono pakietu dla specyfikacji„ git ”!”
quano,
@quano Powinno tam być, pdb.finkproject.org/pdb/package.php/git - sprawdź, czy Fink jest poprawnie zaktualizowany - myślę, że bieganie fink self-updatepowinno pomóc
dbr
32

Git Reset

Powiedz, że robisz ciągnięcie, scalasz go ze swoim kodem i decydujesz, że ci się nie podoba. Użyj git-log lub tig i znajdź skrót gdziekolwiek chcesz wrócić (prawdopodobnie ostatnie zatwierdzenie przed ściągnięciem / scaleniem) skopiuj skrót i wykonaj:

# Revert to a previous commit by hash:
git-reset --hard <hash>

Zamiast skrótu możesz użyć HEAD ^ jako skrótu do poprzedniego zatwierdzenia.

# Revert to previous commit:
git-reset --hard HEAD^
Dean Rather
źródło
4
Jest to analogiczne do cofania w większości innych scentralizowanych systemów kontroli wersji.
Jeremy Wall,
„$ git-reset --hard HEAD ^” powinno być skrótem dla rodzica głowy (tj. poprzedniego stanu przed ostatnim zatwierdzeniem).
Ben Page
6
po prostu stary git resetpowinien wystartować przypadkowogit add
slf
31

Jak skonfigurować wspólne repozytorium zespołu?

Jak skonfigurować normalne repozytorium opisano tutaj - ale jak skonfigurować repozytorium zespołowe, z którego każdy może pobierać i przesyłać do iz?

Korzystanie ze wspólnego systemu plików NFS

Zakładając, że Twój zespół ma już na przykład członkostwo w grupie udostępnionej, z którego można korzystać.

mkdir /your/share/folder/project.git
cd /your/share/folder/project.git
newgrp yourteamgroup # if necessary
git init --bare --shared

Aby rozpocząć korzystanie z tego repozytorium, najłatwiej jest zacząć od lokalnego repozytorium, z którego już korzystałeś:

cd your/local/workspace/project
git remote add origin /your/share/folder/project.git
git push origin master

Inni mogą teraz sklonować to i zacząć działać:

cd your/local/workspace
git clone /your/share/folder/project.git

Korzystanie z SSH

Skonfiguruj konto użytkownika na serwerze docelowym. Niezależnie od tego, czy korzystasz z konta bez hasła, konta z hasłem, czy też używasz authorized_keysnaprawdę zależy od wymaganego poziomu bezpieczeństwa. Spójrz na Konfigurowanie Git przez SSH, aby uzyskać więcej informacji.

Jeśli wszyscy programiści korzystają z tego samego konta w celu uzyskania dostępu do tego udostępnionego repozytorium, nie trzeba używać --sharedopcji jak powyżej.

Po zainicjowaniu repozytorium w taki sam sposób jak powyżej, wykonujesz wstępne wypychanie w następujący sposób:

cd your/local/workspace/project
git remote add origin user@server:/path/to/project.git
git push origin master

Widzisz podobieństwo do powyższego? Jedyne, co może się zdarzyć, to SSH z prośbą o hasło, jeśli konto ma hasło. Jeśli pojawi się ten monit na koncie bez hasła, serwer SSH prawdopodobnie się wyłączył PermitEmptyPasswords.

Klonowanie wygląda teraz tak:

cd your/local/workspace
git clone user@server:/path/to/project.git
Asgeir S. Nilsen
źródło
oprócz NFS - jak skonfigurować serwer git do pracy nad ssh? - Jak na przykład github.com w małej skali?
Dafydd Rees,
Czy konieczne jest ustawienie bitu lepkiego grupy w odpowiednich katalogach, czy też git zajmuje się tym wszystkim? Jeśli to drugie, skąd git wie, jakiej grupy użyć w uprawnieniach do plików Unix?
Norman Ramsey,
Dodałem sekcję dotyczącą SSH zgodnie z żądaniem. Lepki bit jest potrzebny, jeśli nie wszyscy programiści mają wspólną grupę jako swoją podstawową grupę. Jeśli któryś z użytkowników ma inną grupę podstawową, domyślnie tworzy pliki z tą własnością grupy. Dzieje się to poniżej git i dlatego nie zawsze jest pod kontrolą git.
Asgeir S. Nilsen
do czego przydatna jest grupa git repo-config core.sharedRepository ?
systempuntoout
28

git statusjest twoim przyjacielem, używaj go często. Dobry do odpowiadania na pytania takie jak:

  • Co właśnie zrobiło to polecenie?
  • W jakiej jestem branży?
  • Jakie zmiany zamierzam wprowadzić i czy o czymś zapomniałem?
  • Czy ostatnio byłem w trakcie pracy nad tym projektem (dni, tygodnie, a może miesiące temu)?

W przeciwieństwie do, powiedzmy svn status, git statusdziała niemal natychmiast, nawet przy dużych projektach. Często uważałem, że jest to pocieszające podczas nauki używania tego narzędzia, aby upewnić się, że mój model mentalny tego, co się dzieje, jest dokładny. Teraz używam go głównie do przypomnienia sobie, co zmieniłem od czasu ostatniego zatwierdzenia.

Oczywiście, jest to znacznie bardziej przydatne, jeśli Twój .gitignore jest poprawnie skonfigurowany.

Peter Burns
źródło
27

Zatwierdź zmiany

Po edycji pliku musisz zatwierdzić zmiany w git. Kiedy wykonasz to polecenie, poprosi on o wiadomość zatwierdzenia - która jest tylko prostym tekstem, który mówi wszystkim, co zmieniłeś.

$ git commit source/main.c

Zatwierdzi plik main.c w katalogu ./source/

$ git commit -a # the -a flag pulls in all modified files

zatwierdzi wszystkie zmienione pliki (ale nie nowe pliki, należy je dodać do indeksu za pomocą git-add). Jeśli chcesz zatwierdzić tylko niektóre pliki, musisz je najpierw wypróbować za pomocą git-add, a następnie zatwierdzić bez flagi -a.

Zatwierdzanie zmienia tylko lokalne repozytorium, ale nie zdalne. Jeśli chcesz wysłać zatwierdzenia do zdalnego repozytorium, musisz wykonać wypychanie.

$ git push <remote> <branch> # push new commits to the <branch> on the <remote> repository

Dla kogoś pochodzącego z CVS lub SVN jest to zmiana, ponieważ zatwierdzenie do centralnego repozytorium wymaga teraz dwóch kroków.

Adam Davis
źródło
27

Jak się rozgałęziasz?

Domyślna gałąź w repozytorium git nazywa się master.

Aby utworzyć nowy oddział, użyj

git branch <branch-name>

Aby wyświetlić listę wszystkich gałęzi w bieżącym typie repozytorium

git branch

Jeśli chcesz przejść do innej gałęzi, możesz użyć

git checkout <branch-name>

Aby utworzyć nowy oddział i przejść do niego w jednym kroku

git checkout -b <branch-name>

Aby usunąć gałąź, użyj

git branch -d <branch-name>

Aby utworzyć gałąź ze zmianami z bieżącej gałęzi, wykonaj

git stash
git stash branch <branch-name>
Markus Dulghier
źródło
11
powinieneś wspomnieć o skrócie git checkout -b <nazwa-gałęzienia>, który tworzy gałąź i przełącza się na nią w jednym kroku. Jest to prawdopodobnie najczęstszy przypadek użycia dla początkującego, a nawet zaawansowanego użytkownika git.
Jeremy Wall,
21

Uzyskiwanie najnowszego kodu

$ git pull <remote> <branch> # fetches the code and merges it into 
                             # your working directory
$ git fetch <remote> <branch> # fetches the code but does not merge
                              # it into your working directory

$ git pull --tag <remote> <branch> # same as above but fetch tags as well
$ git fetch --tag <remote> <branch> # you get the idea

Dotyczy to prawie wszystkich przypadków uzyskania najnowszej kopii kodu ze zdalnego repozytorium.

Jeremy Wall
źródło
20

Pro Git wolny książka jest zdecydowanie moim ulubionym, szczególnie dla początkujących.

Peter Mortensen
źródło
18

Git Magic to wszystko, czego potrzebujesz. Gwarancja zwrotu pieniędzy!

Andrzej
źródło
14
Westchnienie, chcę odzyskać pieniądze. Błędne oprogramowanie (msysGit) z niepełnym samouczkiem (GitMagic) == godziny pracy, która prawie nie jest darmowa
SamGoody 23.04.2009
16

Jak łączyć gałęzie?

Jeśli chcesz scalić gałąź (np. masterDo release), upewnij się, że twoja obecna gałąź jest gałęzią docelową, z którą chcesz się połączyć (użyj git branchlub git statuszobacz swoją obecną gałąź).

Następnie użyj

git merge master

(gdzie masterjest nazwa gałęzi, którą chcesz scalić z bieżącą gałęzią).

Jeśli występują jakieś konflikty, możesz użyć

git diff

aby zobaczyć oczekujące konflikty, które musisz rozwiązać.

Markus Dulghier
źródło
2
Istnieje Git Fibletool, który robi trójdrożny diff z twoim ulubionym narzędziem (gvimdiff, kdiff3 lub więcej)
Dave Vogt
13

Jak widzisz historię zmian pliku?

git log -- filename
Pierre-Antoine LaFayette
źródło
12

Jak śledzić zdalne oddziały

Zakładając, że istnieje zdalne repozytorium, z którego sklonowałeś swoje lokalne repozytorium, a także zakładając, że w tym zdalnym repozytorium istnieje gałąź o nazwie „some_branch”, oto sposób lokalnego śledzenia:

# list remote branches
git branch -r

# start tracking one remote branch
git branch --track some_branch origin/some_branch

# change to the branch locally
git checkout some_branch

# make changes and commit them locally
....

# push your changes to the remote repository:
git push
innaM
źródło
Wygląda na to, że w git 1.7 zdalne gałęzie są automatycznie śledzone po utworzeniu z nich gałęzi lokalnej. Nie wiem, w której wersji to zachowanie się zaczęło.
Doppelganger
W rzeczywistości możesz wyświetlić listę wszystkich zdalnych gałęzi, używającgit remote show REMOTENAME
Felipe Sabino
10

Jak porównać dwie wersje pliku lub bieżący plik i poprzednią wersję?

Poleceniem porównania jest git diff.

Aby porównać 2 wersje pliku:

$ git diff <commit1> <commit2> <file_name>

To różni commit1 od commit2; jeśli zmienisz kolejność, pliki zostaną odwrócone, co może nie być tym, czego oczekujesz ...

Aby porównać bieżący plik przemieszczany z repozytorium:

$ git diff --staged <file_name>

Aby porównać bieżący plik niestacjonarny z repozytorium:

$ git diff <file_name>
kret
źródło
9

Dlaczego jeszcze jedno howto? W sieci są naprawdę dobre, na przykład przewodnik po git, który jest idealny na początek. Ma dobre linki, w tym książkę git do której można się przyczynić (hostowane na git hub) i która jest idealna do tego wspólnego zadania.

Jeśli chodzi o stackoverflow, naprawdę wolałbym zobaczyć twoje ulubione sztuczki!

Mój, który odkryłem niedawno, jest git stashwyjaśniony tutaj , co pozwala ci zapisać swoją obecną pracę i przejść do innej gałęzi

EDYCJA: tak jak w poprzednim poście, jeśli naprawdę wolisz format stackoverlow z postami jako wiki, usunę tę odpowiedź

Piotr Lesnicki
źródło
Nie, nie usuwaj. Twoja odpowiedź jest całkowicie poprawna - a wskazywanie innym dobrych zasobów nie jest złą rzeczą. Chciałbym również wymienić najbardziej popularne operacje tutaj wymienione, ale to trochę pracy i nie oczekuję, że inni to zrobią. Z czasem to zrobię, gdy się nauczę, i będzie to dla mnie referencja.
Adam Davis,
9

Interfejs użytkownika - Tig

Instalacja:

apt-get install tig

Stosowanie

W repozytorium git wpisz „tig”, aby wyświetlić interaktywny dziennik, naciśnij „enter” na dowolnym dzienniku, aby wyświetlić więcej informacji na jego temat. h, aby uzyskać pomoc, która zawiera podstawowe funkcje.

Drobnostki

„Tig” to „Git” do tyłu.

Dean Rather
źródło
Czy nie powinien to być „interfejs konsoli”, ponieważ „konsola” i „grafika” są trochę… sprzeczne?
dbr
jest o wiele bardziej graficzny niż git-log ... jednak jest o wiele bardziej intuicyjny ...
Dean Rather
8

Jak mogę utworzyć oddział w zdalnym repozytorium?

Zakładając, że sklonowałeś swoje zdalne repozytorium z jednego zdalnego repozytorium.

# create a new branch locally
git branch name_of_branch
git checkout name_of_branch
# edit/add/remove files    
# ... 
# Commit your changes locally
git add fileName
git commit -m Message
# push changes and new branch to remote repository:
git push origin name_of_branch:name_of_branch
innaM
źródło
11
dlaczego nazwa oddziału: nazwa oddziału?
Seun Osewa
Tak Dlaczego? O ile wiem, potrzebujesz tylko, git push origin name_of_brancha gałąź zostanie już utworzona w twoim pilocie
Felipe Sabino
pierwsza name_of_branchto nazwa lokalna, druga to (pożądana) nazwa zdalnego oddziału, więc może być tak, local_name_of_branch:remote_name_of_branchjeśli chcesz, aby nazwy były różne. Jeśli chcesz, aby były takie same, nadal musisz określić to tak, że ten b / c git nie zakłada, że ​​chcesz, aby nazwa była taka sama, chyba że to powiesz (istnieją również inne metody, aby to zrobić, jednakże)
Johnny
8

Zacząłem od oficjalnego samouczka Git . Myślę, że jest to wystarczająco praktyczne dla początkujących (z twojej definicji byłem i nadal jestem początkujący! Ledwo rozumiem pliki makefile, grałem tylko trochę z Apache Subversion itp.).

hasen
źródło
8

Jak usunąć gałąź ze zdalnego repozytorium?

Wykonaj wypchnięcie na pilocie za pomocą :przed nazwą oddziału

git push origin :mybranchname

jest originnazwą twojego pilota i mybranchnamenazwą oddziału, który ma zostać usunięty

http://help.github.com/remotes/

Felipe Sabino
źródło
7

Wciśnij i pociągnij zmiany

W uproszczony sposób po prostu zrób git pushi git pull. Zmiany są scalane, a jeśli wystąpi konflikt, git powiadomi Cię o tym i możesz rozwiązać go ręcznie.

Kiedy po raz pierwszy wypychasz do zdalnego repozytorium, musisz zrobić git push origin master(master jest gałęzią master). Od tego momentu po prostu rób git push.

Wciśnij tagi za pomocą git push --tags.

dylanfm
źródło
7

Sprawdzanie kodu

Najpierw przejdź do pustego katalogu, użyj „git init”, aby zrobić z niego repozytorium, a następnie sklonuj zdalne repozytorium do własnego.

git clone [email protected]:/dir/to/repo

Gdziekolwiek początkowo klonujesz, z którego domyślnie pobierane jest „git pull”.

Dean Rather
źródło
7
Myślę, że klon wykonuje krok inicjujący, aby usunąć potrzebę uruchomienia init najpierw. git init służy głównie do tworzenia pierwszego repozytorium lub do specjalnych konfiguracji z wieloma pilotami, które chcesz skonfigurować inaczej niż standardowy klon.
Jeremy Wall,