2009-06-04 19 views
49

Właśnie zacząłem używać Gita wraz z Mercurialem, aby zapoznać się z Git.git odpowiednik hg mq?

Używam rozszerzenia mq w Mercurial, aby zarządzać lokalnymi poprawkami i szukam odpowiednika Git.

Czy powinienem użyć tylko oddziału Git? A może istnieją lepsze sposoby zarządzania lokalnymi poprawkami, które umożliwiają łatwe stosowanie i usuwanie poprawek?

Dzięki,

+0

Rzecz w tym, że potrzebujemy czegoś takiego w bardzo rzadkiej sytuacji. – shabunc

Odpowiedz

28

Zobacz sekcję "Interfejsy zarządzania łatkami" na stronie Git Wiki na stronie Interfaces, Frontends And Tools. Tam są wymienione dwa interfejsy zarządzania poprawkami grubsza odpowiednik „MQ” rtęciowe przedłużenie:

  • StGIT (Ułożone GIT), starszy z nich, napisany w Pythonie, wykorzystuje dwa zrzuty do reprezentowania plaster
  • Guilt (wcześniej "gq"), napisane jako seria skryptów bash, plik serii i łatki (jeden na plik) są przechowywane jako plik tekstowy.
  • pg (Niewielkie Git) to przestarzałe i nie jest już konserwowane.

Ale jeśli nie potrzebujesz bardziej zaawansowanego użycia, możesz zamiast tego użyć "git rebase --interactive" do zmiany kolejności, zgniatania i dzielenia łat. I aby zarządzać swoją gałęzią przeciw aktualnej wersji upstream, zwykle wystarczy "git rebase".

+1

Czy potrafisz wymienić jedno z tych "zaawansowanych zastosowań"? Myślę, że 'git rebase --interactive' praktycznie eliminuje potrzebę czegoś takiego jak Mq. – kizzx2

+7

** @ kizzx2: ** 'git rebase --interactive' zmusza cię do poradzenia sobie z całą serią w sekwencji. Dzięki interfejsom do zarządzania poprawkami możesz łatwo przechodzić między opcjami, aby je edytować. Możesz również przejrzeć historię zmian w łatce, dodać nowe zatwierdzenie w środku serii, wybrać inne zatwierdzenie, itd. –

+1

@jakub, czy 'git checkout' nie pozwala na przełączanie się między zatwierdzeniami? Co jest tak łatwe w zarządzaniu łatami. Cały sens git, to że chodzenie przez commits jest łatwe. –

7

Git tak naprawdę nie udostępnia tej funkcji. W zależności od twoich zastosowań, możesz być w stanie przetrwać dzięki "git stash" i/lub oddziałom, ale będzie to całkiem proste. Jeśli ludzie mają bardziej zaawansowane potrzeby zarządzania poprawkami z git, wydają się zwracać do Quilt lub StGit: zobacz http://git.or.cz/gitwiki/PatchManagement

9

Po prostu używaj oddziału i regularnie zmieniaj go w swoją gałąź. Jest to łatwiejsze w zarządzaniu i bezpieczniejsze niż używanie mq (do którego straciłem dane w przeszłości).

31

Nota prawna: Nie jestem użytkownikiem hg, więc przeczytałem o hg, ale nie mam zbyt dużego doświadczenia z jej używania.

git dostarcza kilku bardzo potężnych i elastycznych narzędzi do zarządzania oddziałami w stylu 'kolejki łatek', więc dla wielu podstawowych (a nawet dość złożonych) przypadków użycia, rodzimy git jest wystarczająco potężny.

Zazwyczaj większość projektów utrzymuje centralny stały oddział główny, który tylko zyskuje nowe zatwierdzenia i nigdy nie jest "przewijany", więc zatwierdzenia w gałęzi głównej są stałe. Ponadto, opiekun (lub programista) może utrzymywać jedną lub więcej płynnych gałęzi łatek roboczych w toku (tj. Zatwierdzeń) opartych na stabilnym odgałęzieniu.

typowych działań zarządza plastra są:

przebazowania kolejkę plastra najnowszą stabilnej - stosować git rebase,

powielenie kolejkę plastra starej maintentance gałęzi - stosować git branch i git rebase,

zmiana kolejności poprawek w kolejce - użyj git rebase --interactive (alias git rebase -i) za pomocą edytora tekstu, aby zmienić kolejność kolejki.

zgniecenia łaty - użyj git rebase -i z dyrektywą squash

poprawki zmieniające lub łata popełnić wiadomości - użyj git rebase -i (spot motyw?) Z dyrektywą edycji.

Każda czynność, która w jakikolwiek sposób zmieni łatkę (tj. Jej zawartość, opis lub pochodzenie), utworzy nowe zatwierdzenie z nowym identyfikatorem zatwierdzenia dla tej poprawki. Fakt, że stare commity mogą być wyrzucane i regularnie wymieniane przed awansem do stabilnej gałęzi głównej, jest jedyną rzeczą, która czyni je "kolejką łatki", a nie odgałęzieniem, ale jest to raczej konwencja projektu niż jakakolwiek fizyczna różnica w danych, które składają się na zatwierdzenia. Aby git są identyczne obiekty.

Aby promować poprawkę do "prawdziwego" zatwierdzenia, wystarczy przenieść poprawkę na wierzch kolejki i połączyć ją w gałąź główna. Po przeniesieniu łaty do przodu kolejki, jest to to samo, co normalne zatwierdzenie oparte na gałęzi głównej, więc połączenie go po prostu przeskakuje wskaźnik gałęzi głównej do punktu zatwierdzenia poprawki.

Opublikowanie tego zatwierdzenia jako "stabilnej" poprawki głównej to akt, który mówi: to jest zobowiązanie, które się nie zmieni i jest częścią niezmiennej historii projektu.

+0

Generalnie używam Mercurial, ale jest to prawdopodobnie najlepszy opis racjonalnego działania, z którym miałem do czynienia. Dzięki! :) – rpjohnst

+2

Jedną z funkcji Mercurial Queues, których intensywnie używam w jednym projekcie, jest "eksportowanie" ich przez skopiowanie katalogu .hg/patches. Możliwość przechowywania i zarządzania łatami zewnętrznymi z repozytorium ma kluczowe znaczenie. Wprawdzie to użycie jest bardzo nietypowe, ale czy git ma coś, co zapewnia podobną funkcjonalność? –

+0

@PaulMoore Po prostu zrób łatkę "git format-patch" na łatkach, które chcesz wyeksportować, ewentualnie nawet zapisz je do pliku mbox, jeśli chcesz, możesz więc zrobić "git am" na nim, aby zastosować wszystkie naraz . – kyrias