Skip to content

Instantly share code, notes, and snippets.

@knzm
Created June 9, 2012 06:46
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save knzm/2899867 to your computer and use it in GitHub Desktop.
Save knzm/2899867 to your computer and use it in GitHub Desktop.

Mercurial Queues ハンズオン 履歴改変編

  • 課題の zip ファイルは ここ
  • ハンズオンの資料は ここ

コミットログの改変 commitlog

課題

「コミットログ間違えた」というコミットログを 「add file3」に変更してください

回答

$ hg qimport -r 3:tip
$ hg qgoto 0
$ hg qrefresh -e
$ hg qpush -a
$ hg qfinish -a

qpush時のコンフリクト解決 qpush-conflicts

課題

hg qpushを行ってください。パッチの適用に失敗します。

1.次のコマンドでリポジトリの状態を確認してください。

hg qseries --summary
hg diff
hg qdiff
hg status

2.hg qrefreshを使って「サシスセソ」を「ざじずぜぞ」にする パッチを作成してください。

回答

$ hg qpush
$ vi 50on.txt
$ hg qrefresh

rebase-1

課題

mqのコマンドのみで履歴を一直線にしてください。

回答

$ hg glog
$ hg qimport -r tip
$ hg qpop -a
$ hg up
$ hg qpush
$ hg qfinish -a
$ hg glog

rebase-2

課題

mqのコマンドのみで履歴を一直線にしてください。

回答

$ hg qimport -r 5
$ hg qpop
$ hg up
$ hg qimport -r 4
$ hg qpop
$ hg up
$ hg qimport -r 3
$ hg qpop
$ hg up
$ hg qimport -r 2
$ hg qpop
$ hg up
$ hg qpush -a
$ hg qfinish -a

パッチの順序入れ替え reorder-1

課題

hg qpush --moveを利用せずにコミットをファイルの番号順に並び替えてください

回答

$ hg slog
$ hg qimport -r 1:tip
$ hg qser
$ hg qrename 1.diff file5.diff
$ hg qrename 2.diff file3.diff
$ hg qrename 3.diff file2.diff
$ hg qrename 4.diff file4.diff
$ hg qrename 5.diff file1.diff
$ hg qser
$ hg qpop -a
$ vi .hg/patches/series 
$ hg qpush -a
$ hg qfinish -a

Note

hg slog は以下のようなエイリアス

[alias]
slog = log --template '{rev}:{node|short} {desc|firstline}\n'

パッチの順序入れ替え reorder-2

課題

hg qpush --moveを利用してコミットをファイルの番号順に並び替えてください

回答

$ hg slog
$ hg qimport -r 1:tip
$ hg qser
$ hg qrename 1.diff file5.diff
$ hg qrename 2.diff file3.diff
$ hg qrename 3.diff file2.diff
$ hg qrename 4.diff file4.diff
$ hg qrename 5.diff file1.diff
$ hg qser
$ hg qpop -a
$ hg qpush --move file1.diff
$ hg qpush --move file2.diff
$ hg qpush --move file3.diff
$ hg qpush --move file4.diff
$ hg qpush --move file5.diff
$ hg qser
$ hg qfinish -a

パッチの結合 folding-1

課題

1.revision 1からrevison 5までをhg qfoldを使って 1つのコミットにしてください。

2.コミットログを「add file1, file2, file3, file4 and file5」 に変更してください。

回答

$ hg glog
$ hg qimport -r 1:tip
$ hg qgoto 0
$ hg qser
$ hg qfold 2.diff 3.diff 4.diff 5.diff
$ hg qser
$ hg qrefresh -e
$ hg qfinish -a

パッチの結合 folding-2

課題

1.revision 1, revision 3, revison 5までをhg qfoldを使って 1つのコミットにしてください。

2.コミットログは「add odd files」 に変更してください。

3.revision 2, revision 4までをhg qfoldを使って 1つのコミットにしてください。

4.コミットログは「add even files」 に変更してください。

回答

$ hg glog
$ hg qimport -r 1:tip
$ hg qser
$ hg qgoto 0
$ hg qpush --move 3.diff
$ hg qpush --move 5.diff
$ hg qser
$ hg qgoto 0
$ hg qfold 3.diff 5.diff
$ hg qrefresh -e
$ hg qpush
$ hg qser
$ hg qfold 4.diff
$ hg qrefresh -e
$ hg qser
$ hg qpush
$ hg qfinish -a

パッチの分割 split-1

課題

file1からfile5までが1つのコミットになっています。 1つのコミットで1つのファイルが追加されるように コミットを分割してください。

回答

$ hg glog
$ hg qimport -r tip
$ hg qdiff
$ hg qrefresh -m "add file1" file1 
$ hg qnew -m "add file2" 2.diff file2
$ hg qnew -m "add file3" 3.diff file3
$ hg qnew -m "add file4" 4.diff file4
$ hg qnew -m "add file5" 5.diff file5
$ hg qfinish -a

パッチの分割 split-2

課題

1.revision1で5行追加されています。 1コミットで1行追加するようにコミットを分割してください。

回答

$ hg log
$ hg qimport -r tip
$ hg qrefresh -X 50on.txt 
$ hg st
$ hg qrefresh -e -i
$ hg qnew -e 2.diff -i
$ hg qnew -e 3.diff -i
$ hg qnew -e 4.diff -i
$ hg qnew -e 5.diff -i
$ hg qnew -e 6.diff
$ hg qser
$ hg qfinish -a

Note

hg qrefresh -i は未コミットの変更を対象とするため、 hg qrefresh -X でパッチの内容を空にしている

Note

hg qnew/qrefresh -i の使い方

  1. 最初に対象のパッチを選択 (単にENTERキーを押す)
  2. パッチを選択する画面でeを押して編集モードに移行
  3. 望みの形にパッチを編集
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment