Apa perbedaan antara 'git format-patch dan' git diff '?

92

Saya tidak melihat perbedaan antara keluaran 'git format-patch' dan 'git diff', apakah ada? Dan tidakkah saya bisa menggunakan 'git diff' untuk menghasilkan tambalan dan kemudian menerapkannya menggunakan git apply?

Masalah saya adalah saya memiliki perubahan yang ditambahkan ke indeks, tetapi tampaknya git format-patch hanya menerima komit, jadi jika saya dapat menggunakan output dari diff, maka saya dapat menggunakan perintah ini untuk menghasilkan tambalan untuk perubahan dalam indeks:

git diff --cached > index.patch
Rafid
sumber

Jawaban:

130

Sebuah patch yang dibuat dengan git format-patchjuga akan menyertakan beberapa informasi meta tentang komit (komit, tanggal, pesan komit, ...) dan akan berisi diff data biner. Semuanya akan diformat sebagai surat, sehingga dapat dengan mudah dikirim. Orang yang menerimanya kemudian dapat membuat ulang komit yang sesuai git amdan semua meta-data akan utuh. Ini juga dapat diterapkan git applykarena ini adalah himpunan super dari diff sederhana.

Sebuah patch yang dilapisi dengan git diffakan menjadi diff sederhana dengan konteks (pikirkan diff -u). Ini juga dapat diterapkan dengan git applytetapi meta-data tidak akan dibuat ulang (karena tidak ada).

Singkatnya, git format-patchberguna untuk mengirimkan komit, sedangkan git diffberguna untuk mendapatkan perbedaan antara dua pohon.

Sylvain Defresne
sumber
13

Dari manual git-format-patch menyiapkan tambalan yang sesuai untuk pengiriman email, sementara git-diff menunjukkan perubahan.

Mereka adalah dua hal yang berbeda dan memiliki tujuan yang berbeda, mereka kebetulan menghasilkan format tambalan. Tetapi git-format-patchmenambahkan data tentang komit (tanggal, penulis, pesan komit) dan menggabungkannya ke dalam format yang sesuai untuk dikirim sebagai pesan email Unix (meskipun ini hanya file, sehingga mereka dapat dikirim ke metode lain dan masih diterapkan oleh git-am).

Juga git-format-patchmenghasilkan file tambalan untuk setiap komit dalam rentang yang Anda tentukan. Perubahan ini akan ditambahkan sebagai komitmen ke repositori Anda dengan git-am.

git-diffhanya menunjukkan perbedaan antara dua status yang Anda minta, dan dapat digunakan untuk membuat file tambalan. Tapi ini hanya file patch biasa dan menerapkan patch hanya akan mengubah status direktori kerja.

Dan ya, Anda dapat membuat tambalan untuk indeks Anda dengan cara itu.

Abizern
sumber
Terima kasih. Apa yang istimewa dari email UNIX sehingga mereka merancang tambalan berdasarkan itu?
Rafid
7
Tidak ada yang istimewa. Ini hanya git yang dirancang oleh Linus Torvalds yang alur kerjanya melibatkan pengiriman dan penerimaan patch melalui email untuk validasi sebelum diintegrasikan ke dalam kernel Linux.
Sylvain Defresne
Git dirancang oleh Linus Torvalds untuk menyimpan kernel Linux. Surat Unix adalah format yang umum.
Abizern
1

File patch dapat dibuat dengan git diffperintah, tetapi dibandingkan dengan patch yang dihasilkan oleh git format-patchperintah, perbedaan utamanya adalah:

  1. Tidak ada metadata tentang komit (seperti tanggal, penulis, pesan komit, dll.);
  2. Tidak ada statistik tentang diff (diffstat, seperti file x diubah, penyisipan y (+), penghapusan z (-));
  3. Tidak ada perbedaan biner, hanya perbedaan tekstual.

masukkan deskripsi gambar di sini

Untuk menghasilkan file patch untuk semua file yang diubah (di indeks atau direktori kerja):

git diff HEAD --binary > my.patch
# git diff + git diff --cached/staged == git diff HEAD

Untuk menerapkan file tambalan yang dihasilkan:

# restore the changed files firstly
git restore --staged .
git restore .

# apply the patch to redo the changes 
git apply my.patch
# or
patch -p1 < my.patch
K. Simbol
sumber