Batalkan git stash pop yang menghasilkan penggabungan konflik

519

Saya mulai membuat perubahan pada basis kode saya, tidak menyadari saya berada di cabang topik lama. Untuk mentransfernya, saya ingin menyimpannya dan kemudian menerapkannya ke cabang baru di luar master. Saya biasa git stash popmentransfer perubahan yang sedang berlangsung ke cabang baru ini, lupa bahwa saya belum menarik perubahan baru ke master sebelum membuat cabang baru. Ini menghasilkan banyak konflik gabungan dan hilangnya simpanan perubahan saya (karena saya menggunakan pop).

Setelah saya membuat ulang cabang baru dengan benar, bagaimana saya bisa memulihkan perubahan simpanan saya untuk menerapkannya dengan benar?

acjay
sumber

Jawaban:

657

Ternyata, Git cukup pintar untuk tidak menjatuhkan simpanan jika itu tidak berlaku bersih. Saya dapat mencapai status yang diinginkan dengan langkah-langkah berikut:

  1. Untuk menghapus tahapan konflik gabungan: git reset HEAD .(perhatikan titik trailing)
  2. Untuk menyimpan gabungan yang bentrok (untuk berjaga-jaga): git stash
  3. Untuk kembali ke master: git checkout master
  4. Untuk menarik perubahan terbaru: git fetch upstream; git merge upstream/master
  5. Untuk memperbaiki cabang baru saya: git checkout new-branch; git rebase master
  6. Untuk menerapkan perubahan simpanan yang benar (sekarang 2nd di tumpukan): git stash apply stash@{1}
acjay
sumber
14
Terima kasih sangat baik! # 6 benar-benar jawaban yang saya cari. Dapat menambahkan git stash dropsebagai langkah terakhir untuk menyingkirkan simpanan yang tidak diinginkan dari # 2.
austinmarton
2
# 2 tidak akan berfungsi jika ada jalur yang tidak di-emergasi, itu malah akan menghasilkan kesalahan yang dijelaskan di sini: stackoverflow.com/questions/5483213/...
Étienne
5
Tidak sepenuhnya benar - Git akan menyimpan simpanan dalam daftar simpanan jika gagal diterapkan dengan bersih. Lihat dokumen ini tentang git stash pop: "Menerapkan negara dapat gagal dengan konflik; dalam hal ini, itu tidak dihapus dari daftar simpanan. Anda perlu menyelesaikan konflik dengan tangan dan menelepon git stash dropsecara manual sesudahnya." ( git-scm.com/docs/git-stash )
Carolyn Conway
4
Aneh bagaimana jawaban dan pertanyaan ini diposting pada menit yang sama persis
panggil saya
14
@ call-me Ini adalah sesuatu yang saya pikir orang harus melakukan lebih sering! Perhatikan bagaimana formulir "Ajukan pertanyaan" memiliki kotak centang yang memungkinkan Anda menjawab pertanyaan Anda sendiri dalam bentuk yang sama :). Ini terjadi pada saya kadang-kadang ketika saya sedang dalam proses menulis pertanyaan yang membuat saya bingung, tetapi dalam mencoba menyesuaikan pertanyaan agar baik untuk StackOverflow, saya akhirnya mencari tahu solusinya. Ini beberapa waktu yang lalu, jadi saya tidak ingat apakah itu yang terjadi di sini, tapi saya kira itulah yang terjadi.
acjay
342

Untungnya git stash poptidak tidak mengubah simpanan dalam kasus konflik!

Jadi tidak perlu khawatir, cukup bersihkan kode Anda dan coba lagi.

Katakanlah basis kode Anda sudah bersih sebelumnya, Anda bisa kembali ke keadaan itu dengan: git checkout -f
Kemudian lakukan hal-hal yang Anda lupa, mis. git merge missing-branch
Setelah itu jalankan git stash poplagi dan Anda mendapatkan simpanan yang sama , yang bertentangan sebelumnya.

Perhatian: Stash aman, namun, perubahan yang tidak dikomit di direktori kerja tidak. Mereka bisa kacau.

flori
sumber
16
Apa yang saya pahami adalah bahwa Anda dapat membersihkan dan pop lagi, tetapi Anda tidak dapat membatalkannya . Jika pop dicampur dengan perubahan tidak dikomit lainnya, maka Anda harus membersihkan secara manual.
haridsv
Ini adalah solusi yang sangat sederhana dan bekerja sangat baik untuk saya. Diasumsikan bahwa Anda dapat mengembalikan semua yang telah berubah secara lokal (tidak ada perubahan sebelum / setelah simpanan muncul) yang saya pikir berfungsi untuk sebagian besar situasi. Jika Anda perlu menyimpan beberapa perubahan tambahan yang terjadi sebelum menyadari bahwa ini adalah masalah, Anda harus dapat mengkomit file-file tersebut sebelum memaksa checkout dalam kebanyakan kasus.
Project707
Ini tidak terjadi pada saya. Saya menyebutnya git stash popberusaha menggabungkan, konflik, dan menyimpannya.
Trevor Hickey
1
@ TrevorHickey Inti dari jawaban ini adalah bahwa simpanan tetap seperti dalam kasus konflik, yang dapat Anda panggil git stash popsesering yang Anda butuhkan sampai berakhir tanpa konflik. Jadi setelah konflik Anda, ya, direktori kerja berantakan, namun, Anda dapat membersihkannya dan menelepon git stash poplagi.
flori
5
perintah ini untuk membatalkan simpanan terakhir berlaku sangat berguna git checkout -f:!
Lefi Tarik
16

Instruksi di sini sedikit rumit sehingga saya akan menawarkan sesuatu yang lebih mudah:

  1. git reset HEAD --hard Abaikan semua perubahan pada cabang saat ini

  2. ... Lakukan pekerjaan perantara seperlunya

  3. git stash pop Pop ulang simpanan lagi di kemudian hari ketika Anda siap

anon58192932
sumber
vimeo.com/79954057
faintsignal
8
git checkout -f

harus bekerja, jika keadaan Anda sebelumnya bersih.

Allahbakash.G
sumber