Cara memulihkan turun simpanan di Git?
Saya sering menggunakan git simpanan
dan git simpanan pop
untuk menyimpan dan mengembalikan perubahan dalam kerja saya pohon. Kemarin aku punya beberapa perubahan dalam saya bekerja pohon yang saya telah tersimpan dan muncul, dan kemudian saya membuat lebih banyak perubahan untuk saya bekerja pohon. I'd ingin kembali dan review kemarin's disembunyikan perubahan, tapi git simpanan pop
muncul untuk menghapus semua referensi terkait komit.
Saya tahu bahwa jika saya menggunakan git simpanan
maka .git/ref/stash berisi referensi dari commit digunakan untuk membuat simpanan. Dan .git/log/ref/stash berisi seluruh simpanan. Tapi referensi tersebut akan hilang setelah git simpanan pop
. Saya tahu bahwa yang melakukan adalah masih dalam repositori di suatu tempat, tapi aku don't tahu apa itu.
Apakah ada cara mudah untuk memulihkan kemarin's stash melakukan referensi?
Catatan bahwa ini isn't penting bagi saya hari ini karena saya memiliki backup harian dan bisa kembali ke kemarin's bekerja pohon untuk mendapatkan perubahan. I'm bertanya karena harus ada cara yang lebih mudah!
Setelah anda mengetahui hash dari simpanan komit anda turun, anda bisa menerapkannya sebagai simpanan:
Atau, anda dapat membuat sebuah cabang yang terpisah untuk itu dengan
Setelah itu, anda dapat melakukan apapun yang anda inginkan dengan semua alat-alat yang biasa. Ketika anda selesai, hanya meniup cabang pergi.
Mencari hash
Jika anda baru saja muncul dan terminal masih terbuka, anda akan masih memiliki nilai hash yang dicetak oleh
git simpanan pop
pada layar (terima kasih, Dolda).Jika tidak, anda dapat menemukannya dengan menggunakan ini untuk Linux, Unix atau Git Bash untuk Windows:
...atau menggunakan Powershell untuk Windows:
Ini akan menunjukkan kepada anda semua komit pada tips anda melakukan graph yang tidak lagi dirujuk dari setiap cabang atau tag – setiap kehilangan komit, termasuk setiap simpanan komit pernah anda buat, akan berada di suatu tempat di grafik itu.
Cara termudah untuk menemukan stash melakukan yang anda inginkan adalah mungkin untuk lulus daftar itu untuk
gitk
:...atau lihat jawaban dari emragins jika menggunakan Powershell untuk Windows.
Ini akan meluncurkan browser repositori menunjukkan anda setiap komit dalam repositori pernah, terlepas dari apakah itu dapat dicapai atau tidak.
Anda dapat mengganti
gitk
ada dengan sesuatu sepertigit log --grafik --oneline --menghias
jika anda memilih grafik yang bagus pada konsol atas terpisah GUI aplikasi.Untuk tempat simpanan komit, terlihat untuk melakukan pesan dari formulir ini:
WIP pada somebranch: commithash Beberapa lama melakukan pesan
Catatan: pesan commit hanya akan dalam bentuk ini (dimulai dengan "WIP pada") jika anda tidak memberikan pesan apapun yang anda lakukan git
simpanan
.Jika anda didn't dekat terminal, hanya melihat pada output dari
git simpanan pop
dan'll memiliki ID objek dari turun simpanan. Hal ini biasanya terlihat seperti ini:(Perhatikan bahwa
git simpanan drop
juga menghasilkan baris yang sama.)Untuk mendapatkan simpanan belakang, hanya menjalankan git branch tmp 2cae03e`, dan anda'll get it sebagai cabang. Untuk mengubah ini ke simpanan, jalankan:
Setelah itu sebagai branch juga memungkinkan anda untuk memanipulasi dengan bebas; misalnya, untuk cherry-pick atau gabungan itu.
Hanya ingin menyebutkan penambahan ini untuk solusi diterima. Itu't segera jelas bagi saya yang pertama kali saya mencoba metode ini (mungkin seharusnya), tetapi untuk menerapkan simpanan dari nilai hash, hanya menggunakan "git simpanan menerapkan ":
Ketika saya masih baru untuk git, ini bukan't jelas bagi saya, dan saya mencoba kombinasi yang berbeda dari "git show", "git menerapkan", "patch", dll.
Untuk mendapatkan daftar stash yang masih dalam repositori anda, tetapi tidak terjangkau lagi:
Jika anda memberi judul untuk simpanan anda, ganti "WIP" dalam
-grep=WIP
di akhir perintah dengan bagian dari pesan anda, misal-grep=Tesselation
.Perintah grepping untuk "WIP" karena default pesan komit untuk simpanan dalam bentuk
WIP pada mybranch: [sebelumnya-melakukan-hash] Pesan commit sebelumnya.
Aku hanya dibangun sebuah perintah yang membantu saya menemukan saya hilang stash melakukan:
Ini berisi daftar semua objek dalam .git/objek pohon, menempatkan orang-orang yang melakukan jenis, kemudian menunjukkan ringkasan dari masing-masing satu. Dari titik ini, itu hanya masalah mencari melalui berkomitmen untuk menemukan yang tepat "WIP pada pekerjaan: 6a9bb2" ("pekerjaan" adalah cabang saya, 619bb2 baru-baru ini melakukan).
Saya perhatikan bahwa jika saya menggunakan "git simpanan menerapkan" bukan "git simpanan pop" aku't memiliki masalah ini, dan jika saya menggunakan "git menyimpan save pesan" kemudian melakukan mungkin telah lebih mudah untuk menemukan.
Update: Dengan Nathan's, ide ini menjadi lebih pendek:
git fsck --terjangkau | grep melakukan
harus menunjukkan sha1, meskipun daftar ini kembali mungkin cukup besar.git show <sha1>
akan menunjukkan jika ini adalah melakukan yang anda inginkan.git cherry-pick-m 1 <sha1>
akan bergabung komit ke cabang saat ini.Jika anda ingin restash simpanan hilang, anda perlu menemukan hash anda kehilangan simpanan yang pertama.
Seperti Aristoteles Pagaltzis menyarankan
git fsck
harus membantu anda.Secara pribadi saya menggunakan
log-semua
alias yang menunjukkan saya setiap melakukan (recoverable melakukan) untuk memiliki pandangan yang lebih baik dari situasi tersebut :Anda dapat melakukan pencarian bahkan lebih cepat jika anda're hanya mencari "WIP pada" pesan.
Setelah anda tahu anda sha1, anda hanya mengubah simpanan anda reflog untuk menambahkan tua simpanan :
Anda'mungkin akan lebih memilih untuk memiliki pesan terkait sehingga
-m
Dan anda'll bahkan ingin menggunakan ini sebagai alias :
Windows PowerShell setara menggunakan gitk:
gitk-semua $(git fsck-tidak-reflog | Pilih-String "(menjuntai komit )(.*)" | %{ $_.Line.Split(' ')[2] })
Mungkin ada cara yang lebih efisien untuk melakukan hal ini dalam satu pipa, tapi ini melakukan pekerjaan.
Aku suka Aristoteles's pendekatan, tetapi didn't seperti menggunakan GITK... seperti yang saya'm digunakan untuk menggunakan GIT dari baris perintah.
Sebaliknya, saya mengambil menjuntai melakukan dan output kode untuk DIFF file untuk review dalam code editor.
Sekarang anda dapat memuat dihasilkan diff/txt file (di folder home anda) ke txt editor dan lihat kode aktual dan dihasilkan SHA.
Kemudian hanya menggunakan
Anda bisa daftar semua tidak terjangkau melakukan dengan menulis perintah ini di terminal -
Cek terjangkau melakukan hash -
Akhirnya berlaku jika anda menemukan menyembunyikan item -
Mengapa orang-orang bertanya pertanyaan ini? Karena mereka don't belum tahu atau memahami reflog.
Sebagian besar jawaban untuk pertanyaan ini memberikan perintah yang panjang dengan pilihan hampir tak seorang pun akan ingat. Jadi orang-orang datang ke pertanyaan ini dan copy paste apapun yang mereka pikir mereka butuhkan dan lupakan saja segera setelah.
Saya akan menyarankan semua orang dengan pertanyaan ini untuk hanya memeriksa reflog (git reflog), tidak lebih dari itu. Setelah anda melihat daftar semua komit ada seratus cara untuk mengetahui apa yang komit anda'kembali mencari dan ceri-memilih atau membuat cabang dari itu. Dalam proses anda'll telah belajar tentang reflog dan pilihan yang berguna untuk berbagai dasar perintah git.
Di OSX dengan git v2.6.4, saya hanya menjalankan git simpanan drop sengaja, maka saya ditemukan dengan pergi melalui langkah-langkah di bawah ini
Jika anda tahu nama dari simpanan kemudian gunakan:
$ git fsck --terjangkau | grep melakukan | cut-c 20- | xargs git show | grep -B 6 -2 <nama stash>
jika tidak, anda akan mendapatkan ID dari hasil secara manual dengan:
$ git fsck --terjangkau | grep melakukan | cut-c 20- | xargs git show
Kemudian ketika anda menemukan commit-id hanya memukul git simpanan menerapkan {commit-id}
Semoga ini bisa membantu seseorang dengan cepat
Saya ingin menambahkan untuk menerima solusi lain cara yang baik untuk pergi melalui semua perubahan, ketika anda don't memiliki gitk tersedia atau tidak ada X untuk output.
Maka anda mendapatkan semua bedanya bagi mereka hash yang ditampilkan satu demi satu. Tekan 't' untuk mendapatkan ke yang berikutnya diff.
Saya tidak't mendapatkan jawaban untuk bekerja pada Windows di perintah sederhana jendela (Windows 7 dalam kasus saya).
awk
,grep
danPilih-string
tidak't diakui sebagai perintah. Jadi saya mencoba pendekatan yang berbeda:git fsck --terjangkau | findstr "melakukan"
start cmd /k git show
akan terlihat seperti ini:
start cmd /k git show 8506d235f935b92df65d58e7d75e9441220537a4 mulai cmd /k git show 44078733e1b36962571019126243782421fcd8ae mulai cmd /k git show ec09069ec893db4ec1901f94eefc8dc606b1dbf1 mulai cmd /k git show d00aab9198e8b81d052d90720165e48b287c302e
git menyimpan berlaku (hash anda)
mungkin bukan solusi terbaik, tetapi bekerja untuk saya
Jawaban yang diterima oleh Aristoteles akan menunjukkan semua hal yang mengerjakan, termasuk non-simpanan-seperti melakukan. Untuk menyaring kebisingan:
Ini hanya akan melakukan yang memiliki tepat 3 komit induk (yang setumpuk akan memiliki), dan yang pesan termasuk "WIP pada".
Perlu diingat, bahwa jika anda menyimpan simpanan anda dengan pesan (misalnya
git simpanan simpan "Saya baru dibuat stash"
), ini akan mengganti default "WIP pada..." pesan.Anda dapat menampilkan lebih banyak informasi tentang masing-masing melakukan, misalnya menampilkan pesan commit, atau menyebarkannya ke
git simpanan show
:Favorit saya adalah ini satu-liner:
Ini pada dasarnya adalah ide yang sama seperti jawaban tapi jauh lebih pendek. Tentu saja, anda masih bisa menambahkan
--graph
untuk mendapatkan pohon-seperti tampilan.Ketika anda telah menemukan komit dalam daftar, dengan menerapkan
Bagi saya, menggunakan
--no-reflogs
tidak mengungkapkan kehilangan simpanan yang masuk, tapi--tidak terjangkau
(seperti yang ditemukan di banyak jawaban yang lain) tidak.Jalankan di git bash ketika anda berada di bawah Windows.
Kredit: rincian dari perintah di atas diambil dari https://gist.github.com/joseluisq/7f0f1402f05c45bac10814a9e38f81bf
Apa yang saya datang ke sini mencari cara untuk benar-benar mendapatkan simpanan kembali, terlepas dari apa yang saya telah memeriksa. Secara khusus, saya telah menyembunyikan sesuatu, kemudian memeriksa versi lama, maka poped itu, tapi stash adalah no-op di waktu sebelumnya, jadi simpanan menghilang, saya tidak't hanya melakukan git
simpanan
untuk mendorong kembali pada stack. Ini bekerja untuk saya:Dalam retrospeksi, saya harus telah menggunakan git simpanan menerapkan
tidak
git simpanan pop. Saya melakukan
membedahdan memiliki sedikit patch yang ingin saya terapkan di setiap
membedah` langkah. Sekarang saya'm melakukan hal ini:Pulih dengan menggunakan langkah-langkah berikut:
gitk-semua $( git fsck-tidak-reflog | awk '/menggantung melakukan/ {print $3}' )
git cherry-pick-m 1 $stash_hash_code
git mergetool
Selain itu anda mungkin akan mengalami masalah dengan melakukan pesan jika anda menggunakan gerrit. Silakan Menyimpan perubahan anda sebelum berikutnya alternatif: