Git sürüm kontrolündeki yama nedir?


137

Hem git hem de sürüm kontrolü için yeniyim, bu yüzden bir yama nedir ve git'te yaptığım etkinliklerin geri kalanından nasıl farklı olduğunu anlamaya çalışıyorum?

Ne zaman bir yama uygularım? Her taahhüt ettiğimde olur mu?

Yanıtlar:


116

Bu blog yayınında nasıl bir yama oluşturabileceğinizi görebilirsiniz (iletişim kurmak ve başka bir repoya uygulamak istediğiniz değişikliklerin koleksiyonu)

git yaması
( Jan AERTS tarafından yayınlanan " Bioruby with git: nasıl çalışır? " adlı 2008 blog yazısından resim )

Ayrıca başka bir somut örnek olarak Git ile Raylara Katkı Sağlama bölümüne bakın .

Bugünlerde, GitHub çekme isteği GitHub depolarına yama uygulamayı gerçekten kolaylaştırıyor , bu doğrudan bir katılımcı olmadığınızda yararlıdır (yani doğrudan bir repoya itme hakkınız yoktur).
Aslında, son zamanlarda GitHub yeni yamaların bildirimini iyileştirmek için " Daha İyi Çekme İsteği E-postaları " nı tanıttı .


4
İyi bir cevap ve bana bir GIT 'yamasının' aradığım şey olmadığını söyleyen bir cevap.
RonLugge

91

Yama , metin dosyalarını düzeltme eki dosyası adı verilen ayrı bir dosyada bulunan yönergelere göre güncelleştiren bir Unix programıdır.

Yani, başka bir deyişle, talimatları içeren dosya veya bu dosyayı işleyen ve bir şeye uygulayan bir program anlamına gelebilir.

Şimdi, yama dosyası nedir? Diyelim ki 2 satırlı bir metin dosyanız var:

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

Sonra ilk satırı değiştirirsiniz ve şimdi dosyanız şu şekilde görünür:

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

Dosyanın içeriğindeki değişikliği nasıl tanımlarsınız? İlk satır "Bu A satırı" diyebilirsiniz. "Bu SPARTA" ile değiştirilir, hatta ilk satırın son sözcüğü olan "A" bile başka bir "SPARTA" kelimesiyle değiştirilir. Ve tam olarak fark bize bunu söyler. Diyelim ki bu dosyanın iki sürümü var, biri file1.txt ve diğeri file2.txt, sonra diff çalıştırın ve bunu olsun:

$ 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.

Değişikliklerin açıklamasını alarak, bunu ilk içeriğe uygulayabilir ve değiştirilmiş bir içerik alabilirsiniz. Ve "yama" benzeri programların anlayabileceği birleşik biçime getirilen bu değişikliklere yama dosyası denir. Sana balık tutmayı öğrettikleri birinden balık almak yerine, o balığı sulardan kendin kazabilirsin. Şimdi, patch2.txt dosyasına tam olarak benzemesi için yamamızı file1.txt dosyasına uygulayalım:

$ 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.
$ 

Bu dosyanın sadece iki sürümüne sahip olmanın daha kolay olduğunu düşünebilirsiniz. Bu basit durumda doğru. Ancak çok fazla dosyanız varsa ve bu dosyalar çok büyükse, her şeyin iki kopyası yerine birkaç satır değişiklik yapmak çok daha verimlidir.

Git açısından konuşurken, yama dosyası hala aynı anlama gelir, ancak diff + patch'i kullanmak bir kabus olur. Örneğin, bunları karşılaştırmak için her zaman dosyanın iki sürümünün (hatta tüm deponun) teslim alınmış olması gerekir. Kulağa hoş gelmiyor, değil mi? Git sizin için tüm zor işleri halleder - yerel dosyanızı çalıştığınız havuzda bulunanlarla karşılaştırır ve size "fark" olarak gösterebilir veya bu "fark" ı yama aka değişikliklerinizi yapın, hatta zaten sahip olduğunuz bazı yama dosyalarını uygulamanıza izin verin. Ayrıntılara girmeden, bu anlamda git, SVN, hatta CVS veya performans gibi diğer sürüm kontrol sistemleriyle kesinlikle aynıdır.

