Perpindahan Mercurial berubah ke cabang baru

124

Saya memiliki sejumlah perubahan yang saya komit ke repositori lokal saya, tetapi belum didorong. Karena pada fitur membutuhkan waktu lebih lama dari yang diharapkan, saya ingin menukar perubahan ini ke cabang bernama sebelum saya mendorong. Bagaimana saya bisa melakukan ini?

Casebash
sumber

Jawaban:

153

Seperti yang dikemukakan oleh Mark, MqExtension adalah salah satu solusi untuk masalah Anda. IMHO alur kerja yang lebih sederhana adalah dengan menggunakan ekstensi rebase . Misalkan Anda memiliki riwayat seperti ini:

@  changeset:   2:81b92083cb1d
|  tag:         tip
|  summary:     my new feature: edit file a
|
o  changeset:   1:8bdc4508ac7b
|  summary:     my new feature: add file b
|
o  changeset:   0:d554afd54164
   summary:     initial

Artinya, revisi 0adalah dasar yang Anda gunakan untuk mulai mengerjakan fitur Anda. Sekarang Anda ingin memiliki revisi 1-2pada cabang bernama, katakanlah my-feature. Perbarui ke revisi 0dan buat cabang itu:

$ hg up 0
$ hg branch my-feature
$ hg ci -m "start new branch my-feature"

Sejarahnya sekarang terlihat seperti ini:

@  changeset:   3:b5939750b911
|  branch:      my-feature
|  tag:         tip
|  parent:      0:d554afd54164
|  summary:     start new branch my-feature
|
| o  changeset:   2:81b92083cb1d
| |  summary:     my new feature: edit file a
| |
| o  changeset:   1:8bdc4508ac7b
|/   summary:     my new feature: add file b
|
o  changeset:   0:d554afd54164
   summary:     initial

Gunakan rebaseperintah untuk memindahkan revisi 1-2ke revisi 3:

$ hg rebase -s 1 -d 3

Ini menghasilkan grafik berikut:

@  changeset:   3:88a90f9bbde7
|  branch:      my-feature
|  tag:         tip
|  summary:     my new feature: edit file a
|
o  changeset:   2:38f5adf2cf4b
|  branch:      my-feature
|  summary:     my new feature: add file b
|
o  changeset:   1:b5939750b911
|  branch:      my-feature
|  summary:     start new branch my-feature
|
o  changeset:   0:d554afd54164
   summary:     initial

Itu saja .. seperti yang disebutkan dalam komentar untuk jawaban Mark, memindahkan kumpulan perubahan yang sudah didorong umumnya adalah ide yang buruk, kecuali Anda bekerja dalam tim kecil di mana Anda dapat berkomunikasi dan memaksakan manipulasi riwayat Anda.

Oben Sonne
sumber
4
IMHO kelemahan dari solusi ini adalah bahwa ia memperkenalkan "start new branch my-feature" dummy commit (yaitu yang tidak mengubah file apa pun).
sschuberth
9
@sschuberth: Saya pikir menjadi eksplisit adalah hal yang baik di sini. Jika perubahan ekstra menjadi masalah bagi Anda, gabungkan dengan yang berikutnya (misalnya dengan menggunakan foldperintah dari ekstensi histedit yang sekarang sudah terpasang ).
Oben Sonne
6
@AmirRachum: hg log -G( GraphlogExtension ). Saya telah menghapus beberapa baris secara manual, tetapi itu juga dapat dirender sepenuhnya secara otomatis menggunakan gaya log khusus .
Oben Sonne
1
@Saya setuju. Solusi saya adalah me-rebase komitmen non-dummy ke induk komit dummy dengan bendera --keepbranches, dan kemudian hg lepaskan komit tiruan Anda. Ini banyak pekerjaan untuk mengubah nama cabang, tapi terkadang Mercurial bodoh seperti itu.
weberc2
30

Anda dapat menggunakan MqExtension . Katakanlah perubahan yang akan dipindahkan adalah revisi 1-3:

hg qimport -r 1:3    # convert revisions to patches
hg qpop -a           # remove all them from history
hg branch new        # start a new branch
hg qpush -a          # push them all back into history
hg qfin -a           # finalize the patches
Mark Tolonen
sumber
Saya ingin mengimpor 63:64 dan 66:68. Saya mendapatkan revisi 65 bukan orang tua dari 64
Casebash
Apa yang ingin Anda lakukan dengan 65? Mq hanya dapat mengkonversi perubahan yang berurutan dari head. Itu mengubah perubahan yang biasanya tidak berubah menjadi tambalan yang bisa berubah yang dapat diedit. Ini mengubah hash (memengaruhi semua anak), jadi Anda tidak dapat melewati.
Mark Tolonen
Saya memiliki sejumlah perubahan (termasuk 65) yang saya buat di cabang utama dan didorong
Casebash
1
Jangan edit kumpulan perubahan yang telah didorong. Mq mengubah hash sehingga mereka akan menjadi perubahan baru yang efektif. Hanya edit riwayat yang belum didorong.
Mark Tolonen
Jika Anda sudah mendorong 65, maka Anda sebaiknya tidak bergerak 63 dan 64, dan hanya puas dengan bergerak 66:68 (sekali lagi, hanya jika Anda belum mendorongnya).
Matt
9

