Çalışma dizinimde onaylanmamış değişikliklerim olduğunu varsayalım. Bir taahhüt oluşturmak zorunda kalmadan nasıl bir yama yapabilirim?
Çalışma dizinimde onaylanmamış değişikliklerim olduğunu varsayalım. Bir taahhüt oluşturmak zorunda kalmadan nasıl bir yama yapabilirim?
Yanıtlar:
git diff
değişmemiş değişiklikler için. git diff --cached
aşamalı değişiklikler için.
git format-patch
ayrı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?
git diff --relative
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 add
her 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 --staged
eş anlamlı olarak da kullanabilirsiniz --cached
.
git diff --no-color
. Aksi takdirde, kodlama sorununa benziyor.
git diff
ve git apply
metin 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):
Tortoise Git
->Create Patch Serial
Since
: FETCH_HEAD
iyi senkronize edildiyseniz çalışır)Tortise Git
->Show Log
reset "<branch>" to this...
Mixed
seçeneğiniVe nasıl uygulanır:
Tortoise Git
->Apply Patch Serial
Tortise Git
->Show Log
reset "<branch>" to this...
Mixed
seçeneğiniHem 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
git diff --cached > mypatch.patch
çalışmıyor.
file_name.patch
tarafından kullanılabilir patch
? Birbirleriyle uyumlu mu?
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.patch
geçerli dizininizde oluşturulur. Yama, bir sonraki komutta görülebilen tüm değişiklikleri ve izlenmeyen dosyaları içerecektir:
git status .
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!