Umarım yardımcı olur!


Git'in yerleşik patchprogramı kullandığını hiç bilmiyordum . Git'in kendi uygulaması olduğunu düşündüm.
radiantshaw

43

Yama, bir depoda yapılan değişiklikleri gösteren küçük bir dosyadır. Genellikle ekibinizin dışından biri salt okunur erişime sahip olduğunda, ancak iyi bir kod değişikliği olduğunda kullanılır. Daha sonra bir yama oluşturur ve size gönderir. Uygula ve git deposuna aktar. Daha sonra herkes güncellenmiş sürümden yararlanır ve düzeltme ekinin yazarının okuma / yazma erişimine ihtiyacı yoktu.

Bu gerçekten bir güvenlik şeyidir (en azından insanların bunu kullanması).


1
Ek bilgi: git yamaları dahili olarak kullanmasa da, git için bir tasarım hedefi yamaları değiştirmeyi kolaylaştırmaktır (çünkü birçok proje bu şekilde çalışır, örneğin Linux ve git'in kendisi). Git'in yamaları işlemek için özel komutları vardır ( git diffdeğişiklikleri varsayılan olarak yamalar olarak gösterir, git applybir yama uygulamanızı sağlar vb.).
sleske

Congratullations! Yamaların ne için kullanıldığına, yani değişikliklerin yazarının yazma erişimine sahip olmadığı depolara değişiklik göndermeye yönelik bir aracı çivirdiniz. Bu nedenle, GitHub'ın çatal ve çekme isteği modeli, değişiklik dağıtımının yama modelinin yerini almıştır. Bu yüzden yamaların sadece GitHub gibi araçların bağlamı dışında yararlı olduğuna inanıyorum.
mljrg

8

Yama dosyası, herhangi bir sıraya herhangi bir sırada uygulanabilecek tek bir değişiklik kümesini temsil eder. Düzeltme ekini kullanarak bir veya daha fazla dosya arasında farklar elde edersiniz. Ve daha sonra, yeni dosyalarda değişiklikleri almak için farklılıkları (yama) uygulayabilirsiniz. Git'te bir yama için birçok kullanım alanı vardır. Çalışma dizininizde taahhüt edilmemiş değişiklikleriniz varsa ve bu değişiklikleri başka bir yere uygulamak için almanız gerekiyorsa, bir yama oluşturun ve yamayı uygulayın.

git diff > mypatch.patch

Deponuzda (izlenmemiş) yeni dosyalarınız varsa, düzeltme eki oluşturmadan (işleme koymayın) önce dosyayı hazırlamalı ve aşağıdaki komutu kullanmalısınız

git diff --cached > mypatch.patch 

Daha sonra yamayı uygulayabilirsiniz:

git apply mypatch.patch

Git deposunda bazı değişiklikler yapmak istiyorsanız, yazma izniniz yok, sadece değişiklikleri yapın ve her ikisi arasında bir yama oluşturun ve yamayı yama uygulama iznine sahip birine gönderin. değişiklikleriniz o git deposuna eklenmelidir.


Daha iyi demolar: robots.thoughtbot.com/… . Temel örnek git format-patch <base_commit_or_branch_name>özetim : = bugüne kadar <base_commit_or_branch_name> 'ye kadar olan tüm taahhütleri, diff ve taahhüt mesajlarını içeren güzel ve temiz dosyalara sarın, bunları yamalamak isteyen birisine kolayca göndermek için (ör: e-posta yoluyla) kod tabanları. Daha sonra alıcı, sisteminizi dosyanızla yamalı:cat *.patch | git am
Gabriel Staples

7

Yama, aralarında neyin farklı olduğunu göstermek için bir veya daha fazla dosya arasındaki farklar kümesidir. Genellikle birisine neyi değiştirdiğinizi göstermek için bir düzeltme eki oluşturursunuz. Bunu ne zaman yapabileceğinize bir örnek, açık kaynaklı bir uygulamada bir hatayı bulup düzelttikten sonra düzeltmeyi hata izleyicisine yüklediğinizdir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.