Seperti yang ditanyakan dalam pertanyaan ini , saya juga ingin tahu bagaimana menyelesaikan konflik git stash pop
tanpa menambahkan semua modifikasi ke komit (seperti "git stash pop" tanpa konflik tidak).
Pendekatan saya saat ini sangat tidak keren karena saya melakukannya dengan cara ini:
git stash pop -> CONFLICT
git stash drop
[resolve conflict]
[add conflict files]
git reset HEAD <all files that are in commit-mode>
[Perbarui] Cara memperbanyaknya:
mkdir foo; cd foo; git init
echo "1" > one
echo "2" > two
git add -A; git commit -m "first"
echo "1.1" > one
echo "2.1" > two
git stash
echo "2.2" > two
git commit -a -m "second"
echo "Only this file would stay in HEAD without the conflict" > third
git add third
git stash pop
git status
2016-06-27: Menambahkan file baru yang disebut 'ketiga' ke contoh untuk menunjukkan bahwa solusi seperti scy hanya bekerja untuk HEADs kosong tetapi tidak memperbaiki masalah awal bahwa HEAD tidak memiliki konten yang sama seperti untuk git stash pop
tanpa konflik.
git add
file konflik yang Anda selesaikan, secara efektif mengaturnya dalam indeks, dan Anda ingin tidak memilikinya dalam indeks kami?git stash pop
terjadi ketika tidak ada konflik (tetapi dengan pemberitahuan file mana yang perlu digabung).Jawaban:
Jangan ikuti jawaban lain
Nah, Anda bisa mengikuti mereka :). Tetapi saya tidak berpikir bahwa melakukan komit dan mengatur ulang cabang untuk menghapus komit itu dan solusi serupa yang disarankan dalam jawaban lain adalah cara bersih untuk menyelesaikan masalah ini.
Solusi bersih
Solusi berikut ini tampaknya jauh lebih bersih bagi saya dan itu juga disarankan oleh Git sendiri - coba jalankan
git status
dalam repositori dengan konflik:Jadi mari kita lakukan apa yang disarankan Git (tanpa melakukan komitmen yang tidak berguna):
git reset
untuk menandai konflik sebagai terselesaikan dan menghapus tahapan perubahan. Anda dapat menjalankannya tanpa parameter apa pun dan Git akan menghapus semuanya dari indeks. Anda tidak harus mengeksekusigit add
sebelumnya.git stash drop
, karena Git tidak melakukan itu pada konflik.Diterjemahkan ke baris perintah:
Penjelasan tentang perilaku default
Ada dua cara untuk menandai konflik yang diselesaikan:
git add
dangit reset
. Sementaragit reset
menandai konflik sebagai terselesaikan dan menghapus file dari indeks,git add
juga menandai konflik sebagai diselesaikan, tetapi menyimpan file dalam indeks.Menambahkan file ke indeks setelah konflik diselesaikan dengan sengaja. Dengan cara ini Anda dapat membedakan perubahan dari simpanan sebelumnya dan perubahan yang Anda buat setelah konflik diselesaikan. Jika Anda tidak menyukainya, Anda selalu dapat menggunakan
git reset
untuk menghapus semuanya dari indeks.Gabungkan alat
Saya sangat merekomendasikan menggunakan alat penggabungan 3 arah untuk menyelesaikan konflik, misalnya KDiff3 , Meld , dll., Daripada melakukannya secara manual. Biasanya menyelesaikan semua atau sebagian besar konflik secara otomatis. Ini penghemat waktu yang sangat besar !
sumber
git stash pop
gagal dengan konflik.git stash drop
kecuali Anda ingin menyimpan simpanan itu.Misalkan Anda memiliki skenario ini di mana Anda menyimpan perubahan Anda untuk menarik dari asal. Mungkin karena perubahan lokal Anda hanya
debug: true
di beberapa file pengaturan. Sekarang Anda menarik dan seseorang telah memperkenalkan pengaturan baru di sana, menciptakan konflik.git status
mengatakan:Baik. Saya memutuskan untuk pergi dengan apa yang disarankan Git: Saya menyelesaikan konflik dan berkomitmen:
Sekarang copy pekerjaan saya dalam keadaan yang saya inginkan, tetapi saya telah membuat komit yang tidak saya inginkan. Bagaimana cara saya menghilangkan komit itu tanpa memodifikasi copy pekerjaan saya? Tunggu, ada perintah populer untuk itu!
Salinan kerja saya belum diubah, tetapi komit WIP hilang. Itulah yang saya inginkan! (Perhatikan bahwa saya tidak menggunakan di
--soft
sini, karena jika ada file yang digabungkan secara otomatis di simpanan Anda, mereka dipentaskan secara otomatis dan dengan demikian Anda akan berakhir dengan file-file ini dipentaskan lagi setelah itureset
.)Tapi ada satu hal lagi yang tersisa: Halaman manual untuk
git stash pop
mengingatkan kita bahwa "Menerapkan negara dapat gagal dengan konflik; dalam hal ini, itu tidak dihapus dari daftar simpanan. Anda perlu menyelesaikan konflik dengan tangan dan menelepongit stash drop
secara manual setelah itu." Jadi itulah yang kami lakukan sekarang:Dan selesai.
sumber
git add <resolved conflict files>
diikutigit reset HEAD
?git stash pop
tanpa konflik. Cukup tambahkan file lain ke KEPALA sebelum melakukan konflikgit stash pop
dan daripada Andagit commit -a -m WIP
juga akan menambahkan file baru ke komit. Tetapi tanpa konflik, hanya file baru akan tetap di HEAD tetapi tidakgit stash pop
file.^
digunakan sebagai kelanjutan garis khusus dan akan membuat Anda duduk di More? meminta alih-alih mengeksekusi perintah. Sebaliknya menggunakan:git reset --soft HEAD~1
. Lihat bagaimana-do-i-delete-unpushed-git-commit?Alih-alih menambahkan perubahan yang Anda buat untuk menyelesaikan konflik, Anda dapat menggunakan
git reset HEAD file
untuk menyelesaikan konflik tanpa melakukan perubahan.Anda mungkin harus menjalankan perintah ini dua kali. Sekali untuk menandai konflik sebagai terselesaikan dan sekali untuk unstage perubahan yang dipentaskan oleh rutin resolusi konflik.
Ada kemungkinan bahwa harus ada mode reset yang melakukan kedua hal ini secara bersamaan, meskipun tidak ada sekarang.
sumber
bekerja untukku.
Catatan : ini bisa berbahaya karena tidak mencoba menggabungkan perubahan dari simpanan ke dalam copy pekerjaan Anda, tetapi menimpanya dengan file simpanan sebagai gantinya. Jadi, Anda dapat kehilangan perubahan yang tidak dikomit.
sumber
git add .
akan menampilkan SEMUA file yang memberitahu git bahwa Anda telah menyelesaikan konflikgit reset
akan menghapus semua SEMUA file yang dipentaskan tanpa membuat komitsumber
git add -u
itugit reset
Sepertinya ini mungkin jawaban yang Anda cari, saya belum mencoba ini secara pribadi, tetapi sepertinya itu bisa melakukan trik. Dengan perintah ini, GIT akan mencoba menerapkan perubahan seperti sebelumnya, tanpa mencoba menambahkan semuanya untuk komit.
git stash apply --index
berikut ini penjelasan lengkapnya:
http://git-scm.com/book/en/Git-Tools-Stashing
sumber
git stash pop
- atau adakah cara untuk mengembalikan ini dan melakukangit stash apply --index
ketika saya tahu itugit stash pop
akan mengalami konflik?git stash pop
dan berakhir dengan konflik, simpanan tidak dihapus ... sehingga Anda dapat larigit reset --hard
untuk membatalkan pop dan kemudian mencoba solusi yang saya sarankan.git stash branch
akan bekerja, yang menciptakan cabang baru untuk Anda, memeriksa komit yang Anda temui ketika Anda menyimpan pekerjaan Anda, mengajukan kembali pekerjaan Anda di sana, dan kemudian menjatuhkan simpanan jika itu berhasil diterapkan. periksa inisumber
Cara tercepat yang saya temukan adalah menyelesaikan konflik, lalu lakukan
git add -u
, dan kemudian lakukangit reset HEAD
, itu bahkan tidak melibatkan komitmen.sumber
Menurut pertanyaan simpanan git , setelah memperbaiki konflik,
git add <file>
adalah tindakan yang tepat.Setelah membaca komentar ini saya mengerti bahwa perubahan secara otomatis ditambahkan ke indeks (sesuai desain). Itu sebabnya
git add <file>
menyelesaikan proses resolusi konflik.sumber
Ini bukan cara terbaik untuk melakukannya tetapi bekerja:
sumber
file/path/to/your/file
, yang bukan apa yang diminta OP, AFAIU