Pertanyaan Dapatkah "git pull" secara otomatis menyimpan dan menunggu perubahan?


Saya tahu cara 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 membiarkannya git pull lakukan stash dan pop menari untukku?

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.


76
2018-05-13 07:58


asal


Jawaban:


Untuk Git 2.6+ (dirilis 28 September 2015)

Satu-satunya git config pengaturan yang akan menarik adalah:

rebase.autoStash

Ketika diatur ke benar, secara otomatis membuat simpanan sementara sebelum operasi dimulai, dan menerapkannya setelah operasi berakhir.
  Ini berarti Anda dapat menjalankan rebase di worktree kotor.

Namun, gunakan dengan hati-hati: aplikasi simpanan akhir setelah rebase yang sukses dapat menghasilkan konflik yang tidak sepele. Default ke false.

gabungkan dengan:

pull.rebase

Ketika true, rebase bercabang di atas cabang yang diambil, alih-alih menggabungkan cabang default dari remote default ketika "git pull" dijalankan.

git config pull.rebase true
git config rebase.autoStash true

Itu akan cukup untuk yang sederhana git pull untuk bekerja bahkan di pohon yang kotor.
Tidak ada alias yang dibutuhkan dalam kasus itu.


Lihat lakukan 53c76dc (04 Jul 2015) oleh Kevin Daudt (Ikke).
(Digabung oleh Junio ​​C Hamano - gitster - di lakukan e69b408, 17 Agustus 2015) 

pull: memungkinkan pohon yang kotor saat rebase.autostash diaktifkan

rebase belajar untuk menyimpan perubahan ketika menemukan pohon kerja yang kotor,   tapi git pull --rebase tidak.

Hanya verifikasi jika pohon kerja kotor saat rebase.autostash tidak   diaktifkan.


Catatan: jika Anda ingin menarik tanpa autostash (meskipun rebase.autoStash true diatur), Anda memiliki sejak git 2.9 (Juni 2016):

 pull --rebase --no-autostash

Lihat lakukan 450dd1d, lakukan 1662297, lakukan 44a59ff, lakukan 5c82bcd, lakukan 6ddc97c, melakukan eff960b, melakukan efa195d (02 Apr 2016), dan lakukan f66398e, lakukan c48d73b (21 Mar 2016) oleh Mehul Jain (mehul2029).
(Digabung oleh Junio ​​C Hamano - gitster - di lakukan 7c137bb, 13 Apr 2016) 

Berkomitmen f66398e khususnya termasuk:

pull --rebase: tambahkan --[no-]autostash bendera

Jika rebase.autoStash variabel konfigurasi diatur, tidak ada cara untuk   timpa untuk "git pull --rebase"dari baris perintah.

Mengajar "git pull --rebase"itu --[no-]autostash bendera baris perintah yang   mengesampingkan nilai saat ini rebase.autoStash, jika diatur. Sebagai "git rebase"   mengerti --[no-]autostash pilihan, itu hanya masalah lewat   opsi untuk mendasari "git rebase" kapan "git pull --rebase" disebut.


Peringatan: sebelum Git 2.14 (Q3 2017), "git pull --rebase --autostash"Tidak otomatis menyimpan ketika sejarah lokal maju cepat ke hulu.

Lihat lakukan f15e7cf (01 Jun 2017) oleh Tyler Brazier (tylerbrazier).
(Digabung oleh Junio ​​C Hamano - gitster - di komit 35898ea, 05 Jun 2017) 

pull: ff --rebase --autostash bekerja di repo kotor

Kapan git pull --rebase --autostash dalam repositori kotor menghasilkan a   maju cepat, tidak ada yang di-autostash dan tarikan gagal.
  Ini karena pintasan untuk menghindari menjalankan rebase ketika kami dapat mempercepat,   tetapi autostash diabaikan pada codepath itu.


Memperbarui: Mariusz Pawelski bertanya di komentar pertanyaan yang menarik:

Jadi semua orang menulis tentang autostash ketika Anda melakukan rebase (atau pull --rebase).

Tapi tidak ada yang mengambil tentang autostashing ketika Anda melakukan tarikan normal menyatu.
  Jadi tidak ada saklar otomatis untuk itu? Atau saya kehilangan sesuatu? Saya lebih suka melakukan git pull --rebase tapi OP bertanya tentang "standar"Git pull

