Bagaimana cara mengesampingkan banyak perubahan yang tidak mengikat saat mengerjakan sesuatu yang lain

98

Jika saya memiliki banyak perubahan yang tidak mengikat dan ingin mengesampingkannya saat mengerjakan sesuatu yang lain, dan kemudian (setelah beberapa hari) kembali lagi dan lanjutkan bekerja. Alur kerja apa yang paling mudah untuk melakukannya? (Sejauh ini saya hanya memiliki pengalaman dengan fungsi dasar Mercurial). Metode saya yang biasa adalah membuat cabang baru menggunakan klon, tetapi mungkin ada cara yang lebih baik.

Erik
sumber

Jawaban:

133

Anda memiliki beberapa opsi:

  1. Simpan item di rak . Ini menyimpan perubahan dan menghapusnya dari direktori kerja sehingga cabang dapat melanjutkan. Itu tidak membuat perubahan-set.

    hg shelve --all --name "UnfinishedChanges"
    
    hg unshelve --name "UnfinishedChanges"
    

    Perbarui / Edit : Versi mercurial yang lebih baru mungkin perlu digunakan

    hg shelve -n "UnfinishedChanges"
    hg unshelve "UnfinishedChanges"
    

    Anda masih bisa menggunakan --namesebagai alternatif -n, tapi lincah sepertinya tidak menyukainya --namelagi. Selain itu, --alltidak lagi dibutuhkan dan lincah sebenarnya akan ketakutan karenanya.

  2. Patch antri item menggunakan mq. Ini tidak terlalu berbeda dengan rak dalam beberapa hal, tetapi berperilaku berbeda. Hasil akhirnya sama, perubahan dihapus dan secara opsional dapat diterapkan kembali nanti. Saat didorong, tambalan adalah kumpulan perubahan logis, ketika muncul mereka disimpan di tempat lain dan bukan bagian dari riwayat kumpulan perubahan.

    hg qnew "UnfinishedWork"
    hg qrefresh
    hg qpop
    
    hg qpush "UnfinishedWork"
    
  3. Komit secara lokal, perbarui ke set perubahan sebelumnya dan terus bekerja dan gunakan cabang anonim (atau banyak kepala). Jika Anda kemudian menginginkan perubahan, Anda dapat menggabungkan kepala. Jika Anda tidak menginginkan perubahan, Anda dapat menghapus set-perubahan.

    hg commit -m"Commiting unfinished work in-line."
    hg update -r<previous revision>
    
    hg strip -r<revision of temporary commit>
    
  4. Komit mereka ke cabang bernama. Alur kerja kemudian menjadi sama seperti opsi 3 - gabungkan atau lepaskan saat Anda siap.

    hg branch "NewBranch"
    hg commit -m"Commiting unfinished work to temporary named branch."
    hg update <previous branch name>
    

Secara pribadi saya menggunakan opsi 3 atau 4 karena saya tidak keberatan menghapus set perubahan atau memeriksa sebagian kode (selama itu tidak akhirnya didorong). Ini dapat digunakan bersama dengan hal- hal Fase baru untuk menyembunyikan perubahan-set lokal Anda dari pengguna lain jika perlu.

Saya juga menggunakan rebaseperintah untuk memindahkan set-perubahan di sekitar untuk menghindari penggabungan di mana penggabungan tidak akan menambahkan apa pun ke riwayat kode. Penggabungan Saya cenderung untuk menyimpan aktivitas antar cabang penting (seperti cabang rilis), atau aktivitas dari cabang fitur yang berumur lebih lama. Ada juga histeditperintah yang saya gunakan untuk mengompresi set perubahan di mana "obrolan" dari mereka mengurangi nilainya.

Antrian patch juga merupakan mekanisme umum untuk melakukan ini, tetapi memiliki semantik tumpukan. Anda mendorong dan memunculkan tambalan, tetapi tambalan yang berada "di bawah" tambalan lain dalam tumpukan mengharuskan tambalan di atasnya juga didorong.

