Bagaimana saya bisa memformat tambalan dengan apa yang saya sembunyikan

140

Dalam git, saya menyembunyikan perubahan saya. Mungkinkah saya bisa membuat tambalan dengan apa yang saya sembunyikan? Dan kemudian menerapkan tambalan itu di beberapa repositori lain (rekan kerja saya)?

Saya tahu git format-patch -1, tetapi saya pikir itu untuk apa yang telah saya lakukan. Tetapi saya mencari hal yang sama untuk perubahan yang saya simpan.

Dan bagaimana saya bisa menerapkan tambalan di repositori lain?

silverburgh
sumber

Jawaban:

155

Tentu, git stash showmendukung ini:

git stash show -p

Jadi, gunakan

git stash list

untuk mengetahui jumlah simpanan yang ingin Anda ekspor sebagai tambalan, maka

git stash show -p stash@{<number>} > <name>.patch

untuk mengekspornya.

Sebagai contoh:

git stash show -p stash@{3} > third_stash.patch
Greg Hewgill
sumber
1
Saya memiliki pertanyaan terkait tentang menerapkan tambalan. Katakanlah tambalan saya menyentuh banyak file. Apakah ada cara untuk menerapkan tambalan 'secara interaktif'? Pilih file tambalan mana yang harus saya tempati? Bisakah saya melakukan itu?
silverburgh
1
@silverburgh: Saya telah melihat sekilas man patchdan saya tidak melihat opsi untuk aplikasi tambalan interaktif. Namun, karena file tambalan sendiri adalah file teks biasa, biasanya yang akan dilakukan adalah mengedit tambalan dalam editor teks untuk menghapus bagian yang relevan untuk diterapkan patch. Sebagai alternatif, jika Anda menerapkan tambalan ke repositori Git lain, Anda bisa menerapkannya semua dan kemudian secara selektif git checkoutfile yang tidak ingin Anda ubah ( git checkoutdengan nama file membuang perubahan yang tidak dipentaskan).
Greg Hewgill
1
@silverburgh Anda dapat membatasi set file yang ditambal menggunakan params "--exclude" dan "--include" git berlaku.
Kelvin
@ silverburgh Anda dapat melakukan hal berikut dengan anggapan Anda memiliki tambalan. terapkan tambalan sepenuhnya dan kemudian lakukan git add --interactive ${YOUR_FILES}dan itu akan memberi Anda kesempatan untuk melakukan sebagian komitmen.
Alex
15
Terima kasih. Ini bekerja untuk saya:git stash show -p stash@{1} > patch.txt
Ryan
63

Jawaban ini memberikan info tentang cara menyimpan tambalan dan menerapkannya di tempat Anda ingin menggunakannya.

Untuk menyimpan output dalam file:

 git stash show -p --color=never > my-patch-name.patch

Verifikasi tambalan terlihat bagus:

git apply --stat my-patch-name.patch

Verifikasi tidak ada kesalahan:

git apply --check my-patch-name.patch

Terapkan tambalan

git apply my-patch-name.patch
Calvinf
sumber
Yang ini bekerja untuk saya dengan file kode teks biasa, tetapi saya harus memperhitungkan ruang putih. Verifikasi tambalan terlihat bagus: git apply --check --ignore-space-change --ignore-whitespace my-patch-name.patch Terapkan tambalan: git apply --ignore-space-change --ignore-whitespace my-patch-name.patch
Craig Boland
Penjelasan yang bagus dan ringkas. Agar berhasil, saya harus berada di root repo ketika menerapkan tambalan, kalau git applytidak mengambil diff.
Maks
16

Menggunakan

$> git stash list
stash@{0}: WIP on master: 84fx31c Merged with change to /public/
stash@{1}: WIP on master: 463yf85 FlupResource: also takes json as a query parameter

untuk mendapatkan daftar barang-barang simpanan Anda. Git benar-benar membuat objek komit ketika Anda simpanan.

Mereka berkomitmen seperti yang lainnya. Anda dapat memeriksanya di cabang:

$> git checkout -b with_stash stash@{0}

Anda kemudian dapat menerbitkan cabang ini dan kolega Anda dapat menggabungkan atau memilih-ceri komit itu.

peritus
sumber
13

Solusi di atas tidak akan berfungsi untuk data biner. Berikut ini menambahkan dukungan untuk itu:

git stash show stash@{0} -p --binary

Edit

Catatan: Saya hanya ingin menambahkan komentar ke balasan di atas tetapi reputasi saya tidak cukup.

Davide Guerri
sumber
3

Saya percaya ini mungkin salah satu udpates dari Git baru-baru ini. Anda tidak perlu menambal perubahan yang Anda simpan lagi. Anda bisa menerapkan perubahan simpanan Anda di satu cabang ke cabang lain.

katakanlah pada cabang A Anda menyembunyikan beberapa perubahan, disebut simpanan @ {1}.

Anda sekarang beralih ke cabang B. Anda bisa melakukan:

$git stash apply stash@{1}

ini berlaku perubahan cabang A Anda ke cabang B.

stucash
sumber