Katakanlah saya memiliki perubahan yang tidak dikomit di direktori kerja saya. Bagaimana saya bisa membuat tambalan dari mereka tanpa harus membuat komit?
Katakanlah saya memiliki perubahan yang tidak dikomit di direktori kerja saya. Bagaimana saya bisa membuat tambalan dari mereka tanpa harus membuat komit?
Jawaban:
git diff
untuk perubahan yang tidak dipentaskan. git diff --cached
untuk perubahan bertahap.
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:
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 diff
output Anda . Jadi, salah satu cara untuk melakukan patch adalah dengan mem-stage semua untuk komit baru ( git add
setiap 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 --staged
sinonim dari --cached
.
git diff --no-color
. Kalau tidak, sepertinya masalah penyandian.
git diff
dan git 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:
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):
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
opsiUntuk membuat tambalan dengan file yang dimodifikasi & baru (dipentaskan) Anda dapat menjalankan:
git diff HEAD > file_name.patch
git diff --cached > mypatch.patch
tidak berfungsi.
file_name.patch
digunakan oleh patch
perintah? Apakah mereka kompatibel satu sama lain?
Saya suka:
git format-patch HEAD~<N>
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:
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"'
Kemudian di direktori mana pun repositori proyek Anda berjalan:
git make-patch
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:
git status .
Kami juga dapat menentukan file, untuk memasukkan hanya file dengan perubahan relatif, terutama ketika mereka span beberapa direktori ex
git diff ~/path1/file1.ext ~/path2/file2.ext...fileN.ext > ~/whatever_path/whatever_name.patch
Saya menemukan ini tidak ditentukan dalam jawaban atau komentar, yang semuanya relevan dan benar, jadi pilih untuk menambahkannya. Eksplisit lebih baik daripada implisit!