Meninggalkan perubahan tanpa menghapus dari riwayat

180

Ada komitmen yang tidak berfungsi, jadi saya ingin mengabaikannya tanpa menghapusnya dari sejarah .

Saya telah memperbarui dari revisi sebelumnya dan berkomitmen, sehingga menciptakan kepala baru.


Saya tidak memiliki cabang, saya tidak ingin cabang, saya hanya ingin melanjutkan dengan kepala baru persis seperti itu, tidak ada yang mewah, tidak ada penggabungan, tidak ada kekhawatiran, terus melupakan yang sebelumnya.

Sepertinya saya tidak dapat menemukan cara untuk melakukan itu, dan saya mulai percaya itu tidak dapat dilakukan. Yang saya temukan adalah hal-hal tentang cabang, atau hal-hal tentang penggabungan.

o0 '.
sumber
1
Ada dalam repo Anda, jadi belum dihapus dari riwayat. Anda telah membuat kepala baru, sehingga Anda dapat terus melakukan revisi tanpa kesalahan. Apa yang mencegah Anda untuk melanjutkan dengan kepala baru?
ataylor
Ada apa dengan keengganan Anda untuk cabang?
Andres Jaan Tack
@Andres Ini bukan keengganan untuk cabang. Saya hanya membutuhkannya untuk bekerja tanpa langkah ekstra bodoh untuk membuatnya hanya untuk menutupnya.
o0 '.
Siapa pun yang membaca - harap perhatikan bahwa cabang telah dibuat dalam skenario ini; perhatikan penjelasan yang diberikan dalam jawaban ini: stackoverflow.com/a/3692607/3195477
UuDdLrLrSs

Jawaban:

181

Perbarui repositori Anda ke kepala dengan revisi yang ingin Anda lupakan, lalu gunakan hg commit --close-branchuntuk menandai cabang (anonim) itu sebagai ditutup. Lalu update ke kepala cabang yang Anda lakukan inginkan, dan terus bekerja.

Anda masih dapat melihat cabang tertutup jika Anda menggunakan -copsi untuk hg heads, tetapi tidak akan muncul secara default dan hg mergeakan tahu tidak mencoba untuk bergabung dengan kepala tertutup.

Anda harus menggunakan hg push --forcepertama kali Anda mendorong kepala tertutup ini ke repositori lain karena Anda benar-benar membuat kepala tambahan di repositori jarak jauh ketika Anda menekan. Jadi beri tahu Mercurial bahwa ini tidak masalah --force. Orang yang menarik kepala tertutup tidak akan diganggu oleh peringatan apa pun.

Niall C.
sumber
3
@Niall C. tidakkah itu hanya akan berhasil jika ia telah menandai itu sebagai cabang bernama? Saya berasumsi dari apa yang dia katakan dia lakukan bahwa itu adalah default
msarchet
tapi ... itu tidak benar, saya masih mendapatkan daftar kedua kepala ketika saya menelepon hg heads... Saya menggunakan mercurial 1.4.3, apakah itu fitur yang lebih baru?
o0 '.
2
@msarchet: AFAIK, coba hari ini, --close-branch TIDAK berfungsi untuk cabang anonim. Seharusnya, tetapi tidak. Saya harap ini berubah dalam beberapa versi Mercurial yang akan datang. Cabang anonim sangat bagus, tetapi harus sekelas cabang bernama.
Krazy Glew
4
@KrazyGlew: Masalahnya adalah cabang "anonim" benar-benar hanya cabang kedua dengan nama yang sama dengan cabang yang menjadi dasarnya. Anda tidak benar-benar mencoba untuk menutup cabang (bernama): Anda mencoba untuk membuang perubahan yang telah Anda buat. Dengan kata lain, Anda hg branchestetap harus menunjukkan nama cabang tempat Anda berada. Daripada mencoba untuk menutup cabang, gabungkan cabang anonim Anda kembali ke cabang asli, buang semua perubahan.
StriplingWarrior
2
Dalam kasus saya, saya memiliki cabang bernama default (ini standar) dan yang lain disebut default / master (saya pikir karena fakta bahwa depot jarak jauh sebenarnya git). pembaruan hg default / master; hg melakukan --close-branch; pembaruan hg default berfungsi untuk saya.
MattD
68