Menjawab:

Itu utas asli mendiskusikan fitur autostash ini, itu diterapkan awalnya baik untuk git pull (menggabungkan) dan git pull --rebase.

Tapi ... Junio ​​C Hamano (pengelola Git) mencatat bahwa:

Jika itu pull-merge adalah sesuatu yang akan menyebabkan "gangguan"   yang memicu topik ini, menurut definisi, perubahan lokal tumpang tindih   dengan penggabungan, dan "simpanan pop" internal ini akan menyentuh jalan   gabungan itu disentuh dan kemungkinan tidak menghasilkan "Turun" tetapi pergi   konflik lebih lanjut harus diselesaikan.

Saya menduga itu pull.autostash konfigurasi bukan tambahan yang bagus karena mendorong alur kerja yang buruk dan menyakitkan.
  Dalam kasus sederhana mungkin tidak ada salahnya, tetapi ketika perubahan lokal rumit, itu akan secara aktif menyakiti daripada tidak memilikinya, dan konfigurasi merampas insentif untuk memilih.

Persamaannya agak berbeda untuk "tarik-rebase", sebagai "rebase"   memaksa Anda untuk memulai dari pohon kerja yang bersih, jadi "unduh dan   kemudian berhenti "jengkel terasa lebih besar. Saya punya kecurigaan itu   melonggarkan yang mungkin memperbaiki lebih produktif untuk masalah yang sebenarnya.

Jadi, sehubungan dengan penggabungan tarik klasik, lebih baik:

mendorong pengguna untuk berpikir tentang sifat WIP yang ada di pohon kerja sebelum menjalankan "git pull".
  Apakah itu hewan yang terlalu kompleks yang dapat mengganggu apa yang dilakukan orang lain, atau   apakah ini perubahan sepele yang bisa ia singkirkan dan lepaskan kembali?

Jika yang pertama, dia akan jauh lebih baik melakukan "checkout -b", menjaga   bekerja sampai perubahan lokal menjadi agak lebih baik dan   "commit", sebelum menarik ke cabang asli.

Jika yang terakhir, dia lebih baik melakukan:

  • "git pull",
  • setelah menemukannya konflik, jalankan      
    • git stash,
    • git merge FETCH_HEAD dan
    • git stash pop

111
2018-05-13 08:39



Untuk menghemat beberapa detik bagi penjelajah yang akan datang, berikut ini ringkasannya (terima kasih kepada @VonC):

git pull --rebase --autostash

16
2017-08-12 06:27



Seperti komentar di atas menyatakan, pengaturan dua nilai konfigurasi saat ini tidak bekerja dengan git pull, karena konfigurasi autostash hanya berlaku untuk rebase aktual. Perintah git ini melakukan apa yang Anda inginkan:

git fetch
git rebase --autostash FETCH_HEAD

Atau atur sebagai alias:

git config alias.pullr '!git fetch; git rebase --autostash FETCH_HEAD'

Kemudian lakukan:

git pullr

Tentu saja, alias ini bisa diganti namanya sesuai keinginan.


14
2017-07-22 22:56



Dengan Git 2.6+ Anda dapat menggunakan yang berikut:

alias gup='git -c rebase.autoStash=true pull --rebase'

Ini --rebase membuat penggunaan git-pull rebase dari pada merge, 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 digunakan gup (dari atas) dalam kasus penggabungan cepat-maju tidak mungkin atau ada perubahan yang disembunyikan.


5
2018-04-03 18:18



Seperti yang sudah Anda sebutkan ini adalah cara untuk melakukannya. Anda dapat menggunakannya dalam alias untuk menghemat mengetik dan menggunakan pintasan atau Anda dapat menggunakannya dalam satu baris (bisa menjadi alias juga)

git stash && git pull --rebase && git stash pop

Ini akan melakukan hal yang sama seperti yang Anda lakukan tetapi dalam satu baris (&&) dan apakah Anda ditetapkan sebagai alias itu bahkan akan lebih pendek.

Baris berikut akan menampilkan perubahan masuk / keluar sebelum Anda menarik / mendorong

git log ^master origin/master
git log master ^origin/master

1
2018-05-13 08:40