Gerçekten sadece bir tane olması gereken bir çift taahhütüm var. Git kullanıyor olsaydım, şunu kullanırdım:
git rebase -i <some-commit-before>
ve sonra onları ezin.
Bunu mercurial olarak yapabilir miyim? Öyleyse nasıl?
Gerçekten sadece bir tane olması gereken bir çift taahhütüm var. Git kullanıyor olsaydım, şunu kullanırdım:
git rebase -i <some-commit-before>
ve sonra onları ezin.
Bunu mercurial olarak yapabilir miyim? Öyleyse nasıl?
Yanıtlar:
Evet, bunu herhangi bir uzantı olmadan Mercurial kullanarak Değişiklik Kümelerini Birleştirerek yapabilirsiniz .
Alternatif olarak, bir uzantı kullanmak isterseniz kullanabilirsiniz:
Benim favorim hg strip --keep
komuta. Ve sonra tüm değişiklikleri tek bir işlemde gerçekleştiriyorum.
Bu benim için en hızlı ve en rahat yoldur, çünkü günlük işlerim sırasında birçok küçük işlem yapmayı seviyorum;)
Not 1: strip
Yerleşik bir uzantının mq
etkinleştirilmesi gerekir.
Not 2: Sevdiğim Git / Mercurial istemcisi (SmartGit / Hg) varsayılan tarafından ekler --keep
sırasında parametresi strip
. Ve daha da kullanışlı olanı: şu seçeneği sağlar join commits
:]
hg strip --keep --rev [rev]
nerederev
--rev
, isteğe bağlı, tam komuthg strip --keep [rev]
hg help strip
verir hg strip [-k] [-f] [-n] [-B bookmark] [-r] REV...
ve revizyonu atlamak bana verir abort: empty revision set
.
hg strip
en iyi fikir değil. Tam olarak güvenli değil. Deneyin hg histedit
, hatta evrim uzantısını kullanmayı deneyin.
Rebase uzantısı bir cazibe gibi çalıştı. 2 kaydı ezmek için:
$ hg rebase --dest .~2 --base . --collapse
Nokta, mevcut revizyon için bir kısayoldur.
Bir şubede birkaç işleminiz olduğunda ve hepsini bir araya getirmek istediğinizde daha da kolaydır:
$ hg rebase --dest {destination branch (e.g. master)} --base . --collapse
Bu nasıl çalışır:
( http://mercurial-scm.org/wiki/RebaseExtension#Collapsing adresinden )
Bu cevabı okuyorsanız, bu cevapta bahsedilen diğer tüm seçenekleri unutabilir
fold
ve evrim uzantısının komutunu kullanabilirsiniz .
evolve
güvenli değiştirilebilir geçmişe sahip olmamıza yardımcı olan bir mercurial uzantısıdır, yine de deneyseldir. Bunu onu klonlama yoluyla kullanabilirsiniz repo ve bu gibi .hgrc içinde eklemeden.
[extensions]
evolve = ~/evolve/hgext/evolve.py
Ana dizininizde repo geliştirmek için klonladığınızı varsayarsak. Şimdi gitmekte iyisin. Ayrıca şuradan da yardım arayabilirsiniz hg help fold
.
fold
Kırılmamış doğrusal bir işlem zincirini ezmeyi / katlamayı söylüyorsunuz . Katlamanın yaptığı şey, tüm değişiklik kümelerinden değişiklikleri içeren yeni bir değişiklik kümesi yaratır ve tüm bu taahhütleri eski olarak işaretler. Bunu docs adresinde daha derinlemesine inceleyebilirsiniz .
Şimdi aşağıdaki geçmişe sahip olduğunuzu varsayalım.
a -> b -> c -> d -> e -> f -> g
Sen ezmek istiyorum e
, f
ve g
. Yapabilirsin
hg up g
hg fold -r e
Sonuç olacak
a -> b -> c -> d -> h
nerede h
her üç kaydedilmesini değişiklikler içermektedir değişiklik kümesi ise e
, f
ve g
.
Değişiklik setlerini tarihin ortasından da katlayabilirsiniz, yani ucu içeren bir zincir seçmeniz gerekmez. Eğer katlamak istediğinizi varsayalım b
, c
ve d
. Yapabilirsin
hg up d
hg fold -r b
hg evolve --all
Bu sonuçlanacak
a -> i -> j
burada i
katlanmış değişiklik kümesi olup b
, c
, d
ve j
aynı değişiklik kümesi olup h
.
Evolve kullanım kılavuzu mutlaka okunmalıdır.
--keep
seçeneği bunu kapsar (ardından revizyonları gizli olarak işaretleme veya sonucu kontrol ettikten sonra üzerlerinde şerit kullanma). Revizyonları diğer revizyonlar arasında taşımak bile bir dizi iki rebase komutuyla mümkündür.
Mercurial 4.8 (Kasım 2018, 9 yıl sonra) ile yeni komutu düşünebilirsiniz hg absorb
(daha önce deneysel bir özellikti ).
Bkz. " Mercurial 4.8'deki Taahhüt Değişikliklerini Emmek "
Absorbe uzantısı, çalışma dizininizdeki her değişikliği alacak, dizinizdeki hangi kayıtların bu satırı değiştirdiğini belirleyecek ve bu commit'deki değişikliği otomatik olarak değiştirecektir.
Herhangi bir belirsizlik varsa (yani, aynı satırda değiştirilen birden çok işlem), o zaman absorbe, bu değişikliği göz ardı edecek ve manuel olarak çözülmesi için çalışma dizininizde bırakacaktır.Teknik düzeyde,
hg absorb
taahhüt edilmeyen tüm değişiklikleri bulur ve değiştirilen her satırı belirsiz olmayan bir önceki işlemle eşleme girişimleri.
Temiz bir şekilde haritalanabilen her değişiklik için, taahhüt edilmeyen değişiklikler uygun önceki taahhütte dikkate alınır. Operasyondan etkilenen taahhütler otomatik olarak yeniden hesaplanır.
Bir değişiklik, belirsiz olmayan bir önceki işleme ile eşleştirilemezse, taahhüt edilmeden bırakılır ve kullanıcılar mevcut bir iş akışına geri dönebilir (örneğin kullanarakhg histedit
).Otomatik yeniden yazma mantığı,
hg absorb
satırların geçmişini takip ederek uygulanır: Bu, temelde yaklaşımdan farklıdırhg histedit
veya çoklu girdi verilen bir dosyanın yeni bir sürümünü türetmekgit rebase
için 3 yollu birleştirmeye dayalı birleştirme stratejilerine güvenme eğilimindedir. sürümler.Bu yaklaşım, hg absorpsiyonunun belirsiz bir uygulama taahhüdü ile değişiklikleri atlaması gerçeğiyle birleştiğinde, hg absorpsiyonunun asla birleştirme çakışmalarıyla karşılaşmayacağı anlamına gelir!
Şimdi, belirsiz uygulama hedeflerine sahip satırları görmezden gelirseniz, yamanın klasik 3 yollu birleştirme kullanarak her zaman temiz bir şekilde uygulanacağını düşünüyor olabilirsiniz. Bu ifade mantıksal olarak doğru geliyor. Ancak bu değil:
hg absorb
Birleştirme tarafından yapıldığındahg histedit
veyagit rebase -i
başarısız olduğunda birleştirme çatışmalarını önleyebilir .
Bence chistedit
(Mercurial 2.3'ten beri yerleşik) buna en yakın rebase -i
olanı saf Mercurial'dir ( chistedit
interaktif sürümüdür histedit
). Histedit Bir kez fold
komuta Rebase en eşleştiren squash
ve roll
komuta Rebase en eşleştiren fixup
. Daha fazla bilgi için histedit belgelerine bakın .
İşte basit bir örnek. Aşağıdakilere sahip olduğunuzu ve tüm 1e21c4b1 değişikliklerini önceki revizyona taşımak ve yalnızca önceki revizyonun mesajını saklamak istediğinizi varsayalım.
@ 1e21c4b1 drees tip
| A commit you want to squash
o b4a738a4 drees
| A commit
o 788aa028 drees
| Older stuff
Kaçabilirsiniz hg chistedit -r b4a738a4
b4a738a4 düzenleme geçmişi arkasına. Chistedit'te imleci 1e21c4b1'e getirin ve r
bu revizyonu geri almak istediğinizi belirtmek için vurun . Histedit'teki (en eskiden en yeniye) sıranın (en yeniden en eskiye) tersine çevrildiğini unutmayın hg log
.
#0 pick 160:b4a738a49916 A commit
#1 ^roll 161:1e21c4b1500c
Değişikliklerinizi seçtikten sonra, c
bunları gerçekleştirmeyi seçersiniz . Sonuç şudur:
@ bfa4a3be drees ipucu | 788aa028 drees | Eski şeyler
Eğer onlar için nispeten yeniyseniz, referans için histedit dosyasındaki komut açıklamalarını sağladığından histedit
daha iyi bir seçim olabilir chistedit
. Normal metin düzenlemeyi kullanarak komutları ayarlamak biraz daha fazla düzenleme gerektirir (normal yeniden temelde olduğu gibi).
Bunlardan birini kullanmak için histedit
veya ~ / .hgrc dosyanıza uzantılarınızı chistedit
eklemeniz histedit
gerektiğini unutmayın:
[extensions]
histedit =
Ben önerdi chistedit
o en yakın olduğu rebase -i
ve tarihin her yerde çalışır. Eğer gerçekten sadece mevcut revizyonu önceki revizyona dahil etmek / ince ayar yapmak istiyorsanız @G. Olanlar strip
açık olduğu için Demecki'nin önerisi iyi olabilir. Mercuria 2.8'den beri inşa edilmiştir. Yukarıdaki gibi eşdeğer sonuçları elde etmek için aşağıdakileri yapabilirsiniz:
hg strip .
hg add
hg commit --amend
Not strip
, histedit gibi, içinde etkinleştirilmesi gerekir sizin ~ / .hgrc:
[extensions]
strip =
En son 2 kaydı sıkıştırmak (birleştirmek) istediğinizi varsayalım.
Bir revizyon numarası bulun
hg log -G -l 3
olası çıktı:
@ changeset: 156:a922d923cf6f
| branch: default
| tag: tip
| user: naXa!
| date: Thu Dec 13 15:45:58 2018 +0300
| summary: commit message 3
|
o changeset: 155:5feb73422486
| branch: default
| user: naXa!
| date: Thu Dec 13 15:22:15 2018 +0300
| summary: commit message 2
|
o changeset: 154:2e490482bd75
| branch: default
~ user: naXa!
date: Thu Dec 13 03:28:27 2018 +0300
summary: commit message 1
Yumuşak sıfırlama dalı
hg strip --keep -r 155
Değişiklikleri tekrar uygula
hg commit -m "new commit message"
strip
yerleşik bir uzantının etkinleştirilmesini gerektirir. ~/.hgrc
Aşağıdaki içeriğe sahip yapılandırma dosyası oluşturun / düzenleyin :
[extensions]
strip =