Mercurial(hg)の使い方~詳しく書かないだって自分メモだから~

Mercurial,hg はバージョン管理ツールです。
コマンドラインから行うことを前提としているメモです。

この記事は中途半端に公開中です。

入門的の使い方を知りたいなら、こちらの記事が参考になると思います。
参考： [Mercurial入門](https://qiita.com/kanaya/items/54cc4c52eea183c7aa6e)
ちょっと古いけど、シンプルで見やすい　[Mercurial(hg) のコマンド一覧](http://d.hatena.ne.jp/Kenji_s/20110203/1296696735)
http://m-hiyama.hatenablog.com/entry/20120831/1346391022

### 環境
- Ubuntu 16.04.5 LTS 
- hg
- コマンドラインからする
- Aでhg本体構築、Bでcloneもしくは、hgのコピーを使う状態

# 最初の一歩 ~そのうち追加~
- hgインストール

### hg使い方（便利機能）
##### 変更の情報を視覚的に確認
```:オプション--graph
$ hg log --graph
@    changeset:   103:b0622a1c2768
|\   tag:         tip
| |  parent:      101:900ffaa91dbc
| |  parent:      102:9eebb4ecb3bc
| |  user:        Tago <tago@**.co.jp>
| |  date:        Fri Apr 26 18:25:36 2019 +0900
| |  summary:     merge
| |
| o  changeset:   102:9eebb4ecb3bc
| |  parent:      100:6e23094e6831
| |  user:        Tago <tago@**.co.jp>
| |  date:        Fri Apr 26 10:46:37 2019 +0900
| |  summary:     #19 文言修正
| |
o |  changeset:   101:900ffaa91dbc
|/   user:        Tago <tago@**.co.jp>
|    date:        Fri Apr 26 18:24:11 2019 +0900
|    summary:     #12必須項目の項目表示
|
o  changeset:   100:6e23094e6831
|  user:        Tago <tago@**.co.jp>
|  date:        Thu Apr 25 20:03:08 2019 +0900
|  summary:     #12 counselor 新規追加機能
```
##### updateする時のファイルを確認、changesetで範囲指定
```:オプション--stat
$ hg log -l 3
changeset:   103:b0622a1c2768
tag:         tip
parent:      101:900ffaa91dbc
parent:      102:9eebb4ecb3bc
user:        Tago <tago@**.co.jp>
date:        Fri Apr 26 18:25:36 2019 +0900
summary:     merge

changeset:   102:9eebb4ecb3bc
parent:      100:6e23094e6831
user:        Tago <tago@**.co.jp>
date:        Fri Apr 26 10:46:37 2019 +0900
summary:     #19 文言修正

changeset:   101:900ffaa91dbc
user:        Tago <tago@**.co.jp>
date:        Fri Apr 26 18:24:11 2019 +0900
summary:     #12必須項目の項目表示
```
##### updateする時のファイルを確認、changesetで範囲指定
```:オプション--stat
$ hg diff -r 100:103 --stat
 lib/Log.inc                            |   5 ++++
 lib/Validate_function.php              |  18 +++++++++++++++
 messages/ja/app_word.php               |   4 +-
　：
 7 files changed, 186 insertions(+), 45 deletions(-)
```


# テストサイト構築
すでに運用しているサイトでhg管理をしているとします。
テストサイトがほしい。そんな時にした作業です。
バージョン管理しているサイトは別サーバ。
サーバ間ではssh認証ができている状態です。

手順

```:1.テストサイト場所作成
$ mkdir tagosite2
$ cd tagosite2/
```
```:2.別サーバからhg情報持ってくる~~パターン1-clone使う~~
tagosite2$ hg clone ssh://tago@***.***.***.***//ehehehe/tagosite/
destination directory: tagosite
requesting all changes
adding changesets
adding manifests
adding file changes
added 2 changesets with 749 changes to 716 files
updating to branch default
716 files updated, 0 files merged, 0 files removed, 0 files unresolved
tagosite2$ ls -la
　＞なんてこったい。　tagositeフォルダごとできちゃったぜぃ。パス位置はちゃんと考えてからもってこようね。
　＞commitしてないものはもってこないからね。
tagosite2$ mv tagosite/* .
tagosite2$ mv tagosite/.hg .
tagosite2$ rmdir tagosite
 ＞移動させたら後始末
```
```:2.別サーバからhg情報持ってくる~~パターン2-rsync使う~~
tagosite2$ rsync -avzhn tago@***.***.***.***:ehehehe/tagosite/*
　＞ -n がついてれば DryRun 管理してる.
　＞ hgフォルダごと持ってくるから全部が必要ならこっちの方が手っ取り早い。
```
```:3.確認
$ hg status
$ hg pull
pulling from ssh://tago@***.***.***.***//ehehehe/tagosite/
searching for changes
no changes found
　＞ 変なエラーがでていないなら無事に引っこ抜けれる状態。今後はpullで行うべし。
```

ちなみに、同一サーバ内で別フォルダに持ってくるのは

```
$ hg clone /ehehehe/tagosite/
destination directory: tagosite
updating to branch default
716 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ ls
tagosite
　＞　同じ名前でその場所にできちゃうからね。お気をつけあそばせ。
```

## ちょっとしたつまづいた問題（A:レポジトリある　B:cloneした)
##### Bで作業した内容をAに反映させたい！
レポジトリに登録した後どうすればいい？って慣れていないと感がつかめなかったので・・
**＜対処＞** 

```:Bで修正をかけた
$ hg status
M path/kaetanosa.inc
$ hg commit kaetanosa.inc
　＞レポジトリに書かれたみたい。この後どうすれば？とりあえずpushしてみると
$ hg push
pushing to tagosite
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
　＞送り込めたっぽい。
```
```:Aで修正ファイルを反映させる
$ hg pull
pulling from default
abort: repository default not found!
　＞一応、やってみたけど、意味なかった。pushされているからレポジトリには反映されているので
$ hg update
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
　＞無事に反映されました。
```

##### Bでファイルを削除した。もとのファイルを取得し直したい！
CVSだと、updateしたら取ってこれるのにhgはそういうわけにはいかない。
**＜対処＞** 
 
```:Bサーバで
$ mv ababa.inc uhoho.php
$ hg pull
pulling from tagosite
searching for changes
no changes found
　＞Aサーバで更新かかってるわけじゃないからpullじゃ何も起きない。
$ hg status
! path/ababa.inc
! path/uhoho.php
 ＞ファイルは消えてる。
$ hg update ababa.inc
abort: unknown revision 'ababa.inc'!
 ＞怒られた
$ hg revert ababa.inc
 ＞　リポジトリ管理のファイルが復活できた
```

##### Bでcloneしたら余計なファイルがcommit されていることがわかった。余計なファイルをレポジトリから削除しよう 

**＜対処＞** 
-- Aサーバ構築のhg 
-- Bサーバでcloneしてわかった不要ファイル 
-- Aサーバで不要ファイルを `hg foget ファイル名`で管理対象から削除 
-- ファイルごと削除するなら、`hg remove ファイル名` 
　`hg forget　ファイル名` と `rm ファイル名` を連続して実行してる感じらしい 
-- Bサーバで更新をする

```:Bサーバで
$ hg pull
pulling from ssh://tago@***.***.***.***//ehehehe/tagosite/
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 66 changes to 66 files
(run 'hg update' to get a working copy)
 ＞何がおきた？
 hg pull しただけだと、ワーキングコピー（作業ディレクトリの内容）は変わってない。
$ hg update
local changed ファイル名 which remote deleted
use (c)hanged version, (d)elete, or leave (u)nresolved? d
66 files updated, 0 files merged, 1 files removed, 0 files unresolved
　＞選択dを選ぶとファイルがrm します。

別パターン
$ hg update
use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
　＞選択cを選ぶとバージョン管理の方が有効になる。

```
```:ちなみにAサーバでレポジトリたちにpushしてみようとすると
$ hg push
abort: default repository not configured!
(see the "path" section in "hg help config")
　＞Aサーバを元にしてるんからこれといって設定されてない。どこのレポジトリ？ってなる。
```

##### 開発サイト（B）で作業（いくつかcommit済み）中、本番サイト（A）で問題発生。別開発サイト(C)で修正をかけて衝突した
```
C:$ hg commit
C:$ hg push
searching for changes
remote has heads on branch 'default' that are not known locally: ce61497eb23e
abort: push creates new remote head 83baf7159da3!
(pull and merge or see "hg help push" for details about pushing new heads)

```

##### 本番サイト（A）にupdateしたらファイルが衝突した。新しいupdateができていない！
```
$ hg update
abort: outstanding merge conflicts
$ hg log -l3 --graph
o  changeset:   285:50bcfa895d8a
|  tag:         tip
|  user:        Mitsuyo Hirota <hirota@lang.co.jp>
|  date:        Tue Jul 30 19:35:25 2019 +0900
|  summary:     #17 英字メール対応
|
@  changeset:   284:f2966084ab63
|  user:        Mitsuyo Hirota <hirota@lang.co.jp>
|  date:        Tue Jul 30 19:02:13 2019 +0900
|  summary:     #17 英字対応
|
o  changeset:   283:bede686a0b35
|  user:        Mitsuyo Hirota <hirota@lang.co.jp>
|  date:        Tue Jul 30 17:00:27 2019 +0900
|  summary:     #17 英語メール対応
```
こんなとき、しかもマージしようにもファイルの違いがないとかいう

```
$ hg merge
abort: nothing to merge
(use 'hg update' instead)
```
headの位置が違うからheadを新しいとこに持ってきたい！
update で-Cオプションを付けることで現在の変更を破棄し強制的にそのリビジョンにしてしまう。
だって違いないから。

```
$ hg heads
changeset:   285:50bcfa895d8a
tag:         tip
user:        Mitsuyo Hirota <hirota@lang.co.jp>
date:        Tue Jul 30 19:35:25 2019 +0900
summary:     #17 英字メール対応

$ hg update -C 285
1 files updated, 0 files merged, 0 files removed, 0 files unresolved

$ hg log -l3 --graph
@  changeset:   285:50bcfa895d8a
|  tag:         tip
|  user:        Mitsuyo Hirota <hirota@lang.co.jp>
|  date:        Tue Jul 30 19:35:25 2019 +0900
|  summary:     #17 英字メール対応
|
o  changeset:   284:f2966084ab63
|  user:        Mitsuyo Hirota <hirota@lang.co.jp>
|  date:        Tue Jul 30 19:02:13 2019 +0900
|  summary:     #17 英字対応
|
o  changeset:   283:bede686a0b35
|  user:        Mitsuyo Hirota <hirota@lang.co.jp>
|  date:        Tue Jul 30 17:00:27 2019 +0900
|  summary:     #17 英語メール対応 
```
よし、変わったぞ