Apa itu tambalan di kontrol versi git?

137

Saya baru mengenal git dan kontrol versi, jadi saya mencoba mencari tahu apa itu tambalan dan apa bedanya dengan kegiatan yang saya lakukan di git?

Kapan saya menerapkan tambalan? Apakah itu terjadi setiap kali saya berkomitmen?

Amit Erandole
sumber

Jawaban:

116

Anda dapat melihat di posting blog ini bagaimana Anda bisa membuat tambalan (kumpulan perubahan yang ingin Anda komunikasikan dan terapkan ke repo lain)

patch git
(gambar dari posting blog 2008 " Bioruby with git: bagaimana cara kerjanya? ", diterbitkan oleh Jan AERTS )

Lihat juga Berkontribusi pada Rails dengan Git sebagai contoh konkret lainnya.

Saat ini, permintaan tarik GitHub membuatnya sangat mudah untuk menerapkan tambalan pada repositori GitHub, yang berguna ketika Anda bukan kontributor langsung (yaitu Anda tidak memiliki hak untuk langsung mendorong ke repo).
Sebenarnya, baru-baru ini GitHub memperkenalkan " Email Permintaan Tarik yang Lebih Baik " untuk meningkatkan pemberitahuan tambalan baru.

VONC
sumber
4
Jawaban yang bagus, dan yang memberi tahu saya bahwa 'patch' GIT bukanlah yang saya cari.
RonLugge
91

Patch adalah program Unix yang memperbarui file teks sesuai dengan instruksi yang terkandung dalam file terpisah, yang disebut file patch.

Jadi, dengan kata lain itu bisa berarti file dengan instruksi atau program yang memproses file itu dan menerapkannya pada sesuatu.

Sekarang, apa itu file tambalan? Katakanlah Anda memiliki file teks dengan 2 baris:

This is line A.
This is line B, or otherwise #2.

Kemudian Anda mengubah baris pertama, dan sekarang file Anda terlihat seperti ini:

This is SPARTA.
This is line B, or otherwise #2.

Bagaimana Anda menggambarkan perubahan pada isi file? Anda dapat mengatakan bahwa baris pertama "Ini adalah baris A." diganti dengan "Ini SPARTA.", atau bahkan kata terakhir "A" dari baris pertama diganti dengan kata lain "SPARTA". Dan itulah yang diff memberitahu kita. Katakanlah saya memiliki dua versi file ini, satu disebut file1.txt dan satu lagi file2.txt, lalu saya jalankan diff dan dapatkan ini:

$ diff -u file1.txt file2.txt 
--- file1.txt   2011-11-26 11:07:03.131010360 -0500
+++ file2.txt   2011-11-26 11:07:13.171010362 -0500
@@ -1,2 +1,2 @@
-This is line A.
+This is SPARTA.
 This is line B, or otherwise #2.

Memiliki deskripsi perubahan, Anda dapat menerapkannya pada konten awal dan mendapatkan konten yang dimodifikasi. Dan perubahan-perubahan itu, dimasukkan ke dalam format terpadu yang dapat dimengerti oleh program mirip "patch", disebut file patch. Ini seperti alih-alih mendapatkan ikan dari seseorang yang mereka ajari cara memancing, sehingga Anda bisa menggali sendiri ikan itu dari perairan. Sekarang, mari kita terapkan tambalan kami ke file1.txt agar terlihat persis seperti file2.txt:

$ cat file1.txt 
This is line A.
This is line B, or otherwise #2.
$ cat file2.txt 
This is SPARTA.
This is line B, or otherwise #2.
$ diff -u file1.txt file2.txt > changes.patch
$ cat changes.patch 
--- file1.txt   2011-11-26 11:09:38.651010370 -0500
+++ file2.txt   2011-11-26 11:07:13.171010362 -0500
@@ -1,2 +1,2 @@
-This is line A.
+This is SPARTA.
 This is line B, or otherwise #2.
$ patch < changes.patch 
patching file file1.txt
$ cat file1.txt 
This is SPARTA.
This is line B, or otherwise #2.
$ 

Anda mungkin berpikir bahwa lebih mudah memiliki dua versi file ini. Nah, dalam kasus sederhana ini itu benar. Tetapi ketika Anda memiliki banyak file, dan file-file itu sangat besar, itu jauh lebih efisien untuk memiliki beberapa baris perubahan daripada dua salinan dari semuanya.

