Saya memiliki beberapa perubahan yang tidak dikomit di cabang pengembangan saya dan saya menyembunyikannya dengan menggunakan git stash
, tetapi ada beberapa perubahan yang sangat penting di antara yang tersimpan. Apakah ada cara untuk mengembalikan perubahan itu?
Juga, saya telah membuat beberapa perubahan di atas file kode simpanan sejak itu.
Apakah ada kemungkinan saya dapat mengambil perubahan simpanan ke cabang baru jika memungkinkan?
Jawaban:
Jawaban mudah untuk pertanyaan mudah adalah
git stash apply
Cukup periksa cabang tempat Anda ingin perubahan Anda, dan kemudian
git stash apply
. Kemudian gunakangit diff
untuk melihat hasilnya.Setelah Anda selesai dengan perubahan Anda — yang
apply
terlihat bagus dan Anda yakin tidak perlu simpanan lagi — kemudian gunakangit stash drop
untuk menyingkirkannya.Saya selalu menyarankan menggunakan
git stash apply
daripadagit stash pop
. Perbedaannya adalah bahwaapply
meninggalkan simpanan di sekitar untuk dicoba ulang dengan mudahapply
, atau untuk melihat, dll. Jikapop
mampu mengekstrak simpanan, ia akan segera jugadrop
menyimpannya, dan jika Anda tiba-tiba menyadari bahwa Anda ingin mengekstraknya di suatu tempat lain (di cabang yang berbeda), atau dengan--index
, atau semacamnya, itu tidak mudah. Jika Andaapply
, Anda bisa memilih kapandrop
.Meskipun demikian, itu semua sangat kecil, dan bagi pemula yang git, itu harus hampir sama. (Dan Anda dapat melewati semua ini!)
Bagaimana jika Anda melakukan hal-hal yang lebih maju atau lebih rumit?
Setidaknya ada tiga atau empat "cara untuk menggunakan git simpanan" yang berbeda. Di atas adalah untuk "cara 1", "cara mudah":
Anda mulai dengan cabang yang bersih, mengerjakan beberapa perubahan, dan kemudian menyadari Anda melakukannya di cabang yang salah. Anda hanya ingin mengambil perubahan yang Anda miliki sekarang dan "memindahkannya" ke cabang lain.
Ini adalah kasus yang mudah, dijelaskan di atas. Jalankan
git stash save
(atau polosgit stash
, hal yang sama). Lihatlah cabang lainnya dan gunakangit stash apply
. Ini membuat git untuk menggabungkan perubahan sebelumnya, menggunakan mekanisme gabungan yang agak kuat dari git. Periksa hasilnya dengan hati-hati (dengangit diff
) untuk melihat apakah Anda menyukainya, dan jika ya, gunakangit stash drop
untuk membuang simpanan. Kamu sudah selesai!Anda memulai beberapa perubahan dan menyimpannya. Kemudian Anda pindah ke cabang lain dan mulai lebih banyak perubahan, lupa bahwa Anda memiliki yang tersimpan.
Sekarang Anda ingin menyimpan, atau bahkan memindahkan, perubahan ini , dan menerapkan simpanan Anda juga.
Anda sebenarnya bisa
git stash save
lagi, karenagit stash
membuat "tumpukan" perubahan. Jika Anda melakukan itu, Anda memiliki dua simpanan, satu hanya disebutstash
— tetapi Anda juga dapat menulisstash@{0}
— dan satu diejastash@{1}
. Gunakangit stash list
(kapan saja) untuk melihat semuanya. Yang terbaru selalu yang bernomor terendah. Ketika Andagit stash drop
, itu menjatuhkan yang terbaru, dan yangstash@{1}
bergerak ke atas tumpukan. Jika Anda memiliki lebih banyak, yangstash@{2}
menjadistash@{1}
, dan seterusnya.Anda dapat
apply
dan kemudiandrop
simpanan khusus juga:,git stash apply stash@{2}
dan seterusnya. Menjatuhkan simpanan tertentu, hanya menomori kembali yang bernomor lebih tinggi. Sekali lagi, yang tanpa nomor jugastash@{0}
.Jika Anda menumpuk banyak simpanan, itu bisa menjadi cukup berantakan (apakah simpanan yang saya inginkan
stash@{7}
atau bukanstash@{4}
? Tunggu, saya hanya mendorong yang lain, sekarang mereka 8 dan 5?). Saya pribadi lebih suka mentransfer perubahan ini ke cabang baru, karena cabang memiliki nama, dancleanup-attempt-in-December
jauh lebih berarti bagi saya daripadastash@{12}
. (git stash
Perintah mengambil pesan penyimpanan opsional, dan itu bisa membantu, tapi entah bagaimana, semua simpanan saya baru saja dinamaiWIP on branch
.)(Extra-canggih) Anda telah menggunakan
git stash save -p
, atau hati-hatigit add
-ed dan / ataugit rm
bit tertentu -ed kode Anda sebelum menjalankangit stash save
. Anda memiliki satu versi di area indeks / pementasan simpanan, dan versi lain (berbeda) di pohon kerja. Anda ingin mempertahankan semua ini. Jadi sekarang Anda gunakangit stash apply --index
, dan itu kadang gagal dengan:Anda menggunakan
git stash save --keep-index
untuk menguji "apa yang akan dilakukan". Yang ini berada di luar cakupan jawaban ini; lihat jawaban StackOverflow ini sebagai gantinya.Untuk kasus rumit, saya sarankan mulai di direktori kerja "bersih" terlebih dahulu, dengan melakukan perubahan yang Anda miliki sekarang (di cabang baru jika Anda suka). Dengan cara itu "suatu tempat" yang Anda terapkan, tidak memiliki yang lain di dalamnya, dan Anda hanya akan mencoba perubahan simpanan:
Sekarang Anda berada di titik awal "bersih". Atau mungkin lebih seperti ini:
Hal utama yang harus diingat adalah bahwa "simpanan" adalah komit, itu hanya komit yang sedikit "lucu / aneh" yang bukan "di cabang". The
apply
penampilan operasi pada apa yang komit berubah, dan mencoba untuk mengulanginya di manapun Anda berada sekarang. Stash akan tetap ada di sana (apply
disimpan), jadi Anda bisa melihatnya lebih banyak, atau memutuskan ini adalah tempat yang salahapply
dan coba lagi secara berbeda, atau apa pun.Kapan pun Anda memiliki simpanan, Anda dapat menggunakan
git stash show -p
untuk melihat versi simpel dari simpanan. (Versi yang disederhanakan ini hanya melihat perubahan "final work tree", bukan perubahan indeks yang disimpan yang--index
mengembalikan secara terpisah.) Perintahgit stash apply
, tanpa--index
, hanya mencoba membuat perubahan yang sama di direktori kerja Anda sekarang.Ini benar bahkan jika Anda sudah memiliki beberapa perubahan. The
apply
perintah senang untuk menerapkan simpanan untuk dimodifikasi direktori kerja (atau setidaknya, untuk mencoba untuk menerapkannya). Anda dapat, misalnya, melakukan ini:Anda dapat memilih pesanan "terapkan" di sini, memilih simpanan tertentu untuk diterapkan dalam urutan tertentu. Perhatikan, bagaimanapun, bahwa setiap kali Anda pada dasarnya melakukan "git merge", dan seperti yang diperingatkan oleh dokumentasi gabungan:
Jika Anda mulai dengan direktori bersih dan hanya melakukan beberapa
git apply
operasi, mudah untuk mundur: gunakangit reset --hard
untuk kembali ke status bersih, dan ubahapply
operasi Anda . (Itu sebabnya saya sarankan memulai di direktori kerja bersih terlebih dahulu, untuk kasus rumit ini.)Bagaimana dengan kasus terburuk yang mungkin terjadi?
Katakanlah Anda melakukan Banyak Barang Git Lanjutan, dan Anda telah membuat simpanan, dan ingin
git stash apply --index
, tetapi tidak lagi memungkinkan untuk menerapkan simpanan simpanan dengan--index
, karena cabang telah menyimpang terlalu banyak sejak saat Anda menyimpannya.Ini untuk apa
git stash branch
.Jika kamu:
stash
, lalugit stash apply --index
upaya untuk membuat kembali perubahan pasti akan berhasil. Inilah yang dilakukan. (Dan kemudian menjatuhkan simpanan sejak itu berhasil diterapkan.)
git stash branch newbranch
Beberapa kata terakhir tentang
--index
(apa sih itu?)Apa yang
--index
dilakukannya mudah untuk dijelaskan, tetapi sedikit rumit secara internal:git add
(atau "panggung") sebelumcommit
.git stash
, Anda mungkin telah mengedit kedua filefoo
danzorg
, tetapi hanya mementaskan salah satu dari itu.git add
adalahadd
hal-hal ed dan bukangit add
hal-hal yang tidak ditambahkan. Artinya, jika Andaadd
mengeditfoo
tetapi tidakzorg
kembali sebelum Anda melakukannyastash
, mungkin lebih baik untuk memiliki pengaturan yang sama persis. Apa yang dipentaskan, harus dipentaskan lagi; apa yang diubah tetapi tidak dipentaskan, harus dimodifikasi lagi tetapi tidak dipentaskan.The
--index
bendera untukapply
mencoba hal-hal mengatur cara ini. Jika pohon kerja Anda bersih, ini biasanya hanya berfungsi. Jika pohon kerja Anda sudah memiliki beberapa haladd
, Anda dapat melihat bagaimana mungkin ada beberapa masalah di sini. Jika Anda keluar--index
,apply
operasi tidak mencoba untuk mempertahankan seluruh pengaturan bertahap / tidak bertahap. Sebagai gantinya, ia hanya memanggil mesin git's git, menggunakan komit pohon kerja di "kantong simpanan" . Jika Anda tidak peduli tentang mempertahankan staged / unstaged, meninggalkan--index
membuat lebih mudah untukgit stash apply
melakukan hal itu.sumber
git stash pop
? Atau maksud Anda: Anda mengedit beberapa file, tetapi belum berjalangit stash
lagi? Atau maksud Anda sesuatu yang lain sama sekali?apply
menyimpan simpanan. Anda tidak harus melakukan ini, tetapi itu membuat banyak hal lebih mudah bagi Anda untuk melihatnya. Anda dapat menggunakannyarebase -i
untuk menyatukan banyak komitmen, atau memilih perubahan tertentu, atau apa pun, nanti.git stash apply --index
(ingat dua tanda hubung). Jika Anda pergi--index
, bukan masalah besar; satu-satunya titik--index
adalah untuk menjaga pengaturan bertahap / tidak bertahap. (Anda mungkin tidak memiliki pengaturan khusus di tempat pertama.) Kemudiangit status
dll, dan tambahkan / komit seperti yang diinginkan dll. Ketika (dan hanya ketika) Anda semua selesai dengan simpanan, gunakangit stash drop
untuk membuangnya.drop
ataupop
) simpanan, Anda selalu memiliki kode simpanan asli aman di komit, karena simpanan adalah komit! Jika Anda ingin mendapatkannya kembali dengan tepat, tetapi di cabang, gunakangit stash branch
(lihat bagian di atas, atau buku Pro Git dalam jawaban Shunya ). Anda kemudian dapatgit checkout
cabang itu, ataugit cherry-pick
komit dari cabang itu, dll.akan mengembalikan semuanya ke tempatnya
seperti yang disarankan dalam komentar, Anda dapat menggunakan
git stash branch newbranch
untuk menerapkan simpanan ke cabang baru, yang sama dengan menjalankan:sumber
git stash branch newbranch
memang akan melakukan itu; tetapi ketahuilah bahwa itu membuat cabang baru dengan induknya diatur ke komit yangHEAD
pada saatstash
itu dilakukan. Dengan kata lain, itu untuk ketika Anda kembali setelah sesi hack yang panjang atau apa pun, menatap kekacauan, dan memutuskan "Saya harus meletakkannya di cabang, daripada menyimpan" :-)Untuk menyederhanakan ini, Anda memiliki dua opsi untuk mengajukan kembali simpanan Anda:
git stash pop
- Kembalikan ke status tersimpan, tetapi menghapus simpanan dari penyimpanan sementara.git stash apply
- Kembalikan kembali ke status tersimpan dan tinggalkan daftar simpanan untuk kemungkinan digunakan kembali nanti.Anda dapat membaca lebih detail tentang git stash di artikel ini.
sumber
Untuk memeriksa konten simpanan Anda: -
menerapkan simpanan khusus dari simpanan: -
atau untuk menerapkan simpanan pertama: -
Catatan: git stash pop akan menghapus simpanan dari daftar simpanan Anda sedangkan git simpanan berlaku tidak akan. Jadi, gunakan sesuai kebutuhan.
sumber
Di mac ini bekerja untuk saya:
daftar simpanan git (lihat semua simpanan Anda)
git simpanan berlaku (hanya nomor yang Anda inginkan dari daftar simpanan Anda)
seperti ini:
sumber
Anda dapat menyimpan perubahan yang tidak dikomit menggunakan "git stash" lalu checkout ke cabang baru menggunakan "git checkout -b" lalu menerapkan komit simpanan "git stash apply"
sumber