Saya melakukan kesalahan yang sangat sederhana. Saya mencoba menyiapkan file tambalan biasa, jadi saya bisa mengajukan kembali beberapa perubahan:
$ git diff > before
$ git diff something_here > save.patch
$ git checkout .
$ patch < save.patch
$ git diff > after
$ diff before after
$
Dengan something_here
blank hampir berfungsi, tetapi nama file tidak benar. Saya pikir saya hanya saya kehilangan beberapa opsi.
Dalam kehidupan nyata, saya akan melakukan penggabungan setelah checkout, sehingga patch mungkin gagal di sana, tetapi Anda lihat apa yang saya maksudkan.
Sunting
Kesalahan saya di sini karena mengajukan pertanyaan yang salah. Pertanyaan sebenarnya adalah, saya ingin menyimpan perubahan saya, melakukan penggabungan, lalu menerapkan kembali perubahan, jika memungkinkan? Saya bertanya dengan cara yang salah karena saya terbiasa menggunakan tambalan untuk menyelesaikan masalah-masalah git diff
seperti ini dan sepertinya itulah yang ingin saya lakukan.
Komentar Charles Bailey memiliki jawaban yang tepat. Bagi saya, git-apply adalah hal yang benar untuk dilakukan (git-simpanan terlihat lebih berat daripada yang saya butuhkan dan rebasing dan bundel jelas di luar tingkat keahlian saya saat ini.) Saya akan menerima jawaban yang diberikan Charles (karena Anda tidak dapat menerima komentar). Terima kasih atas semua sarannya.
Sunting, 6 tahun kemudian
Seperti diketahui orang yang tahu subjeknya, saya terlalu memperkirakan kesulitannya git stash
. Hampir setiap hari, saya akan menggunakan urutan berikut:
$ git stash
$ git merge
$ git stash pop
patch
alih-alihgit apply
?git stash
atau alat git lainnya?git stash
adalah solusi termudah untuk apa yang Anda coba lakukan, tetapi ada banyak pendekatan yang berhasil.git-svn
.Jawaban:
Jika Anda ingin menggunakan tambalan Anda harus menghapus
a/
b/
awalan yang git gunakan secara default. Anda dapat melakukan ini dengan--no-prefix
opsi (Anda juga dapat melakukan ini dengan-p
opsi tambalan ):Namun biasanya, lebih mudah untuk menggunakan lurus
git diff
dan kemudian menggunakan output untuk memberi makangit apply
.Sebagian besar waktu saya mencoba untuk menghindari menggunakan tambalan teks. Biasanya satu atau lebih komit sementara digabungkan dengan rebase,
git stash
dan bundel lebih mudah dikelola.Untuk kasus penggunaan Anda, saya pikir itu
stash
yang paling tepat.sumber
git diff --no-prefix master > diff.patch
dan kemudiangit checkout master
patch -p0 < diff.patch
patch --dry-run < diff.patch
sebelum mengeluarkan perintah terakhir.patch
luar git (mungkin menggunakan file tambalan yang dihasilkan olehdiff
) dalam kasus penggunaan yang lebih umum.Penggunaan hanya
-p1
: Anda akan perlu menggunakan-p0
dalam--no-prefix
kasus pula, sehingga Anda hanya dapat meninggalkan keluar--no-prefix
dan menggunakan-p1
:sumber
git diff
menampilkan garis yangpatch
mengabaikan.git apply
adalah cara untuk pergi.Diff git memiliki segmen path ekstra yang ditambahkan ke path file. Anda dapat menghapus entri ini di jalur dengan menentukan -p1 dengan tambalan, seperti:
sumber
save.patch
file ke mana saja (termasuk file biner).git apply <file>
sumber
git diff > save.patch
dangit checkout .
bukan reset, tapi ya ...git apply
atau menjadikan diff relevan dengan keadaan Anda dan penunjuk ke komit terakhir tersedia. Melakukannya sama sekaligit diff
tidak melakukan apa pungit apply
. Masalahnyagit diff
adalah (saya pikir) dari menggunakangit reset
- hubungan antara repo, indeks, dan area kerja adalah masalah.Trik yang berguna untuk menghindari membuat file tambalan sementara:
sumber
git stash show -p stash@{3} | patch -p1 -d [dst-dir]