Saya muncul simpanan dan ada konflik gabungan. Tidak seperti pertanyaan yang didaftar sebagai duplikat, saya sudah memiliki beberapa perubahan dalam direktori yang ingin saya simpan. Saya tidak hanya ingin membuat konflik gabungan menghilang, tetapi juga untuk mendapatkan direktori saya kembali ke keadaan sebelum pop.
Saya mencoba git merge --abort
, tetapi git mengklaim tidak ada penggabungan yang sedang berlangsung. Apakah ada cara mudah untuk membatalkan pop tanpa merusak perubahan yang saya miliki di direktori?
git stash pop
pada dir yang kotor. Dalam hal ini Anda mungkin hanyagit reset --hard
dan simpanan Anda masih utuh. (Ini kurang lebih seperti yang disarankan oleh topik terkait @ BradKoch)Jawaban:
Ok, saya pikir saya sudah berhasil "git simpanan tidak pantas". Ini lebih kompleks daripada
git apply --reverse
karena Anda perlu tindakan penggabungan terbalik jika ada penggabungan yang dilakukan olehgit stash apply
.Penggabungan terbalik mengharuskan semua perubahan saat ini didorong ke dalam indeks:
git add -u
Kemudian membalikkan
merge-recursive
itu dilakukan olehgit stash apply
:git merge-recursive stash@{0}: -- $(git write-tree) stash@{0}^1
Sekarang Anda akan dibiarkan hanya dengan perubahan non-simpanan. Mereka akan berada dalam indeks. Anda dapat menggunakan
git reset
untuk menghapus stage perubahan Anda jika Anda mau.Mengingat bahwa dokumen asli Anda
git stash apply
gagal, saya berasumsi sebaliknya mungkin juga gagal karena beberapa hal yang ingin dibatalkan tidak dilakukan.Berikut ini contoh yang menunjukkan bagaimana copy pekerjaan (via
git status
) kembali bersih:sumber
git stash apply
tidak pernah menjatuhkan simpanan, dan ketika penggabungan gagal makagit stash pop
juga mempertahankan simpananKasus penggunaan saya: baru saja mencoba muncul ke cabang yang salah dan mendapat konflik. Yang saya butuhkan adalah membatalkan pop tetapi menyimpannya di daftar simpanan sehingga saya bisa mengeluarkannya di cabang yang benar. Saya melakukan ini:
Mudah.
sumber
stash pop
ke dalamnya. Itu terdengar seperti resep bencana.Sunting: Dari
git help stash
dokumentasi di bagian pop:Menerapkan negara dapat gagal dengan konflik; dalam hal ini, itu tidak dihapus dari daftar simpanan. Anda perlu menyelesaikan konflik dengan tangan dan memanggil drop git secara manual setelahnya.
Jika opsi --index digunakan, maka cobalah untuk mengembalikan tidak hanya perubahan pohon kerja, tetapi juga yang indeks itu. Namun, ini bisa gagal, ketika Anda memiliki konflik (yang disimpan dalam indeks, karena itu Anda tidak dapat lagi menerapkan perubahan seperti aslinya).
Cobalah menyalin semua repo ke dalam direktori baru (sehingga Anda memiliki salinannya) dan jalankan:
git stash show
dan simpan output itu di suatu tempat jika Anda peduli.lalu:
git stash drop
untuk membatalkan simpanan yang bertentangan maka:git reset HEAD
Itu seharusnya membuat repo Anda dalam keadaan seperti semula (semoga, saya masih belum bisa menegur masalah Anda)
===
Saya mencoba untuk memperbaiki masalah Anda, tetapi semua yang saya dapatkan ketika menggunakan
git stash pop
adalah:Dalam dir bersih:
Saya tidak melihat git mencoba untuk menggabungkan perubahan saya, itu hanya gagal. Apakah Anda memiliki langkah repro yang dapat kami ikuti untuk membantu Anda?
sumber
Saya selalu menggunakan
git reset --merge
Saya tidak dapat mengingatnya pernah gagal.
sumber
git reset
. Apakah Anda tahu apakah itu identik secara fungsionalgit reset --merge
?Jika Anda tidak perlu khawatir tentang perubahan lain yang Anda buat dan Anda hanya ingin kembali ke komit terakhir, maka Anda dapat melakukan:
sumber
OK, saya pikir saya telah berhasil menemukan alur kerja yang akan membawa Anda kembali ke tempat yang Anda inginkan (seolah-olah Anda belum melakukan pop).
MENGAMBIL CADANGAN SEBELUM !! Saya tidak tahu apakah ini akan berhasil untuk Anda, jadi salin seluruh repo Anda kalau-kalau itu tidak berhasil.
1) Perbaiki masalah penggabungan dan perbaiki semua konflik dengan memilih semua perubahan yang datang dari tambalan (dalam tortoisemerge, ini muncul sebagai satu. REMOETE (milik mereka)).
2) Komit perubahan ini (mereka sudah akan ditambahkan melalui perintah mergetool). Berikan pesan komit "gabungan" atau sesuatu yang Anda ingat.
3) Sekarang Anda masih akan memiliki perubahan lokal yang belum diprogram yang Anda mulai semula, dengan komit baru dari tambalan (kami dapat menyingkirkan ini nanti). Sekarang komit perubahan Anda yang tidak dipentaskan
4) Balikkan tambalan. Ini dapat dilakukan dengan perintah berikut:
5) Lakukan perubahan ini:
6) Singkirkan tambalan / pembatalan komitmen
dari ini, hapus dua baris dengan 'menggabungkan' dan 'tambalan terbalik' di dalamnya.
7) Dapatkan kembali perubahan tak bertanggal Anda dan batalkan komit 'perubahan lokal'
Saya telah menjalankannya dengan contoh sederhana dan itu membuat Anda kembali ke tempat yang Anda inginkan - langsung sebelum simpanan muncul, dengan perubahan lokal Anda dan simpanan masih tersedia untuk muncul.
sumber
git stash show -p | git apply -R
itu tidak bekerja jikagit stash apply
melakukan penggabungan nyata. Lihat jawaban saya ...Saya memecahkan ini dengan cara yang agak berbeda. Inilah yang terjadi.
Pertama, saya muncul di cabang yang salah dan mendapat konflik. Stash tetap utuh tetapi indeks dalam resolusi konflik, memblokir banyak perintah.
Sederhana
git reset HEAD
dibatalkan resolusi konflik dan meninggalkan perubahan tidak berkomitmen (dan TIDAK DIINGINKAN ).Beberapa
git co <filename>
mengembalikan indeks ke keadaan awal. Akhirnya, saya beralih cabanggit co <branch-name>
dan menjalankan yang barugit stash pop
, yang diselesaikan tanpa konflik.sumber
Beberapa ide:
Gunakan
git mergetool
untuk membagi file gabungan menjadi bagian asli dan baru. Semoga salah satunya adalah file dengan perubahan non-simpanan Anda di dalamnya.Terapkan diff simpanan secara terbalik, untuk membatalkan perubahan itu saja. Anda mungkin harus membagi file secara manual dengan konflik penggabungan (yang semoga trik di atas akan berhasil).
Saya tidak menguji salah satu dari ini, jadi saya tidak tahu pasti mereka akan bekerja.
sumber
Saya dapat mereproduksi bersih
git stash pop
pada direktori "kotor", dengan perubahan yang tidak dikomit, tetapi belum muncul yang menghasilkan konflik gabungan.Jika pada konflik gabungan simpanan yang Anda coba terapkan tidak hilang, Anda dapat mencoba memeriksa
git show stash@{0}
(opsional dengan--ours
atau--theirs
) dan membandingkan dengangit statis
dangit diff HEAD
. Anda harus dapat melihat perubahan mana yang berasal dari penerapan simpanan.sumber
Jika DavidG benar bahwa itu tidak menghapus simpanan karena konflik gabungan, maka Anda hanya perlu membersihkan direktori kerja Anda. Dengan cepat
git commit
semua yang Anda pedulikan. (Anda dapatreset
atausquash
komit nanti jika Anda tidak selesai.) Kemudian dengan semua yang Anda pedulikan aman,git reset
semua yang laingit stash pop
dimasukkan ke direktori kerja Anda.sumber
Jika tidak ada perubahan bertahap sebelum
git stash pop
, seperti dalam pertanyaan, maka dua perintah berikut akan berfungsi.Yang pertama membalikkan gabungan dari simpanan, sukses atau tidak. Yang kedua menghapus semua file yang tidak terlacak yang diperkenalkan oleh simpanan.
Dari
man git stash
:The working directory must match the index.
Yang ditunjukkan @DavidG,stash pop
akan gagal jika ada file yang dimodifikasi yang tidak dipentaskan konflik. Dengan demikian, kita tidak perlu khawatir tentang menyelesaikan konflik gabungan sebelum kembali keHEAD
. Setiap file yang dimodifikasi yang tersisa kemudian tidak terkait dengan simpanan, dan dimodifikasi sebelumstash pop
Jika ada perubahan bertahap, saya tidak yakin apakah kita bisa mengandalkan perintah yang sama dan Anda mungkin ingin mencoba teknik @Ben Jackson. Saran dihargai ..
Berikut ini adalah pengaturan pengujian untuk semua berbagai kasus https://gist.github.com/here/4f3af6dafdb4ca15e804
sumber
Gunakan
git reflog
untuk mendaftar semua perubahan yang dibuat dalam sejarah git Anda. Salin id tindakan dan ketikgit reset ACTION_ID
sumber
Saya memposting di sini berharap yang lain menemukan jawaban saya bermanfaat. Saya memiliki masalah yang sama ketika saya mencoba melakukan simpanan pada cabang yang berbeda dari yang saya simpan. Pada kasus saya, saya tidak memiliki file yang tidak dikomit atau dalam indeks tetapi masih masuk ke kasus menggabungkan konflik (kasus yang sama dengan @pid). Seperti yang orang lain tunjukkan sebelumnya, pop gagal git yang gagal memang mempertahankan simpanan saya, lalu git cepat mereset KEPALA ditambah kembali ke cabang asli saya dan melakukan simpanan dari sana memang menyelesaikan masalah saya.
sumber