Saya tahu Anda tidak ingin bekerja dengan cabang pada tahap ini, tetapi itulah yang Anda lakukan. Ketika Anda kembali ke versi sebelumnya dan melakukan sesuatu yang berhasil, Anda membuat cabang - cabang yang tidak disebutkan namanya, tetapi cabang yang sama.


Tidak ada masalah dengan hanya meneruskan seperti Anda dan tidak perlu khawatir memiliki banyak kepala, tetapi jika Anda ingin merapikan semuanya sehingga Anda tidak sengaja mengambil kepala yang salah satu kali maka Anda dapat membunuh cabang lama.

Ada bagian yang bagus dalam dokumentasi Mercurial yang akan membawa Anda melalui sejumlah opsi di sekitar Cabang Pemangkasan yang Mati .

Saya pikir pilihan terbaik bagi Anda adalah menandai cabang lama sebagai "ditutup". Jika kepala lama Anda revisi "123", maka:

hg update -r 123
hg commit --close-branch -m 'Closing old branch'
hg update -C default
Nick Pierpoint
sumber
3
Blurgh - baru melihat jawaban @Nick setelah aku masuk. Akan mengungguli Niall's dan milikku bisa merana di kolam poin nol. :)
Nick Pierpoint
1
Saya lebih suka jawaban Anda, itu membutuhkan lebih sedikit groking dari terminologi merucrial (yang sedekat yang saya tahu tampaknya dipilih untuk membingungkan pengguna git)
tacaswell
8
lol itu kebalikannya! Terminologi mercurial dipilih agar terdengar alami bagi para pengguna svn, sementara git sangat membingungkan! lagipula, upvot jawaban ini karena ini termasuk pembaruan terakhir -C
Tobia
2
Mengapa Anda perlu -Cdi hg update? Tampaknya tidak ada file yang akan dimodifikasi, jadi seharusnya berfungsi tanpa itu.
maks
1
sejauh yang saya tahu, Anda tidak perlu -C di mana saja. Namun, jika Anda memiliki perubahan yang luar biasa ketika Anda mencoba untuk memperbarui, Anda akan dibatalkan.
Eli Albert
21

Pertama-tama, ketik:

hg heads

Bayangkan, Anda memiliki tiga kepala yang terdaftar:

changeset:   223:d1c3deae6297
user:        Your name  <[email protected]>
date:        Mon Jun 09 02:24:23 2014 +0200
summary:     commit description #3

changeset:   123:91c5402959z3
user:        Your name <[email protected]>
date:        Sat Dec 23 16:05:38 2013 +0200
summary:     commit description #2

changeset:   59:81b9804156a8
user:        Your name <[email protected]>
date:        Sat Sep 14 13:14:40 2013 +0200
summary:     commit description #1

Katakanlah, Anda ingin tetap mengaktifkan kepala terakhir (223) dan menutup sisanya.

Anda kemudian akan melakukan sebagai berikut:

Tutup kepala # 59

hg up -r 59
hg ci --close-branch -m "clean up heads; approach abandoned"

Tutup kepala # 123

hg up -r 123
hg ci --close-branch -m "clean up heads; approach abandoned"

Komit perubahan

hg push

Jangan lupa untuk beralih ke kepala kanan di akhir

hg up -r 223

Dan kamu sudah selesai.

