'Git format-patch ve' git diff 'arasındaki fark nedir?


92

'Git format-patch' ile 'git diff' arasında bir fark görmüyorum, var mı? Ve bir yama oluşturmak için 'git diff' kullanıp git apply kullanarak uygulayamayacak mıyım?

Benim sorunum, dizine eklenmiş değişikliklerim olması, ancak görünüşe göre git format-patch yalnızca taahhütleri kabul ediyor, bu nedenle diff çıktısını kullanabilirsem, dizindeki değişiklikler için bir yama oluşturmak için bu komutu kullanabilirim:

git diff --cached > index.patch

Yanıtlar:


130

İle oluşturulan bir yama git format-patchayrıca commit ile ilgili bazı meta bilgileri (committer, date, commit message, ...) içerecek ve farklı ikili veri içerecektir. Kolayca gönderilebilmesi için her şey posta olarak biçimlendirilecek. Bunu alan kişi daha sonra ilgili kaydı ile yeniden oluşturabilir git amve tüm meta veriler bozulmadan kalır . git applyBasit bir farkın süper kümesi olduğu için de uygulanabilir .

Bir yama git diff, bağlam (düşünmek diff -u) ile basit bir fark olacaktır . Bununla birlikte de uygulanabilir, git applyancak meta veriler yeniden oluşturulmayacaktır (mevcut olmadıkları için).

Özet olarak, git format-patchbir commit iletmek için kullanışlıdır, ancak git diffiki ağaç arasında bir fark elde etmek için kullanışlıdır.


13

Kılavuzlardan git-format-patch , e-posta gönderimi için uygun yamalar hazırlarken git-diff değişiklikleri gösterir.

Bunlar iki farklı şeydir ve farklı amaçları vardır, sadece bir yama formatı çıkarırlar. Ancak git-format-patchbir commit (tarih, yazar, commit mesajı) hakkındaki verileri ekler ve bunu bir Unix posta mesajı olarak göndermeye uygun bir formatta paketler (bunlar sadece dosyalardır, böylece diğer metotlara gönderilebilir ve yine de uygulanabilir) git-am).

Ayrıca git-format-patchbelirlediğiniz aralıktaki her kaydetme için bir yama dosyası oluşturur. Bu değişiklikler ile deponuza kayıtlar olarak eklenecektir git-am.

git-diffsadece istediğiniz iki durum arasındaki farkı gösterir ve bir yama dosyası oluşturmak için kullanılabilir. Ancak bu sadece normal bir yama dosyasıdır ve yamayı uygulamak sadece çalışma dizininin durumunu değiştirecektir.

Ve evet, bu şekilde dizininiz için bir yama oluşturabilirsiniz.


Teşekkürler. Yamayı buna göre tasarlamaları için UNIX postasını özel kılan nedir?
Rafid

7
Gerçekten özel bir şey yok. Bu sadece git, Linux çekirdeğine entegrasyondan önce doğrulama için e-posta yoluyla yama göndermeyi ve almayı içeren iş akışı Linus Torvalds tarafından tasarlandı.
Sylvain Defresne

Git, Linus Torvalds tarafından Linux çekirdeğini içeride tutmak için tasarlandı . Unix postası yaygın bir formattı.
Abizern

1

Yama dosyası git diffkomutla oluşturulabilir , ancak git format-patchkomut tarafından oluşturulan yama ile karşılaştırıldığında başlıca farklar şunlardır:

  1. Bir kaydetme hakkında meta veri yok (tarih, yazar, kaydetme mesajı vb.);
  2. Fark hakkında istatistik yok (diffstat, örneğin x dosya değişti, y ekleme (+), z silme (-));
  3. İkili fark yok, sadece metinsel farklar.

görüntü açıklamasını buraya girin

Tüm değiştirilen dosyalar için yama dosyası oluşturmak için (dizinde veya çalışma dizininde):

git diff HEAD --binary > my.patch
# git diff + git diff --cached/staged == git diff HEAD

Oluşturulan yama dosyasını uygulamak için:

# restore the changed files firstly
git restore --staged .
git restore .

# apply the patch to redo the changes 
git apply my.patch
# or
patch -p1 < my.patch
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.