Geçerli çalışma dizinindeki değişikliklerden bir git yaması oluşturma


879

Çalışma dizinimde onaylanmamış değişikliklerim olduğunu varsayalım. Bir taahhüt oluşturmak zorunda kalmadan nasıl bir yama yapabilirim?


29
İkinci cevabın neredeyse dört kat daha popüler olması nedeniyle, kabul edilen cevap muhtemelen değiştirilmelidir.
Tim Ogilvy

5
@TimOgilvy kabul etti. OP yapmalı. İkinci cevap çok daha popüler ve daha fazla bilgi veriyor
John Demetriou

1
Ben de başlıkta taahhüt edilmemiş değişikliklerden yama gerekir bahsetmeye değer olduğunu düşünüyorum.
2i3r

Yanıtlar:


401

git diffdeğişmemiş değişiklikler için. git diff --cachedaşamalı değişiklikler için.


12
yup, git diff git uygulamasının tersidir
Spike Gronim

33
git format-patchayrıca ikili diffs ve bazı meta bilgileri içerir. Aslında bu bir yama oluşturmak için en iyi seçenektir, ancak afaik bu sadece kontrol edilen kaynaklar / değişiklikler için işe yarar, değil mi?
Eric

20
Bazen geçerli dizine göre bir yama oluşturmak yararlı olabilir. Bunu başarmak için kullanıngit diff --relative
ejboy

30
git diff> a.patch bir dosyaya yazmak için
qasimzee

139
Alaycı sınırda, aşağıdaki cevap daha yararlıdır.
Air

1865

Değişiklikleri henüz yapmadıysanız, o zaman:

git diff > mypatch.patch

Ancak bazen yaptığınız şeylerin bir kısmı izlenmeyen ve git diffçıktınızda olmayacak yeni dosyalardır . Bu nedenle, bir yama yapmanın bir yolu, her şeyi yeni bir taahhüt ( git addher dosya veya sadece git add .) için hazırlamaktır, ancak taahhütte bulunmayın ve sonra:

git diff --cached > mypatch.patch

Düzeltme ekine ikili dosyalar (örn. Mp3 dosyaları) eklemek istiyorsanız 'ikili' seçeneğini ekleyin:

git diff --cached --binary > mypatch.patch

Daha sonra yamayı uygulayabilirsiniz:

git apply mypatch.patch

Not: ile --stagedeş anlamlı olarak da kullanabilirsiniz --cached.


128
Örnek için çok teşekkür ederim. Kabul edilen cevabın aksine, komutları sadece nasıl konuşacağınızı değil, nasıl yapacağınızı gösterirsiniz. Çok yararlı ve benim için kusursuz çalıştı :)
nuala

4
Ben tam olarak yaptım ve git uygula "ölümcül: tanınmayan girdi" var. Buna neyin neden olabileceği ve nasıl düzeltileceği hakkında bir fikrin var mı?
Vitaly

6
@Vitaly: bir metin düzenleyicisiyle açarsanız yamanız okunabilir mi? garip karakterler olmadan temiz olmalıdır, örneğin color.diff ayarı ayarlanmışsa, yamanızda 'git uygula' nın başarısız olmasına neden olabilecek bazı 'renkli karakterler' olacaktır, bu durumda deneyin git diff --no-color. Aksi takdirde, kodlama sorununa benziyor.
jcarballo

3
"İzlenmeyen yeni dosyalar" ile ilgili: "git diff" ve "git diff --cached" yalnızca önce "git add <file>" çağrıldıysa çalışır. (Gitmek için yeniyim ve neden her zaman boş bir yama aldığımı merak ettim)
Anonim

5
Bu beni çok kolay bir garip birleştirme / rebase cehennemden çıkardı, teşekkürler :)
John Hunt

86

git diffve git applymetin dosyaları için çalışır, ancak ikili dosyalar için çalışmaz.

Kolayca tam bir ikili yama oluşturabilirsiniz, ancak geçici bir taahhüt oluşturmanız gerekecektir. Geçici taahhütlerinizi yaptıktan sonra, yama ile aşağıdakileri oluşturabilirsiniz:

git format-patch <options...>

Düzeltme ekini yaptıktan sonra şu komutu çalıştırın:

git reset --mixed <SHA of commit *before* your working-changes commit(s)>

Bu geçici taahhütlerinizi geri alacaktır. Nihai sonuç, çalışma kopyanızı (kasıtlı olarak) başlangıçta yaptığınız değişikliklerle kirletir.