Artur Barseghyan
sumber
Ini adalah tutorial yang bagus, tetapi contoh pesan commit agak meta. Saya akan menyertakan contoh yang lebih baik sehingga mereka yang belajar dari Anda dapat memberikan pesan komit yang lebih baik. Sesuatu seperti --close-branch -m "Closing branch - technique #2 abandoned in favor of technique #3".
Jason R. Coombs
5
Juga, Anda agak selesai di akhir, kecuali bahwa copy pekerjaan Anda masih di kepala yang baru saja Anda tutup. Melakukan perubahan lain akan terjadi pada kepala tertutup, membukanya kembali. Anda ingin melakukannya hg up -r 223sebelum melakukan perubahan.
Jason R. Coombs
@Jason R. Coombs: Benar!
Artur Barseghyan
menurut @Niall, dan pengalaman saya sendiri sekarang, Anda akan perlu hg push --force, tidak hanya hg pushuntuk melewati peringatan tentang mendorong banyak kepala.
craq
1
@ Art saya setuju secara umum. Dalam hal ini, hg pushdengan sendirinya tidak bekerja untuk saya. Bagaimana Anda menyarankan mendorong perubahan ke repo eksternal jika menolak karena beberapa kepala?
craq
12

Anda ingin menggunakan hg backout. Ini menghapus perubahan yang dibuat oleh perubahan dari perubahan anak.

Lihat ini untuk penjelasan yang bagus. Backur Mercurial

msarchet
sumber
2
Inilah jawaban yang tepat. Backout menambahkan kebalikan dari perubahan, membatalkan pekerjaan dan memberi Anda pesan komit untuk mengingatkan diri sendiri mengapa Anda tidak menyukai gagasan itu.
Ry4an Brase
7
Saya sebenarnya tidak setuju - meninggalkan pekerjaan dengan satu kepala dan memulai kembali dari titik awal yang baik sepertinya merupakan pola kerja yang lebih bersih daripada menggunakan backout. Terutama karena Anda tidak dapat membatalkan lebih dari satu perubahan pada satu waktu.
Martin Geisler
1
@ Martin Geisler, baik saya setuju dengan ini secara umum, tetapi OP menyatakan dia ingin meninggalkan perubahan tanpa cabang
msarchet
2
@ Martin Geisler ya saya semua untuk bercabang hanya kadang-kadang nuking perubahan buruk adalah yang terbaik
msarchet
1
kadang-kadang mungkin berguna, tetapi itu tidak benar-benar yang saya inginkan. Terima kasih :)
o0 '.
2

Baik jawaban Niall dan Nick langsung. Karena saya menemukan diri saya membuat banyak kepala menggantung, saya akhirnya menulis alias untuk menutup kepala lebih mudah. Dengan menambahkan ini ke .hgrc:

[alias]
behead = !REV=$($HG id -i); $HG update $@ -q && $HG ci --close-branch -m "Closing dead head" && $HG update $REV -q

(jika Anda sudah memiliki [alias]bagian, Anda dapat menambahkannya sebagai gantinya)

Anda sekarang dapat menutup kepala dalam satu perintah tunggal (dan tanpa harus memperbarui ke set perubahan yang berbeda secara manual) seperti ini:

$ hg behead 123

Catatan: alias mengambil keuntungan dari fakta bahwa alias Mercurial dapat menjadi perintah shell . Ini berarti bahwa ini mungkin hanya akan bekerja pada UNIX, bukan pada Windows.

pertama
sumber
2

Alternatif untuk menutup atau membuka cabang yang tidak diinginkan adalah dengan menggabungkannya dengan cara yang benar-benar membuang efeknya, tetapi meninggalkannya dalam sejarah. Pendekatan ini akan memungkinkan perubahan yang tidak diinginkan untuk menyebar dalam dorongan - jadi hanya gunakan ini jika itu adalah efek yang dimaksudkan.

Katakanlah riwayat perubahan terlihat seperti ini:

1-2-3-4-5-6    
       \    
        7-8-*

dan itu 5dan 6yang tidak lagi diinginkan.

Kamu bisa melakukan ini:

hg up 8
hg merge -r 6 -t :local
hg commit ...

yang akan membuat ini:

