Membatalkan git simpanan pop git

186

Saya menyembunyikan beberapa perubahan lokal sebelum melakukan penggabungan yang rumit, melakukan penggabungan, kemudian dengan bodoh lupa untuk melakukan sebelum menjalankan git stash pop. Pop menciptakan beberapa masalah (metode buruk memanggil basis kode besar) yang terbukti sulit dilacak. Saya berlari git stash show, jadi saya setidaknya tahu file mana yang diubah. Jika tidak ada yang lain, saya kira ini adalah pelajaran untuk melakukan lebih banyak.

Pertanyaan saya: apakah mungkin untuk membatalkan tumpukan simpanan tanpa juga membatalkan penggabungan?

nren
sumber
2
Anda tidak seharusnya diizinkan git stash poptanpa melakukan terlebih dahulu. Apa yang Anda lakukan untuk mencapainya?
Chris Jester-Young
Tidak yakin jujur ​​(ini kemarin). Penggabungan tidak melakukan dengan sendirinya karena ada konflik. Saya entah bagaimana bisa menjalankan simpanan pop setelah itu.
nren
1
Saya melakukan ini hanya tahu menggunakan git versi 1.7.9.msysgit.0. Saya memiliki file yang tidak dipentaskan dan pop simpanan baru saja menggabungkan semuanya.
PandaWood
Saya bisa menjalankan git stash popsetelah melakukan perubahan (saya tidak melakukan meskipun) dengan git versi 2.25.0.windows.1
Artem Hevorhian
Jika Anda mengindeks perubahan Anda dan kehilangan mereka saat Anda berlari stash pop/applysebelum membuat komit, Anda bisa memecat git fsck --lost-found. Perintah ini akan beralih melalui gumpalan menggantung (file aktual untuk mereka yang tidak terbiasa dengan terminologi git) yang dipentaskan tetapi tidak dilakukan di mana saja (karena itu menggantung), dan meletakkannya di bawah direktori .git / hilang-ditemukan / , di mana Anda dapat git showmelihatnya dan melihat apakah ini file yang Anda cari.
Artem Hevorhian

Jawaban:

69

Coba gunakan Bagaimana memulihkan simpanan jatuh di Git? untuk menemukan simpanan Anda muncul. Saya pikir selalu ada dua komit untuk simpanan, karena menyimpan indeks dan copy pekerjaan (sehingga sering komit indeks akan kosong). Kemudian git showmereka melihat diff dan gunakan patch -Runtuk membatalkan permohonan mereka.

Ben Jackson
sumber
6
Wow itu berhasil. Saya dapat menemukan simpanan komit dengan git fsck --no-reflog | awk '/dangling commit/ {print $3}'(dari tautan), dan saya hanya menemukan secara manual masalah dari diff itu. Terima kasih!
nren
1
fsck menampilkan daftar besar. Sangat membosankan untuk menampilkan setiap SHA1 di luar sana. Bagaimana kamu melakukan ini ?
meson10
5
@ meson10: Sayangnya simpanan disimpan dalam reflog, yang akan menjadi cara yang jelas (jika mereka cabang nyata) untuk melihat sejarah simpanan yang muncul. Izinkan saya menyarankan bahwa permintaan bantuan + downvote bukan strategi terbaik.
Ben Jackson
2
Aku butuh sedikit kesulitan untuk memperbaikinya. Berikut adalah hasil dari pekerjaan saya: git diff -p ${STACH_SHA1}~1 ${STASH_SHA1} | patch -R -p1; Saya mencoba dengan yang git showdisarankan tetapi hasilnya tidak baik untuk patch; juga saya harus memberikan -p1opsi untuk menambal untuk menghapus a/..dan b/..elemen yang git diffdiletakkan di depan file kalau tidak itu tidak akan menyelesaikan jalur dari root repositori. SARAN: hati-hati dan lakukan kekacauan di cabang terpisah sebelum bermain dengan patch.
basilikode
@ BenJackson Dalam jawaban Anda "selalu" berarti keduanya stash popdan stash pushakan memicu komit yang akan menyimpan perubahan ke indeks dan direktori kerja, kan?
Artem Hevorhian
36

Dari git stash --help

Recovering stashes that were cleared/dropped erroneously
   If you mistakenly drop or clear stashes, they cannot be recovered through the normal safety mechanisms. However, you can try the
   following incantation to get a list of stashes that are still in your repository, but not reachable any more:

       git fsck --unreachable |
       grep commit | cut -d\  -f3 |
       xargs git log --merges --no-walk --grep=WIP

Ini membantu saya lebih baik daripada jawaban yang diterima dengan skenario yang sama.

kachar
sumber
13
Perhatikan bahwa banyak solusi yang melibatkan pencarian "WIP" mengandalkan pesan simpanan default. Jika Anda memberikan simpanan pesan eksplisit, mereka mungkin tidak mengandung WIP.
Ben Jackson
Terima kasih. Saya menambahkan opsi --oneline ke perintah log untuk meningkatkan keterbacaan.
basslo
Ini hanya membantu Anda menemukan SHA dari simpanan komit. Tetapi jika diintegrasikan dengan @basilikode komentar dari jawaban yang diterima (git diff SHA ~ 1 SHA | patch -R), itu berfungsi dengan baik. Saya merekomendasikan untuk menggunakan path --dry-run dulu untuk memeriksa
Jarek C
3

Jika penggabungan Anda tidak terlalu rumit, pilihan lain adalah:

  1. Pindahkan semua perubahan termasuk gabungan perubahan kembali ke simpanan menggunakan "git stash"
  2. Jalankan penggabungan lagi dan komit perubahan Anda (tanpa perubahan dari simpanan yang dijatuhkan)
  3. Jalankan "git stash pop" yang seharusnya mengabaikan semua perubahan dari penggabungan Anda sebelumnya karena file-file tersebut identik sekarang.

Setelah itu Anda hanya memiliki perubahan dari simpanan yang Anda jatuhkan terlalu dini.

markus
sumber