Co to jest poprawka w kontroli wersji git?

136

Nie mam doświadczenia z kontrolą wersji i git, więc próbuję dowiedzieć się, czym jest łatka i czym różni się od pozostałych czynności, które wykonuję w git?

Kiedy mam zastosować łatkę? Czy to się dzieje za każdym razem, gdy się angażuję?

Amit Erandole
źródło

Odpowiedzi:

116

W tym poście na blogu możesz zobaczyć, jak możesz stworzyć łatkę (zbiór zmian, które chcesz przekazać i zastosować w innym repozytorium)

git patch
(zdjęcie z wpisu na blogu „ Bioruby with git: jak by to działało? ” z 2008 roku opublikowanego przez Jana AERTS )

Zobacz także Współtworzenie Railsów z Gitem jako kolejny konkretny przykład.

W dzisiejszych czasach żądanie ściągnięcia GitHub sprawia, że ​​bardzo łatwo jest zastosować łaty w repozytoriach GitHub, co jest przydatne, gdy nie jesteś bezpośrednim współpracownikiem (tj. Nie masz prawa bezpośrednio wypychać do repozytorium).
Właściwie całkiem niedawno GitHub wprowadził „ Better Pull Request Email ”, aby usprawnić powiadamianie o nowych poprawkach.

VonC
źródło
4
Dobra odpowiedź, która mówi mi, że „łatka” GIT nie jest tym, czego szukam.
RonLugge,
91

Patch to program uniksowy, który aktualizuje pliki tekstowe zgodnie z instrukcjami zawartymi w oddzielnym pliku, zwanym plikiem poprawki.

Innymi słowy, może to oznaczać plik z instrukcjami lub program, który przetwarza ten plik i stosuje go do czegoś.

Co to jest plik poprawki? Załóżmy, że masz plik tekstowy z 2 liniami:

This is line A.
This is line B, or otherwise #2.

Następnie zmieniasz pierwszą linię, a teraz twój plik wygląda tak:

This is SPARTA.
This is line B, or otherwise #2.

Jak opisałbyś zmianę w zawartości pliku? Możesz powiedzieć, że pierwsza linia to „To jest linia A.” został zastąpiony słowem „To jest SPARTA.” lub nawet ostatnie słowo „A” pierwszej linii zastąpione innym słowem „SPARTA”. I to jest dokładnie to mówi nam diff . Powiedzmy, że mam dwie wersje tego pliku, jedną o nazwie plik1.txt, a drugą plik2.txt, a następnie uruchamiam diff i otrzymuję to:

$ diff -u file1.txt file2.txt 
--- file1.txt   2011-11-26 11:07:03.131010360 -0500
+++ file2.txt   2011-11-26 11:07:13.171010362 -0500
@@ -1,2 +1,2 @@
-This is line A.
+This is SPARTA.
 This is line B, or otherwise #2.

Mając opis zmian, możesz zastosować go do treści początkowej i uzyskać zmodyfikowaną treść. Te zmiany, wprowadzone w ujednoliconym formacie zrozumiałym dla programów przypominających „łatkę”, nazywane są plikiem poprawki. To tak, jakby zamiast kupować rybę od kogoś, kogo nauczy Cię łowić, abyś mógł sam wykopać tę rybę z wody. Teraz zastosujmy naszą poprawkę do pliku1.txt, aby wyglądał dokładnie tak, jak plik2.txt:

$ cat file1.txt 
This is line A.
This is line B, or otherwise #2.
$ cat file2.txt 
This is SPARTA.
This is line B, or otherwise #2.
$ diff -u file1.txt file2.txt > changes.patch
$ cat changes.patch 
--- file1.txt   2011-11-26 11:09:38.651010370 -0500
+++ file2.txt   2011-11-26 11:07:13.171010362 -0500
@@ -1,2 +1,2 @@
-This is line A.
+This is SPARTA.
 This is line B, or otherwise #2.
$ patch < changes.patch 
patching file file1.txt
$ cat file1.txt 
This is SPARTA.
This is line B, or otherwise #2.
$ 

Możesz pomyśleć, że łatwiej jest mieć tylko dwie wersje tego pliku. Cóż, w tym prostym przypadku to prawda. Ale kiedy masz dużo plików, a te pliki są bardzo duże, o wiele bardziej wydajne jest wprowadzenie kilku wierszy zmian niż dwóch kopii całości.

Mówiąc w kategoriach gita, plik łatki nadal oznacza to samo, ale samodzielne używanie diff + patch byłoby koszmarem. Na przykład, zawsze będziesz musiał mieć wypisane dwie wersje pliku (lub nawet całe repozytorium), aby je porównać. Nie brzmi tak dobrze, prawda? Więc git zajmie się całą ciężką pracą za Ciebie - porównuje twój lokalny plik z tym, co jest w repozytorium, z którym pracujesz i może pokazać ci go jako "różnicę" lub zastosować ten "różnicę" jako patch, czyli zatwierdzenie zmian, a nawet pozwolenie na zastosowanie jakiegoś pliku poprawki, który już masz. Bez wchodzenia w szczegóły, w tym sensie git jest absolutnie taki sam, jak inne systemy kontroli wersji, takie jak SVN, a nawet CVS lub konieczność.

Mam nadzieję, że to pomoże!


źródło
Nigdy nie wiedziałem, że git używa wbudowanego patchprogramu. Myślałem, że git ma swoją własną implementację.
radiantshaw
43

Łatka to mały plik, który wskazuje zmiany dokonane w repozytorium. Zwykle jest używany, gdy ktoś spoza zespołu ma dostęp tylko do odczytu, ale ma dostęp do dobrej zmiany kodu. Następnie tworzy łatkę i wysyła ją do Ciebie. Stosujesz go i wypychasz do repozytorium git. Wszyscy odnoszą korzyści z zaktualizowanej wersji, a autor poprawki nie potrzebował dostępu do odczytu / zapisu.

Tak naprawdę jest to głównie kwestia bezpieczeństwa (przynajmniej do tego ludzie go używają).

Tom van der Woerdt
źródło
1
Dodatkowe informacje: Chociaż git nie używa poprawek wewnętrznie, jednym z celów projektowych dla git jest ułatwienie wymiany łat (ponieważ wiele projektów działa w ten sposób, np. Linux i sam git). Więc git ma specjalne polecenia do obsługi łatek ( git diffdomyślnie pokazuje zmiany jako łaty, git applypozwala na zastosowanie łaty itp.).
sleske
Gratulacje! Naprawdę zrozumiałeś, do czego służą łatki, czyli sposób przesyłania zmian do repozytoriów, do których autor zmian nie ma prawa zapisu. W związku z tym model żądania rozwidlenia i ściągnięcia usługi GitHub zastępuje model dystrybucji zmian z poprawkami. Dlatego uważam, że poprawki są przydatne tylko poza kontekstem narzędzi takich jak GitHub.
mljrg
8

Plik poprawki reprezentuje pojedynczy zestaw zmian, które można zastosować do dowolnej gałęzi w dowolnej kolejności. Używając łatki, uzyskasz różnice między jednym lub wieloma plikami. Później możesz zastosować różnice (łatkę), aby uzyskać zmiany w nowych plikach. Łatka w Git ma wiele zastosowań. Jeśli masz niezatwierdzone zmiany w katalogu roboczym i chcesz je zastosować w innym miejscu, po prostu utwórz poprawkę i zastosuj ją.

git diff > mypatch.patch

Jeśli masz nowe pliki w swoim repozytorium (nieśledzone), powinieneś przygotować plik przed utworzeniem łatki (nie zatwierdzaj) i użyj następującego polecenia

git diff --cached > mypatch.patch 

Możesz później zastosować łatkę:

git apply mypatch.patch

Jeśli chcesz dokonać pewnych zmian w repozytorium git, a nie masz uprawnień do zapisu, po prostu wprowadź zmiany i utwórz łatkę między nimi i wyślij ją do kogoś, kto ma uprawnienia do zastosowania łatki, w ten sposób Twoje zmiany powinny zostać dodane do tego repozytorium git.

Anuraj
źródło
Lepsze wersje demonstracyjne: robots.thoughtbot.com/… . Moje podstawowe przykładowe podsumowanie: git format-patch <base_commit_or_branch_name>= zapakuj wszystkie zatwierdzenia od teraz z powrotem do <base_commit_or_branch_name> w ładne i zgrabne pliki zawierające różnice, a także komunikaty o zmianach, w celu łatwego wysłania (np. E-mailem) do kogoś, kto chce je załatać ich kod źródłowy. Następnie odbiorca łata swój system za pomocą twojego pliku:cat *.patch | git am
Gabriel Staples
7

Łatka to zestaw różnic między jednym lub większą liczbą plików, aby pokazać, co się między nimi różni. Zwykle generowałbyś tylko łatkę, aby pokazać komuś, co zmieniłeś. Przykładem sytuacji, w której możesz to zrobić, jest znalezienie i naprawienie błędu w aplikacji typu open source, a następnie opublikowanie poprawki w ich narzędziu do śledzenia błędów.

Steve Rukuts
źródło