1-2-3-4-5-6    
       \   \
        7-8-9-*

Pembaruan untuk 8memastikan Anda bekerja di kepala yang diinginkan dalam sejarah, yang ingin Anda pertahankan.

The -t :localmenginstruksikan Hg menggunakan gabungan "alat" yang disebut lokal yang mengatakan itu untuk mengabaikan perubahan dari cabang lain, yaitu, satu TIDAK diwakili oleh negara folder kerja saat ini. Info lebih lanjut .

Dengan demikian perubahan yang tidak diinginkan dalam 5dan 6disimpan dalam sejarah tetapi tidak mempengaruhi sesuatu yang lebih baru.

UuDdLrLrSs
sumber
2

Ini adalah kasus penggunaan untuk ekstensi Evolve . Saat ini tidak dibundel dengan Mercurial, jadi secara teknis ekstensi pihak ketiga. Tapi itu digunakan cukup banyak oleh sekelompok orang, termasuk pengembang Mercurial, sedang sangat aktif dikembangkan, dan tidak ke mana-mana.

Dengan ekstensi Evolve, Anda cukup melakukannya

hg prune -r revname

dan melanjutkan hidup Anda. Set masih akan ada di sana, tetapi usang. Ini tidak akan terlihat kecuali Anda memberikan --hiddenopsi ke perintah Mercurial, dan secara default tidak akan didorong ke repositori jarak jauh. Meskipun saya pikir Anda bisa memaksanya jika Anda benar-benar mau.

Jika cset yang Anda pangkas memiliki leluhur yang ingin Anda pertahankan, maka Anda harus berlari hg evolveuntuk membuat ulang perubahan itu. hg evolveakan melakukannya secara otomatis. Kalau tidak, Anda tidak perlu melakukan apa pun.

Faheem Mitha
sumber
1

Anda dapat mengkloning repo Anda yang rusak ke yang baru tanpa mengkloning kepala yang tidak diinginkan itu. Kemudian hapus repositori lama, pindahkan klon yang baru dibuat ke tempat asli dan terus bekerja dengannya. Ini akan memakan waktu, tetapi Anda akan mendapatkan repositori yang benar-benar bersih tanpa tanda revisi yang tidak diinginkan.

hg clone --rev myGoodResition myDirtyRepo myCleanRepo
kjam
sumber
1
Ini sama sekali bukan yang saya minta, maaf.
o0 '.
4
@ Kristof: apakah itu lelucon? Baca kembali baris pertama posting saya: "abaikan saja tanpa menghapusnya dari sejarah "
o0 '.
-1

Saya telah mengalami masalah ini berkali-kali ketika saya ingin memenggal kepala yang dibuat karena kesalahan. Saya selalu ingin melihatnya menghilang dari muka bumi.

Pada salinan lokal Anda, dapatkan yang terbaru dan kemudian:

  1. Temukan awal kepala yang ingin Anda lepas (di mana leher baru mulai bercabang), dapatkan nomor revisi

  2. Strip itu.


Sumber: TipsAndTricks .

Sumber: PruningDeadBranches # Using_strip .

hg --config extensions.hgext.mq= strip -n <rev>
  1. Buat pembaruan file sepele (tambahkan spasi putih ke file), komit dan tekan.

Repo Anda sekarang harus memiliki kepala dilucuti. Langkah terakhir ini penting karena pengupasan tidak membuat perubahan apa pun yang Anda bisa mendorong ke repositori pusat Anda. Tanpa langkah terakhir, Anda hanya perlu menelanjangi kepala secara lokal.

sonjz
sumber
1
Tapi, mendorong tidak pernah menghapus apa pun dari repositori jarak jauh. Hanya menambah informasi. Jika perubahan sudah ada di repositori pusat, Anda harus menggunakan ekstensi evolve, atau menghapusnya di server pusat itu sendiri. Jika changeset belum ada di repositori pusat, maka pengupasan secara lokal akan cukup tanpa dorongan.
Ben