Ketika berbicara dalam istilah git, file patch masih berarti hal yang sama, tetapi menggunakan diff + patch sendiri akan menjadi mimpi buruk. Misalnya, Anda harus selalu memeriksa dua versi file (atau bahkan seluruh repositori) untuk membandingkannya. Kedengarannya tidak bagus, bukan? Jadi git menangani semua kerja keras untuk Anda - ia membandingkan file lokal Anda dengan apa yang ada dalam repositori yang sedang Anda kerjakan, dan dapat menunjukkannya kepada Anda sebagai "diff", atau menerapkan "diff" itu sebagai patch alias melakukan perubahan Anda, atau bahkan membiarkan Anda menerapkan beberapa file patch yang sudah Anda miliki. Tanpa merinci lebih jauh, dalam hal ini git benar-benar sama dengan sistem kontrol versi lain seperti SVN, atau bahkan CVS atau terpaksa.

Semoga ini bisa membantu!


sumber
Tidak pernah tahu git menggunakan patchprogram bawaan. Saya pikir git memiliki implementasi sendiri.
radiantshaw
43

Patch adalah file kecil yang menunjukkan perubahan yang dibuat dalam repositori. Ini umumnya digunakan ketika seseorang dari luar tim Anda memiliki akses hanya baca tetapi memiliki perubahan kode yang baik tersedia. Dia kemudian membuat tambalan dan mengirimkannya kepada Anda. Anda menerapkannya dan mendorongnya ke repositori git. Semua orang kemudian mendapat manfaat dari versi yang diperbarui, dan pembuat tambalan tidak perlu akses baca / tulis.

Ini benar-benar terutama masalah keamanan (setidaknya, untuk itulah orang menggunakannya).

Tom van der Woerdt
sumber
1
Info tambahan: Walaupun git tidak menggunakan tambalan secara internal, satu tujuan desain untuk git adalah membuatnya mudah untuk bertukar tambalan (karena banyak proyek bekerja seperti itu, misalnya Linux dan git itu sendiri). Jadi git memiliki perintah khusus untuk menangani tambalan ( git diffmenunjukkan perubahan sebagai tambalan secara default, git applymemungkinkan Anda menerapkan tambalan, dll.).
sleske
Selamat! Anda benar-benar memahaminya mengenai untuk apa tambalan digunakan, yaitu sarana untuk mengirimkan perubahan ke repositori yang pembuatnya tidak memiliki akses tulis. Karenanya, model permintaan fork dan pull dari GitHub adalah pengganti untuk model patch dari distribusi perubahan. Jadi saya percaya tambalan hanya berguna di luar konteks alat seperti GitHub.
mljrg
8

File tambalan mewakili satu set perubahan yang dapat diterapkan ke cabang apa pun, dalam urutan apa pun. Dengan menggunakan tambalan, Anda akan mendapatkan perbedaan antara satu atau lebih file. Dan nanti, Anda bisa menerapkan perbedaan (tambalan) untuk mendapatkan perubahan pada file baru. Ada banyak kegunaan untuk tambalan di Git. Jika Anda memiliki perubahan yang tidak dikomit di direktori kerja Anda, dan Anda perlu mendapatkan perubahan itu untuk diterapkan di tempat lain, cukup buat tambalan dan terapkan tambalan.

git diff > mypatch.patch

Jika Anda memiliki file baru di repositori Anda (tidak dilacak), maka Anda harus membuat stage file sebelum membuat patch (jangan komit), dan gunakan perintah berikut

git diff --cached > mypatch.patch 

Anda nanti dapat menerapkan tambalan:

git apply mypatch.patch

Jika Anda ingin membuat beberapa perubahan pada repositori git, bahwa Anda tidak memiliki izin menulis, buat saja perubahan dan buat tambalan di antara keduanya, dan kirim tambalan kepada seseorang yang memiliki izin untuk menerapkan tambalan, dengan ini perubahan Anda harus ditambahkan ke repositori git itu.

Anuraj
sumber
Demo yang lebih baik: robots.thoughtbot.com/… . Ringkasan contoh dasar saya: git format-patch <base_commit_or_branch_name>= bungkus semua komit mulai dari sekarang kembali ke <base_commit_or_branch_name> menjadi file yang bagus dan rapi yang berisi diff serta pesan komit, untuk memudahkan pengiriman (mis .: melalui email) ke orang lain yang ingin menambalnya ke basis kode mereka. Kemudian penerima menambal sistem mereka dengan file Anda:cat *.patch | git am
Gabriel Staples
7

Patch adalah sekumpulan perbedaan antara satu atau lebih file, untuk menunjukkan apa yang berbeda di antara mereka. Anda biasanya hanya menghasilkan tambalan untuk menunjukkan kepada seseorang apa yang telah Anda ubah. Contoh kapan Anda mungkin melakukan ini adalah ketika Anda menemukan dan memperbaiki bug dalam aplikasi open source dan kemudian memposting perbaikan pada pelacak bug mereka.

Steve Rukuts
sumber