Buat tambalan git dari perubahan dalam direktori kerja saat ini
880
Katakanlah saya memiliki perubahan yang tidak dikomit di direktori kerja saya. Bagaimana saya bisa membuat tambalan dari mereka tanpa harus membuat komit?
yup, git diff adalah kebalikan dari git yang berlaku
Spike Gronim
33
git format-patchjuga termasuk diff biner dan beberapa info meta. Sebenarnya itu akan menjadi taruhan terbaik untuk membuat tambalan, tetapi afaik ini hanya berfungsi untuk memeriksa sumber / perubahan, bukan?
Eric
20
Terkadang mungkin berguna untuk membuat tambalan relatif ke direktori saat ini. Untuk mencapai ini, gunakangit diff --relative
ejboy
30
git diff> a.patch untuk menulisnya ke file
qasimzee
139
Terse berbatasan dengan sarkastik, jawaban di bawah ini lebih bermanfaat.
Air
1865
Jika Anda belum melakukan perubahan, maka:
git diff > mypatch.patch
Tetapi kadang-kadang terjadi bahwa sebagian dari hal-hal yang Anda lakukan adalah file baru yang tidak terlacak dan tidak akan di git diffoutput Anda . Jadi, salah satu cara untuk melakukan patch adalah dengan mem-stage semua untuk komit baru ( git addsetiap file, atau hanya git add .) tetapi tidak melakukan komit, dan kemudian:
git diff --cached > mypatch.patch
Tambahkan opsi 'biner' jika Anda ingin menambahkan file biner ke tambalan (mis. File mp3):
git diff --cached --binary > mypatch.patch
Anda nanti dapat menerapkan tambalan:
git apply mypatch.patch
Catatan: Anda juga dapat menggunakan --stagedsinonim dari --cached.
Terima kasih banyak untuk contohnya. Berbeda dengan jawaban yang diterima Anda menunjukkan perintah bagaimana melakukannya dan tidak hanya berbicara. Sangat membantu dan bekerja tanpa cacat untuk saya :)
nuala
4
Saya melakukan hal itu dan mendapat "input fatal: tidak dikenal" setelah mengeksekusi git berlaku. Adakah yang tahu apa yang menyebabkan ini dan bagaimana cara memperbaikinya?
Vitaly
6
@Vitaly: apakah tambalan Anda dapat dibaca jika Anda membukanya dengan editor teks? itu harus bersih tanpa karakter aneh, misalnya jika pengaturan color.diff diatur patch Anda akan memiliki beberapa 'karakter warna' yang dapat membuat 'git apply' gagal, dalam hal ini coba git diff --no-color. Kalau tidak, sepertinya masalah penyandian.
jcarballo
3
Terkait dengan "file baru yang tidak dilacak": "git diff" dan "git diff --cached" hanya berfungsi jika "git add <file>" telah dipanggil terlebih dahulu. (Saya baru git dan bertanya-tanya mengapa saya mendapat patch kosong setiap kali)
Anonymous
5
Ini membuat saya keluar dari neraka penggabungan / rebase yang aneh dengan mudah, terima kasih :)
John Hunt
86
git diffdan git applyakan bekerja untuk file teks, tetapi tidak akan bekerja untuk file biner.
Anda dapat dengan mudah membuat tambalan biner penuh, tetapi Anda harus membuat komit sementara. Setelah Anda membuat komit sementara, Anda dapat membuat tambalan dengan:
git format-patch <options...>
Setelah Anda membuat tambalan, jalankan perintah ini:
git reset --mixed <SHA of commit *before* your working-changes commit(s)>
Ini akan mengembalikan komit sementara Anda. Hasil akhir membuat copy pekerjaan Anda (sengaja) kotor dengan perubahan yang sama seperti yang Anda alami sebelumnya.
Di sisi penerima, Anda dapat menggunakan trik yang sama untuk menerapkan perubahan pada copy pekerjaan, tanpa memiliki riwayat komit. Cukup terapkan tambalan, dan git reset --mixed <SHA of commit *before* the patches>.
Perhatikan bahwa Anda mungkin harus disinkronkan dengan baik agar seluruh opsi ini berfungsi. Saya telah melihat beberapa kesalahan ketika menerapkan tambalan ketika orang yang membuatnya tidak menarik sebanyak yang saya miliki. Mungkin ada cara untuk membuatnya bekerja, tetapi saya belum melihat jauh ke dalamnya.
Inilah cara membuat tambalan yang sama di Tortoise Git (bukan yang saya sarankan menggunakan alat itu):
Komit perubahan pekerjaan Anda
Klik kanan direktori root cabang dan klik Tortoise Git->Create Patch Serial
Pilih rentang mana yang masuk akal ( Since: FETCH_HEADakan berfungsi jika Anda disinkronkan dengan baik)
Buat tambalan
Klik kanan direktori root cabang dan klik Tortise Git->Show Log
Klik kanan komit sebelum komit sementara Anda, dan klikreset "<branch>" to this...
Pilih Mixedopsi
Dan bagaimana cara menerapkannya:
Klik kanan direktori root cabang dan klik Tortoise Git->Apply Patch Serial
Pilih tambalan yang benar dan terapkan
Klik kanan direktori root cabang dan klik Tortise Git->Show Log
Klik kanan komit sebelum komit patch, dan klikreset "<branch>" to this...
Kemudian di direktori mana pun repositori proyek Anda berjalan:
git make-patch
Perintah ini akan dibuat 0001-uncommited.patchdi direktori Anda saat ini. Patch akan berisi semua perubahan dan file yang tidak terlacak yang terlihat oleh perintah selanjutnya:
Saya menemukan ini tidak ditentukan dalam jawaban atau komentar, yang semuanya relevan dan benar, jadi pilih untuk menambahkannya. Eksplisit lebih baik daripada implisit!
Jawaban:
git diff
untuk perubahan yang tidak dipentaskan.git diff --cached
untuk perubahan bertahap.sumber
git format-patch
juga termasuk diff biner dan beberapa info meta. Sebenarnya itu akan menjadi taruhan terbaik untuk membuat tambalan, tetapi afaik ini hanya berfungsi untuk memeriksa sumber / perubahan, bukan?git diff --relative
Jika Anda belum melakukan perubahan, maka:
Tetapi kadang-kadang terjadi bahwa sebagian dari hal-hal yang Anda lakukan adalah file baru yang tidak terlacak dan tidak akan di
git diff
output Anda . Jadi, salah satu cara untuk melakukan patch adalah dengan mem-stage semua untuk komit baru (git add
setiap file, atau hanyagit add .
) tetapi tidak melakukan komit, dan kemudian:Tambahkan opsi 'biner' jika Anda ingin menambahkan file biner ke tambalan (mis. File mp3):
Anda nanti dapat menerapkan tambalan:
Catatan: Anda juga dapat menggunakan
--staged
sinonim dari--cached
.sumber
git diff --no-color
. Kalau tidak, sepertinya masalah penyandian.git diff
dangit apply
akan bekerja untuk file teks, tetapi tidak akan bekerja untuk file biner.Anda dapat dengan mudah membuat tambalan biner penuh, tetapi Anda harus membuat komit sementara. Setelah Anda membuat komit sementara, Anda dapat membuat tambalan dengan:
Setelah Anda membuat tambalan, jalankan perintah ini:
Ini akan mengembalikan komit sementara Anda. Hasil akhir membuat copy pekerjaan Anda (sengaja) kotor dengan perubahan yang sama seperti yang Anda alami sebelumnya.
Di sisi penerima, Anda dapat menggunakan trik yang sama untuk menerapkan perubahan pada copy pekerjaan, tanpa memiliki riwayat komit. Cukup terapkan tambalan, dan
git reset --mixed <SHA of commit *before* the patches>
.Perhatikan bahwa Anda mungkin harus disinkronkan dengan baik agar seluruh opsi ini berfungsi. Saya telah melihat beberapa kesalahan ketika menerapkan tambalan ketika orang yang membuatnya tidak menarik sebanyak yang saya miliki. Mungkin ada cara untuk membuatnya bekerja, tetapi saya belum melihat jauh ke dalamnya.
Inilah cara membuat tambalan yang sama di Tortoise Git (bukan yang saya sarankan menggunakan alat itu):
Tortoise Git
->Create Patch Serial
Since
:FETCH_HEAD
akan berfungsi jika Anda disinkronkan dengan baik)Tortise Git
->Show Log
reset "<branch>" to this...
Mixed
opsiDan bagaimana cara menerapkannya:
Tortoise Git
->Apply Patch Serial
Tortise Git
->Show Log
reset "<branch>" to this...
Mixed
opsisumber
Untuk membuat tambalan dengan file yang dimodifikasi & baru (dipentaskan) Anda dapat menjalankan:
sumber
git diff --cached > mypatch.patch
tidak berfungsi.file_name.patch
digunakan olehpatch
perintah? Apakah mereka kompatibel satu sama lain?Saya suka:
di mana
<N>
jumlah komit terakhir untuk disimpan sebagai tambalan.Rincian cara menggunakan perintah ada di DOC
UPD
Di sini Anda dapat menemukan cara menerapkannya.
UPD Bagi mereka yang tidak mendapatkan ide
format-patch
Tambah alias:
Kemudian di direktori mana pun repositori proyek Anda berjalan:
Perintah ini akan dibuat
0001-uncommited.patch
di direktori Anda saat ini. Patch akan berisi semua perubahan dan file yang tidak terlacak yang terlihat oleh perintah selanjutnya:sumber
Jika Anda ingin melakukan biner, beri
--binary
opsi ketika Anda menjalankangit diff
.sumber
Kami juga dapat menentukan file, untuk memasukkan hanya file dengan perubahan relatif, terutama ketika mereka span beberapa direktori ex
Saya menemukan ini tidak ditentukan dalam jawaban atau komentar, yang semuanya relevan dan benar, jadi pilih untuk menambahkannya. Eksplisit lebih baik daripada implisit!
sumber