Peringatan , seperti semua opsi ini, jika file memiliki lebih banyak perubahan sejak perubahan sementara yang Anda simpan / antri / bercabang, akan ada resolusi penggabungan yang diperlukan saat melepas rak / mendorong / menggabungkan.

Adam Houldsworth
sumber
Terima kasih atas jawaban yang bagus dan contoh yang berguna. Apakah Anda kebetulan tahu jika menggunakan bookmark hg juga merupakan opsi?
Erik
@Erik Mungkin, tapi saya tidak punya pengalaman menggunakannya.
Adam Houldsworth
2
bookmark dapat digunakan untuk membantu dengan opsi 3 - Anda dapat menggunakan salah satu untuk memberi label pada revisi yang Anda buat untuk menyimpan perubahan Anda. Mereka tidak dapat melakukan tugas itu sendiri.
Steve Kaye
opsi --alltidak dikenali. itu adalah perilaku default untuk menunda semua perubahan.
naXa
@naXa Hai sobat, jika salah satu perintah saya sedikit salah (mungkin karena versinya telah berubah), silakan edit jawabannya dan saya akan menyetujuinya jika perlu :-)
Adam Houldsworth
23

Secara pribadi, saya tidak menyukai jawaban yang diposting sejauh ini:

  1. Saya tidak suka klon bercabang karena saya suka setiap proyek hanya memiliki satu direktori. Bekerja pada direktori yang berbeda pada saat yang sama akan mengacaukan riwayat file terbaru editor saya. Saya selalu berakhir dengan mengubah file yang salah. Jadi saya tidak melakukan itu lagi.
  2. Saya menggunakan shelveuntuk perbaikan cepat (hanya untuk memindahkan perubahan yang tidak saya lakukan ke cabang lain, jika saya menyadari bahwa saya salah). Anda berbicara tentang hari, tidak mungkin saya menunda sesuatu selama berhari-hari.
  3. Menurut saya mqterlalu rumit untuk sittuation biasa seperti itu

Saya pikir cara terbaik adalah dengan hanya mengkomit perubahan Anda, daripada Anda kembali ke set perubahan sebelum Anda memulai perubahan ini dan bekerja dari sana. Ada beberapa masalah kecil, izinkan saya mengilustrasikan:

Katakanlah Anda memiliki set perubahan A. Kemudian Anda memulai perubahan. Pada titik ini Anda ingin menyisihkannya untuk sementara waktu. Pertama-tama, lakukan pekerjaan Anda:

hg ci -m "Working on new stuff"

Jika mau, Anda dapat menambahkan bookmark agar lebih mudah untuk kembali lagi nanti. Saya selalu membuat bookmark ke cabang anonim saya.

hg bookmark new-stuff

Kembali ke set perubahan sebelum modifikasi ini

hg update A

Dari sini, Anda bekerja dan menghasilkan set perubahan C. Sekarang Anda memiliki 2 kepala (B dan C), Anda akan diperingatkan saat mencoba mendorong. Anda hanya dapat mendorong satu cabang dengan menentukan kepala cabang itu:

hg push -r C

Atau Anda dapat mengubah fase new-stuffcabang menjadi rahasia. Perubahan rahasia tidak akan didorong.

hg phase -r new-stuff --secret --force
Rafael Piccolo
sumber
Terima kasih atas jawaban rinci! Saya sangat suka membaca alur kerja orang untuk masalah (biasa?) Itu.
Erik
Saya pikir itu mqagak terlalu rumit untuk situasi ini saja , tetapi memiliki kegunaan yang cukup luas, termasuk yang satu ini, sehingga ada gunanya menginvestasikan waktu untuk menjadi fasih dengannya.
Norman Grey
12

Untuk menyimpan perubahan lokal yang tidak terikat, cara termudah bagi saya adalah menyimpannya sebagai file tambalan.

hg diff > /tmp/`hg id -i`.patch

dan saat Anda perlu kembali ke keadaan sebelumnya:

hg up <REV_WHERE_SAVED>
hg patch --no-commit /tmp/<REV_WHERE_SAVED>.patch
mapcuk
sumber
Aku akan menelanjangi /tmpdan hg id -iitu akan berhasil juga di Windoze.
anatoly techtonik
Dan hg uptidak dibutuhkan di sana.
anatoly techtonik
1
@techtonik Apa yang akan terjadi jika saya menerapkan tambalan pada revisi lain? Terutama jika file yang ditambal dimodifikasi.
mapcuk
Mercurial akan mencoba menggabungkannya, dan Anda tetap harus berurusan dengan konflik.
anatoly techtonik
6

Anda bisa mengkloning repo Anda beberapa kali. Saya cenderung memiliki klon root, kemudian beberapa anak dari sana. Contoh:

  • MyProject.Root
  • MyProject.BugFix1
  • MyProject.BugFix2
  • MyProject.FeatureChange1
  • MyProject.FeatureChange2

Keempat anaknya semuanya dikloning dari root dan dorong / tarik ke / dari root. Akar kemudian mendorong / menarik dari repo master di jaringan / internet di suatu tempat. Akar bertindak sebagai semacam area pementasan pribadi Anda.

Jadi dalam kasus Anda, Anda baru saja mengkloning repo baru dan mulai bekerja. Tinggalkan pekerjaan 'yang disimpan' di repo lainnya. Sesederhana itu.

Satu-satunya downside adalah penggunaan ruang disk, tetapi jika itu menjadi perhatian Anda tidak akan menggunakan DVCS sama sekali;) Oh dan itu agak mencemari daftar "proyek terbaru" Visual Studio Anda, tapi apa hei.

[Edit komentar berikut]: -

Untuk menyimpulkan ... apa yang Anda lakukan baik-baik saja dan normal. Saya berpendapat ini adalah cara terbaik untuk bekerja ketika yang berikut ini benar: 1) berumur pendek 2) Anda tidak perlu berkolaborasi dengan pengembang lain 3) perubahan tidak perlu meninggalkan PC Anda sampai komit / dorong waktu.

nbevans
sumber
Ada alasan untuk tidak menggunakan cabang? Untuk itulah mereka dan jauh lebih cepat daripada repo-kloning.
Adam Houldsworth
Dalam pertanyaan saya, saya menyatakan yang berikut: Metode biasa saya adalah membuat cabang baru menggunakan klon, tetapi mungkin ada cara yang lebih baik.
Erik
1
@AdamHouldsworth, secara teknis ini adalah cabang ... hanya yang berumur pendek. Membuat cabang bernama untuk pekerjaan berumur pendek benar-benar bodoh. Itu menyalahgunakan tujuan bernama cabang yang untuk cerita kerja berumur panjang.
nbevans
@NathanE Jika menurut Anda cabang bernama untuk pekerjaan berumur pendek adalah "benar-benar bodoh", maka ada juga percabangan anonim, rak, atau antrian tambalan sebagai opsi ringan lainnya. Kloning ulang, menurut pendapat saya, sama bodohnya dengan opsi lain - ini salah satu manfaat potensial adalah memiliki dua set kode terbuka dalam dua contoh VS, tetapi saya jarang harus melakukannya jadi menggunakan klon sebagai masalah tentu saja tidak. tidak melayaniku. Hanya untuk klarifikasi, saya bukan downvoter.
Adam Houldsworth
@NathanE Mereka juga tidak eksklusif untuk "cerita jangka panjang", itu hanya sesuatu yang mereka kuasai jika Anda mengikuti integrasi berkelanjutan. Langsung dari dokumen : "Cabang terjadi jika garis pengembangan berbeda", jika Anda menyimpan item pekerjaan untuk mengerjakan sesuatu yang lain, bagi saya ini terdengar seperti perbedaan, terlepas dari berapa lama itu berumur.
Adam Houldsworth