Saya lebih suka solusi tambalan yang dijelaskan di sini oleh Mark Tolonen

Apa yang saya punya:

hg log -G

#default branch
@  changeset:   3:cb292fcdbde1
|
o  changeset:   2:e746dceba503
|
o  changeset:   1:2d50c7ab6b8f
|
o  changeset:   0:c22be856358b

Apa yang saya inginkan:

  @  changeset:   3:0e85ae268e35
  |  branch:      feature/my_feature
  |
  o  changeset:   2:1450cb9ec349
  |  branch:      feature/my_feature
  |
  o  changeset:   1:7b9836f25f28
  |  branch:      feature/my_feature
  |
 /
|
o  changeset:   0:c22be856358b

perintah mercurials:

hg export -o feature.diff 1 2 3
hg update 0
hg branch feature/my_feature
hg import feature.diff

Berikut adalah status repositori lokal saya

@  changeset:   6:0e85ae268e35
|  branch:      feature/my_feature
|
o  changeset:   5:1450cb9ec349
|  branch:      feature/my_feature
|
o  changeset:   4:7b9836f25f28
|  branch:      feature/my_feature
|
| o  changeset:   3:cb292fcdbde1
| |
| o  changeset:   2:e746dceba503
| |
| o  changeset:   1:2d50c7ab6b8f
|/
|
o  changeset:   0:c22be856358b

Sekarang saya perlu menghapus revisi 1 2 dan 3 dari cabang default saya. Anda dapat melakukannya dengan perintah strip dari ekstensi mq. hg stripmenghapus set perubahan dan semua turunannya dari repositori.

Aktifkan ekstensi dengan menambahkan baris berikut ke file konfigurasi Anda (.hgrc atau Mercurial.ini):

vim ~/.hgrc dan tambahkan :

[extensions]
mq =

Dan sekarang hapus repositori ini pada revisi 1.

hg strip 1

dan inilah kami

@  changeset:   3:0e85ae268e35
|  branch:      feature/my_feature
|
o  changeset:   2:1450cb9ec349
|  branch:      feature/my_feature
|
o  changeset:   1:7b9836f25f28
|  branch:      feature/my_feature
|
o  changeset:   0:c22be856358b

catatan: set perubahan berbeda tetapi revisinya sama

Guillaume Vincent
sumber
5

Bagi mereka yang cenderung menggunakan GUI

  1. Pergi ke Tortoise Hg-> File-> Settingslalu centang rebase.

masukkan deskripsi gambar di sini

  1. Mulai ulang UI kura-kura

  2. Buat cabang baru tempat Anda akan memindahkan perubahan. Klik pada nama cabang saat ini -> pilih Open a new named branch-> pilih nama cabang.

masukkan deskripsi gambar di sini

  1. Jika perubahan yang ingin Anda pindahkan belum dilakukan public(mis. draft), Lanjutkan ke 5. (Jika perubahan telah dipublikasikan dan Anda bukan pengembang senior, Anda harus berbicara dengan seseorang yang senior (dapatkan kambing hitam) karena Anda dapat mengacaukan banyak waktu , Saya tidak bertanggung jawab :)).

Pergi ke View-> Show Console(atau Ctrl+ L) lalu tulis di konsol hg phase -f -d 2- di mana 2 adalah revisi terendah Anda akan pindah ke cabang baru.

  1. Pergi ke cabang dan revisi (harus menjadi revisi paling atas jika Anda memindahkan perubahan ke cabang baru yang dibuat pada langkah 3.) Right Mouse->Update

  2. Pergi ke cabang dan revsion Anda akan memindahkan perubahan dari Right Mouse-> Modify History->Rebase

masukkan deskripsi gambar di sini

  1. Klik Rebasedan berdoa tidak ada konflik, gabungkan jika perlu.

  2. Dorong perubahan, saat ini semua revisi masih harus dilakukan draft.

  3. Pergi ke revisi paling atas di cabang tempat Anda memindahkan perubahan ke Right Mouse-> Change Phase to-> Public.

masukkan deskripsi gambar di sini

Semoga ini menghemat waktu Anda.

Matas Vaitkevicius
sumber
Kerja bagus! akan mencoba ini, hanya satu pertanyaan - mengapa mengubah fase menjadi publik pada akhirnya? "Setiap perubahan yang terlihat di repositori jarak jauh bersifat publik" jadi ketika Anda mendorong, bukankah itu akan tetap disetel ke publik?
Joshua Duxbury
@JoshLeeDucks Ketika mendorong mereka tidak berubah menjadi secara publicotomatis lagi (setidaknya bagi saya mereka tidak).
Matas Vaitkevicius