Alıcı tarafta, taahhüt geçmişine sahip olmadan değişiklikleri çalışma kopyasına uygulamak için aynı hileyi kullanabilirsiniz. Sadece yamaları uygulayın ve git reset --mixed <SHA of commit *before* the patches>.

Tüm bu seçeneğin çalışması için iyi senkronize edilmesi gerekebileceğini unutmayın. Yamaları uygularken, benim yaptığım kadar fazla değişiklik yapmadığı zaman bazı hatalar gördüm. Muhtemelen işe yaraması için yollar var, ama çok fazla bakmadım.


Tortoise Git'te aynı yamaları nasıl oluşturacağınız aşağıda açıklanmıştır (bu aracı kullanmanızı tavsiye etmiyorum):

  1. Çalışma değişikliklerinizi yapın
  2. Şube kök dizinine sağ tıklayın ve Tortoise Git->Create Patch Serial
    1. Hangi aralığın anlamlı olduğunu seçin ( Since: FETCH_HEADiyi senkronize edildiyseniz çalışır)
    2. Yamaları oluşturma
  3. Şube kök dizinine sağ tıklayın ve Tortise Git->Show Log
  4. Geçici işlem (ler) inizden önce taahhüdü sağ tıklayın ve ardındanreset "<branch>" to this...
  5. seç Mixedseçeneğini

Ve nasıl uygulanır:

  1. Şube kök dizinine sağ tıklayın ve Tortoise Git->Apply Patch Serial
  2. Doğru yama (ları) seçin ve uygulayın
  3. Şube kök dizinine sağ tıklayın ve Tortise Git->Show Log
  4. Düzeltme ekinin işlem (ler) inden önce bildirimi sağ tıklatın vereset "<branch>" to this...
  5. seç Mixedseçeneğini

5
Teknik olarak bu, OP'nin kaçınmak istediği bir taahhüt oluşturmayı gerektirir, ancak bu geçici bir işlemdir ve cevap ne olursa olsun yararlıdır.
davenpcj

33

Hem değiştirilmiş hem de yeni dosyalarla (aşamalı) bir yama oluşturmak için şunları çalıştırabilirsiniz:

git diff HEAD > file_name.patch

Teşekkürler, benim durumumda, bu cevap işe yarıyor, ama git diff --cached > mypatch.patchçalışmıyor.
madencilik

Bir sorum var: komut file_name.patchtarafından kullanılabilir patch? Birbirleriyle uyumlu mu?
Rakshith Ravi

diff + diff --cached / sahnelenen == diff BAŞ (son tamamlama beri tüm değişiklikleri göster)
K. Sembol

20

Severim:

git format-patch HEAD~<N>

nerede <N>yamalar olarak kaydetmek için son kaydedilmesini sayısıdır.

Komutun nasıl kullanılacağına ilişkin ayrıntılar DOC'ta

UPD
Burada bunları nasıl uygulayacağınızı bulabilirsiniz.

UPDformat-patch
Takma ad ekle fikrini alamayanlar için :

git config --global alias.make-patch '!bash -c "cd ${GIT_PREFIX};git add .;git commit -m ''uncommited''; git format-patch HEAD~1; git reset HEAD~1"'

Ardından proje deponuzun herhangi bir dizininde çalıştırın:

git make-patch

Bu komut 0001-uncommited.patchgeçerli dizininizde oluşturulur. Yama, bir sonraki komutta görülebilen tüm değişiklikleri ve izlenmeyen dosyaları içerecektir:

git status .

@jcarballo: Cevabı güncelledim. Bana bildirimlerinizi bırakmaktan çekinmeyin.
Eugen Konkov

2
Taahhüt ve uncompiting oluşturmaktan daha basit bir yol var. git diff --cached --binary
Gaurav Agarwal

9

İkili yapmak --binaryistiyorsanız, çalıştırdığınızda bir seçenek verin git diff.


0

Dosyaları, yalnızca göreli değişikliklere sahip dosyaları, özellikle de birden fazla dizine yayıldıklarında dahil edilecek şekilde belirtebiliriz.

git diff ~/path1/file1.ext ~/path2/file2.ext...fileN.ext > ~/whatever_path/whatever_name.patch

Bunun ilgili veya doğru olan cevaplarda veya yorumlarda belirtilmediğini buldum, bu yüzden eklemeyi seçtim. Açık, örtük olmaktan iyidir!

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.