Saya tahu bagaimana menyelesaikan ini:
user@host$ git pull
Updating 9386059..6e3ffde
error: Your local changes to the following files would be overwritten by merge:
foo.bar
Please, commit your changes or stash them before you can merge.
Aborting
Tetapi tidak ada cara untuk membiarkan git pull
melakukan stash
dan pop
tari bagi saya?
Jika perintah ini memiliki nama yang berbeda, tidak apa-apa.
Membuat alias shell untuk git stash; git pull; git stash pop
adalah solusi, tetapi saya mencari solusi yang lebih baik.
git stash; git pull; git stash pop
terprogram berbahaya, karena jika tidak ada yanggit stash
disimpan , akan menjadi no-op, tetapigit stash pop
akan memunculkan simpanan terakhir (jika ada), yang hampir pasti bukan yang Anda inginkan. Pengguna torek memiliki posting yang bagus tentang ini di Stack Overflow, tetapi saya tidak dapat menemukannya ...Jawaban:
Untuk Git 2.6+ (dirilis 28 Sept 2015)
Itu
hanyagit config
pengaturan yang menarik adalah:(dengan Git 2.27, Q2 2020, Anda sekarang juga punya
merge.autostash
, lihat di bawah)gabungkan dengan:
Itu akan cukup bagi orang sederhana
git pull
untuk bekerja bahkan di pohon yang kotor.Tidak ada alias diperlukan dalam kasus itu.
Lihat commit 53c76dc (04 Jul 2015) oleh Kevin Daudt (
Ikke
) .(Digabung oleh Junio C Hamano -
gitster
- di commit e69b408 , 17 Agustus 2015)Catatan: jika Anda ingin menarik tanpa autostash (meskipun
rebase.autoStash true
telah disetel), Anda memiliki sejak git 2.9 (Juni 2016):Lihat commit 450dd1d , commit 1662297 , commit 44a59ff , commit 5c82bcd , commit 6ddc97c , commit eff960b , commit efa195d (02 Apr 2016), dan commit f66398e , commit c48d73b (21 Mar 2016) oleh Mehul Jain (
mehul2029
) .(Digabung oleh Junio C Hamano -
gitster
- di commit 7c137bb , 13 Apr 2016)Commit f66398e khususnya mencakup:
Peringatan: sebelum Git 2.14 (Q3 2017), "
git pull --rebase --autostash
" tidak disimpan otomatis saat riwayat lokal maju cepat ke upstream.Lihat commit f15e7cf (01 Jun 2017) oleh Tyler Brazier (
tylerbrazier
) .(Digabung oleh Junio C Hamano -
gitster
- di commit 35898ea , 05 Jun 2017)Pembaruan: Mariusz Pawelski bertanya di komentar sebuah pertanyaan menarik:
Menjawab:
The thread asli membahas fitur autostash ini, dilaksanakan awalnya baik untuk
git pull
(penggabungan) dangit pull --rebase
.Tapi ... Junio C Hamano (pengelola Git) mencatat bahwa:
Jadi, berkenaan dengan pull-merge klasik, lebih baik untuk:
Yang sedang berkata, dengan Git 2.27 (Kuartal 2 2020), "
git pull
" belajar memperingatkan ketika tidakpull.rebase
ada konfigurasi, dan juga--[no-]rebase
tidak--ff-only
diberikan (yang akan menghasilkan penggabungan).Lihat commit d18c950 (10 Mar 2020) oleh Alex Henrie (
alexhenrie
) .(Digabung oleh Junio C Hamano -
gitster
- di commit 1c56d6f , 27 Mar 2020)Dengan Git 2.27 (Kuartal 2 2020), "
git merge
" mempelajari opsi "--autostash
", danmerge.autostash
setelan baru .Lihat komit d9f15d3 , komit f8a1785 , komit a03b555 , komit 804fe31 , komit 12b6e13 , komit 0dd562e , komit 0816f1d , komit 9bb3dea , komit 4d4bc15 , komit b309a97 , komit f213f06 , komit 86ed00a , komit facca7f , komit be1bb60 , komit efcf6cf , komit c20de8b , komit bfa50c2 , commit 3442c3d , commit 5b2f6d9 (07 Apr 2020), commit 65c425a(04 Apr 2020), dan commit fd6852c , commit 805d9ea (21 Mar 2020) oleh Denton Liu (
Denton-L
) .(Digabung oleh Junio C Hamano -
gitster
- di commit bf10200 , 29 Apr 2020)Dan:
sumber
rebase.autoStash
berlaku hanya saat menggunakan rebase.pull.rebase
berlaku hanya saat menggunakan tarikan.die_on_unclean_work_tree
.2.5.5
.rebase
(ataupull --rebase
). Tetapi tidak ada yang mengambil tentang autostashing ketika Anda melakukan normalpull
dengan penggabungan. Jadi tidak ada saklar otomatis untuk itu? Atau saya melewatkan sesuatu? Saya lebih suka melakukangit pull --rebase
tetapi OP bertanya tentang "standar"git pull
Untuk menghemat beberapa detik bagi penjelajah yang akan datang, berikut ringkasannya (terima kasih kepada @VonC):
sumber
git config pull.rebase true
dangit config rebase.autoStash true
, yang Anda butuhkan hanyalahgit pull
. Cumagit pull
. Tidak ada pilihan lain yang dibutuhkan.--autostash
opsi tersebut. The-c rebase.autoStash=true
bekerja di Git 2,6 seterusnya.Seperti yang dinyatakan oleh komentar di atas, menyetel dua nilai konfigurasi saat ini tidak berfungsi
git pull
, karena konfigurasi autostash hanya berlaku untuk rebases sebenarnya. Perintah git ini melakukan apa yang Anda inginkan:Atau atur sebagai alias:
Kemudian lakukan:
Tentu saja alias ini bisa diganti namanya sesuai keinginan.
sumber
Dengan Git 2.6+ Anda dapat menggunakan berikut ini:
Ini
--rebase
membuat penggunaan git-pullrebase
alih-alihmerge
, jadi pengaturan / opsi seperti--ff-only
tidak akan berlaku.Saya menggunakan alias untuk menarik
--ff-only
secara default (git pull --ff-only
), dan kemudian dapat menggunakangup
(dari atas) jika penggabungan maju cepat tidak memungkinkan atau ada perubahan yang disimpan.sumber
git pull --ff-only
dangit pull pull --rebase --autostash
Seperti yang telah Anda sebutkan, inilah cara melakukannya. Anda dapat menggunakannya dalam alias untuk menghemat pengetikan dan untuk menggunakan pintasan atau Anda dapat menggunakannya dalam satu baris (bisa juga alias)
git stash && git pull --rebase && git stash pop
Ini akan melakukan hal yang sama seperti yang Anda lakukan tetapi dalam satu baris (&&) dan Anda menetapkan sebagai alias bahkan akan lebih pendek.
Baris berikut akan menampilkan perubahan masuk / keluar sebelum Anda menarik / mendorong
sumber
stash pop
akan melepaskan beberapa item acak dari sebelumnya.git stash
tidak apa-apa simpanan masih "kembali" tidak ada errorcode sehingga && masih akan melanjutkangit pull
dangit stash pop
dan pop setumpuk sebelumnya. Jadi lebih baik tidak menggunakan ini kecuali Anda sangat yakin itu akan menyimpan sesuatu!