2017年07月13日

git ブランチを付け替える

ブランチを統合する操作として "merge" がある。
もう一つ別の方法として、 "rebase" がある。





基本的な操作


git_rebase01.png



"new_branch" ブランチを "master" ブランチへ "merge" すると、以下のようになる。

$ git checkout master
$ git merge new_branch

git_rebase02.png
$ git log --oneline --graph
* e379414 Merge branch 'new_branch' Conflicts -> modified
|\
| * 0792fc6 new_branch 追加 3
| * ef693eb new_branch 追加 2
| * 24edebf new_branch 追加1
* | 762bccf master 追加 3
* | 9fe9714 master 追加 2
* | 1c0a080 master 追加1
|/
* 07c5066 master branch :変更 1
* 830f4ca Add new file :index.html


これを "rebase" を使って操作してみる。

"rebase" は、「re-base」のこと。ブランチの分岐元を付け替える操作。
分岐元を変更したい("rebase" したい)ブランチへ切り替える。今は、"new_branch" を変更する。

$ git checkout new_branch


"new_branch" ブランチの分岐元を、"master" ブランチの "HEAD" に切り替える。

$ git rebase master


コンフリクトが起きた場合は、コンフリクトを修正後、修正ファイルをステージし、継続する。

$ git add index.html
$ git rebase --continue


"rebase"が終了すると、以下のようになる。
git_rebase03.png
$ git log --oneline --graph
* 22d32e0 new_branch 追加 3
* d7e8b73 new_branch 追加 2
* 5893adb new_branch 追加1
* 762bccf master 追加 3
* 9fe9714 master 追加 2
* 1c0a080 master 追加1
* 07c5066 master branch :変更 1
* 830f4ca Add new file :index.html

"new_branch" は分岐元が付け替えられている。そして、各コミットも改めてコミットされてたのでコミットIDが変わっている。

この状態で、"master" ブランチで、"merge" を行うと、

$ git checkout master
$ git merge new_branch

コミット状態がきれいになっているので Fast-forward マージ が行われる。
Updating 762bccf..22d32e0
Fast-forward
index.html | 3 +++
1 file changed, 3 insertions(+)

git_rebase04.png
$ git log --oneline --graph
* 22d32e0 new_branch 追加 3
* d7e8b73 new_branch 追加 2
* 5893adb new_branch 追加1
* 762bccf master 追加 3
* 9fe9714 master 追加 2
* 1c0a080 master 追加1
* 07c5066 master branch :変更 1
* 830f4ca Add new file :index.html


ログを見ると、単にマージしたときと統合内容は同じだが、こちらのほうがブランチの分岐の履歴が無く、すっきりとした状態になる。

ただし、作業した結果が残らない履歴は、個人的には好みではない。

使うのであれば、本流のブランチへ統合するときに行うのではなく、バグ修正や、機能開発などの作業ブランチにおいて、個人の作業範疇でさらにブランチを切る必要があった場合に、最終的なブランチの結果としてコミットをまとめるときに使うことをすすめる。これであれば、個人単位での作業としては履歴が残ることと、後から履歴を見たときに作業の都合のために切ったブランチが全体の見通しを悪くしてしまうことを避けることができる。





onto オプション


"new_branch" ブランチを切って開発中に、開発のためにバグ修正が必要だったので "sub_branch" ブランチを切って修正した。このバグ修正が他の機能開発でも必要だとわかったので "master" ブランチへ統合したい。
git_rebase05.png

"new_branch" ブランチはまだ開発途中で取り込めない。"sub_branch" のみ取り込みたい。
必要なコミットは、コミット(X):0cb061a、コミット(Y):0a8d056 の2つのみ。
ここで "rebase" をしてみる。

$ git checkout sub_branch
$ git rebase master

"master" ブランチへマージする。

$ git checkout master
$ git merge sub_branch

Updating 762bccf..ce98d22
Fast-forward
index.html | 3 +++
1 file changed, 3 insertions(+)

$ git log --oneline --graph
* ce98d22 sub_branch 追加 2
* 216520c sub_branch 追加 1
* b4d8495 new_branch 追加1
* 762bccf master 追加 3
* 9fe9714 master 追加 2
* 1c0a080 master 追加1
* 07c5066 master branch :変更 1
* 830f4ca Add new file :index.html


git_rebase06.png

この場合、今はまだ取り込みたくなかった コミット(1):24edebf が一緒に取り込まれてしまった。

このような変則的な取り込みを行うときに、"onto" オプションを使う。

指定がややこしいが、以下のようにブランチを指定する。
現在、チェックアウトしているブランチに対して、

$ git rebase --onto <どこへ> <どこから>



今の操作であれば、"sub_branch" ブランチをチェックアウトした状態で、"new_branch" から、"master" へ、切り替える操作。

$ git checkout sub_branch
$ git rebase --onto master new_branch

"master" ブランチへマージする。

$ git checkout master
$ git merge sub_branch

Updating 762bccf..9617339
Fast-forward
index.html | 3 +++
1 file changed, 3 insertions(+)

$ git log --oneline --graph
* 9617339 sub_branch 追加 2
* 66d8fb8 sub_branch 追加 1
* 762bccf master 追加 3
* 9fe9714 master 追加 2
* 1c0a080 master 追加1
* 07c5066 master branch :変更 1
* 830f4ca Add new file :index.html

git_rebase07.png


これは、ちょっと特殊な場面だったが、次のような場合も、"oonto" オプションを使えば解決できる。

"new_branch" ブランチから、新たなブランチを切って作業を進めようとしていたが、誤って、"master" ブランチから、ブランチを切って作業していたことに気づいた。"new_branch" ブランチも履歴が進んでしまった。本当は コミット(1):24edebf からブランチを切りたかった。
git_rebase08.png

こういう場合に、"onto" オプションをつけて "rebase" をすることで修正できる。
(付け替え先はブランチ名ではなく、コミットIDを指定する。ブランチ名だと、先頭のコミットが付け替え先になる。)

$ git checkout sub_branch
$ git rebase --onto 24edebf master

$ git log --oneline --graph
* 026323a sub_branch 追加 2
* 29540b6 sub_branch 追加 1
* 24edebf new_branch 追加1
* 07c5066 master branch :変更 1
* 830f4ca Add new file :index.html

git_rebase09.png





rebase と cherry-pick


上記のような "rebase" の操作は、実は連続で cherry-pick を実行することでも同じ結果が得られる。
少ないコミットであれば、cherry-pick で操作すれば済むが、ブランチ丸ごとに対して操作することに対して、簡単に cherry-pick 操作できるようしたものが "rebase" だともいえる。





まとめ


"rebase" することのメリットとしては、
  • コミットログがきれいになる。
    無数に入り組んだ履歴ではなく、必要な情報が俯瞰できるようになり、後から履歴を見たときにわかりやすくなる。その結果、運用、保守、生産性の効率が期待できる。

という点で、作業の効率化のためにもどんどんブランチを切って作業し、それを整理していくことは良いことだと思う。
ただ、これが許されるのは閉じられた世界での話。

チーム作業で公開してしまったブランチに対してはダメ。
ブランチを作り、リモートリポジトリに push した後、他のメンバーがそのブランチから新たにブランチを切って作業していたら、もうそのブランチは "rebase" してはいけない。禁止。

"rebase" してしまうと、過去のコミットIDが変わってしまう。派生させたブランチは親ブランチを追いかけることができなくなってしまう。"merge" するときに多大なる迷惑をかけてしまう。

なので、push する前のローカルなブランチであれば "rebase" で整理して、全体の見通しを良くすることは、以降の開発効率を上げるための一手間としておススメ。





gitをインストール
gitサーバーのセットアップ
git ブランチについて
git 変更を一時的に退避 stash
git ブランチを合流するマージ
git コミット履歴を変更する
git コミットを取り消す
git 変更をリセットする
git リモートでの操作
git ファイルの追跡
git リリース準備
git リモートブランチを追加
git チェックアウトをもっと便利に使う
git プロジェクトの構成
git 変更をpatchファイルにする
git コンフリクトに対処する
git 失敗したときの復元
posted by Zorinos at 20:00| Comment(0) | Linux | 更新情報をチェックする

2017年07月11日

3.5mmステレオジャック オーディオセレクタ を自作する

パソコンとタブレットから音声出力させるときに、ヘッドホンとイヤホンを使っているが切り替えて使うことや、ケーブルが邪魔で仕方がない。
タブレット→パソコンへBluetoothで音を飛ばして音声出力の一本化をしてみたが、タブレット側でWifiの通信が阻害され、音声がクラウドにある場合にストレスが酷いのでやめた。

で、次に考えたのがオーディオセレクタ。

値段も手ごろでこれで良いかと思っていたが、ノイズが酷いとかプッシュ式のスイッチが効かないとかレビューがあって購入を悩んでいたが、もっと検索していたら結構オーディオセレクタの自作ネタがひっかかる。
費用もオーディオセレクタよりも抑えられ、既製品を買って失敗するよりは良いかなと自作することにした。

現在の音声入力はメインはデスクトップPCとタブレットの2本だが、ノートPCとTVもあるので最大4本の音声入力ができるように、3.5mmのステレオミニジャックの入力4 出力1でロータリースイッチを使って切り替えるオーディオセレクタを作成することにした。







パーツ購入


電子部品は千石電商ネット通販で購入。
ケースは、100均のセリアで手ごろサイズで、加工し易そうな箱があったので購入。
種類品名値段
ロータリースイッチアルプス電気 SRRN142100
3回路4接点
audioselector01.jpg
¥399 x 1
3.5mm ステレオジャックマル信無線電機 MJ-073Haudioselector02.jpg¥74 x 5
つまみMAV C-1S
シャフト径:φ6.1mm
audioselector03.jpg
¥168 x 1
ケーブル協和ハーモネット RKV 0.3×4列 L-1 4
芯リボンケーブル(4色カラー) 1m
audioselector04.jpg
¥250 x 1
上記4点送料¥432
ケース縦66mm x 横66mm x 高さ66mmaudioselector05.jpg¥108 x 1
合計¥1727





その他の作業に必要なもの、
半田ごて、ハンダ、六角レンチ(つまみの固定用)、電動ドリル(ケース穴あけ用)は手持ちのものを使用。
あと、あると便利なものは、マスキングテープ(ケース穴あけの位置決め)、テスター(導通チェック用)、グルーガン(半田付け箇所の補強)。




配線


ロータリースイッチの回路図から確認。
この図面は、軸側から見た番号になる。「C」の位置が共通の端子。
audioselector07.png

「C」を出力端子に割り当て、今回はこのように割り当てた。
(上図とは逆から見た絵)
audioselector06.jpg

3.5mmステレオジャックのTSRは以下。
audioselector08.jpg

audioselector13.jpg



以下の配線とした。
audioselector12.png





作業


ケースに電動ドリルで、3.5mmステレオジャック取り付け用の穴 x 5箇所 と、
ロータリースイッチの軸を通す穴 x 1個と、スイッチ回り止めの穴 x 1個をあける。

これが一番苦労した。手持ちのドリルでは十分な大きさのサイズが無かったので、最後はドリルを斜めに入れたりしながら無理矢理に削った。勢いあまってケースを少し傷つけてしまった。

あとはケーブルを切って、半田付けして、ケースに収めるのだが、
ケースに取り付ける順番を考えながら半田付けする。
グルーガンで半田付け箇所を補強したけど、見た目がいまいち。修行が足りない。

つまみの側部に六角レンチで締め付けれるねじがあるので、ロータリースイッチの軸を締め付けることで固定。

で、完成。
audioselector10.jpgaudioselector11.jpg

透明ケースなので、ケーブルが丸見えでごちゃごちゃしていたりするが、それは想定通り。
いまいちなのはグルーガンの技術。中身が丸見えなので見栄えが悪い。技術不足。
あと、ロータリースイッチの軸が長くて、つまみが浮いている感じになっているのが気になる。少し軸をカットするともう少し見栄えが良くなると思う。
改善したいところはあるが、全体的にコンパクトにできあがったので大満足。





まとめ


手順を残すために、これを書きながら、そしてロータリスイッチの導通確認をしながら作業したので、半日仕事。部品代は¥2000弱だが、手間賃を入れたら、それなりの金額。試作品作りだと思えば、こんなものか。
次に作るときがあれば、今回の反省を踏まえて必要なものをそろえておけば、実質作業は短時間になるだろう。
とは言え、この段階でも既製品と同じぐらいなので、十分じゃないだろうか。

そして、自作しているので壊れても修理がきくメリットがあるし、何より一番のメリットはノイズが気にならないというのが気持ちがいい。

posted by Zorinos at 20:00| Comment(0) | DIY | 更新情報をチェックする

2017年07月02日

git ブランチを合流するマージ

ブランチ間で変更を共有するための操作が "merge" 。

$ git merge <ブランチ名>



ここで簡易な説明をしたが、もう少しマージについて掘り下げてみる。

直接マージ


一般的なマージのイメージ。ブランチ全体を別ブランチへ合流させる。

"new_branch" ブランチを "master" ブランチにマージする場合、
"master" ブランチをチェックアウトした状態で実行する。

$ git merge new_branch



git_branch10.png

コミットログをグラフ表示にして確認する。
$ git log --graph
* commit 674649a321b87801de0afea9389a162a66cac60d
|\ Merge: d7af236 5230eda
| | Author: hoge hogehoge
| | Date: San Jun 25 20:00:00 2017 +0900
| |
| | Merge branch 'new_branch'
| |
| | Merge new_branch -> master
| |
| * commit 5230eda9e7070b084e250852ec1f29bcc65e0870
| | Author: hoge hogehoge
| | Date: San Jun 25 19:00:00 2017 +0900
| |
| | new_branch 追加2
| |
| * commit 71950fae9396a54bbf255b8466f3f15e93e76051
| | Author: hoge hogehoge
| | Date: San Jun 25 18:00:00 2017 +0900
| |
| | new_branch 追加1
| |
* | commit d7af236ea4c844862eaafb38fbd99e951a34dda3
| | Author: hoge hogehoge
| | Date: San Jun 25 18:30:00 2017 +0900
| |
| | master branch 追加2
| |
* | commit 8673bdfb53790b7dc42a8a9ecf24491641c868f9
|/ Author: hoge hogehoge
| Date: San Jun 25 11:00:00 2017 +0900
|
| master branch 追加1
|
* commit 76eb1f66a10cea1ac9e3b3b1f59b5fe946a29467
| Author: hoge2
| Date: San Jun 25 10:10:00 2017 +0900
|
| master branch.
|
* commit b396e3f7adef3c4cedbda55df20ceac837750e0b
Author: hoge hogehoge
Date: Sat Jun 24 16:00:00 2017 +0900

Add new file.

git_branch11.png
ログを見ると "Merge: d7af236 5230eda" と、
"d7af236" "5230eda" の両方の変更履歴を取り込んだマージコミットが作成されている。

"master" ブランチは、このマージコミットを指している。





ブランチの削除


機能開発でもバグ修正でも、ブランチを切って作業し、作業が終わりブランチをマージしたのであれば、このブランチはもう役目が終わったことになる。

役目がなくなったブランチが乱立していると全体の見通しが悪くなるし、作業のケアレスミスを誘うので、削除してしまう。ブランチで作業した履歴経過は、マージしたことで別のブランチに取り込まれているので大丈夫。

"-d" オプションで削除できる。"master" ブランチをチェックアウトした状態で実行する。

$ git branch -d new_branch



もし、まだマージが終わってないのであれば、以下のようにエラーがでる。
$ git branch -d new_branch
error: The branch 'new_branch' is not fully merged.
If you are sure you want to delete it, run 'git branch -D new_branch'.

それでも強制的に削除したいのであれば、"-D" オプションを指定すればブランチが削除される。






fast-forward マージ


直接マージでの例では、"new_branch" の分岐元に変更があったが、もし、分岐元に変更がなければどうなるか?
git_branch08.png

ブランチの分岐元で変更がなければ、
単純に "master"ブランチ(= ポインタ)が移動するだけ。
git_branch09.png

この場合、マージ作業が行われない。
コミットログを見ても、マージした内容がでてこない。
$ git log --graph
* commit 693e08561ab3e6eef1055cc043644f04a75e0a32
| Author: hoge hogehoge
| Date: San Jun 25 12:20:00 2017 +0900
|
| new_branch 追加2
|
* commit 51f70ad5da7a8a73f46aa5da0cdc3798c7a4bfe4
| Author: hoge hogehoge
| Date: San Jun 25 12:15:00 2017 +0900
|
| new_branch 追加1
|
* commit 76eb1f66a10cea1ac9e3b3b1f59b5fe946a29467
| Author: hoge2
| Date: San Jun 25 10:10:00 2017 +0900
|
| Update another user.
|
* commit b396e3f7adef3c4cedbda55df20ceac837750e0b
Author: hoge hogehoge
Date: Sat Jun 24 16:00:00 2017 +0900

Add new file.



git側からすると処理が簡易になるが、作業者側からすると「ここまで作業した内容を、このタイミングで本流ブランチへマージする」という意図を残せなくなってしまう。
こんな時は、マージの実行時にオプションで、non-fast-forwardマージを指定することで、"fast-forward" マージ状態の場合でも必ずコミットを作成することができる。

$ git merge --no-ff new_branch



git_merge01.png
コミットログを確認する。
$ git log --graph
* commit de92ffc8b5239d46b3ffb6da53e746862802d7ea
|\ Merge: 76eb1f6 3394694
| | Author: hoge hogehoge
| | Date: San Jun 25 14:55:00 2017 +0900
| |
| | Merge branch 'new_branch'
| |
| * commit 3394694890bd9611876afd0c327d3d1e7aafa5a3
| | Author: hoge hogehoge
| | Date: San Jun 25 14:50:00 2017 +0900
| |
| | new_branch 追加2
| |
| * commit 6bf906ae7c607b1fec53560c4a4001aff4dbb151
|/ Author: hoge hogehoge
| Date: San Jun 25 14:40:00 2017 +0900
|
| new_branch 追加1
|
* commit 76eb1f66a10cea1ac9e3b3b1f59b5fe946a29467
| Author: hoge2
| Date: San Jun 25 10:10:00 2017 +0900
|
| Update another user.
|
* commit b396e3f7adef3c4cedbda55df20ceac837750e0b
Author: hoge hogehoge
Date: Sat Jun 24 16:00:00 2017 +0900

Add new file.

"non-fast-forward(--no-ff)" を指定したことで、マージコミットが作成できた。
"fast-forward" マージかどうか考えるのが煩わしいのであれば、マージするときは常に "--no-ff" を指定するルールで運用すればよい。





複数ブランチをマージ


マージの操作は、1つのブランチを指定するだけではなく、複数のブランチを指定することが可能

$ git merge <ブランチ1> <ブランチ2> ...



偽t
git_merge02.png
$ git log --graph
*-. commit ffa171ba45291cf2af0acd4be40cc11a1bc5b349
|\ \ Merge: 76eb1f6 3737881 51b322c
| | | Author: hoge hogehoge
| | | Date: San Jun 25 16:15:00 2017 +0900
| | |
| | | Merge branches 'new_branch' and '2nd_branch'
| | |
| | * commit 51b322cb869656e033037d451745591e73122416
| |/ Author: hoge hogehoge
|/| Date: San Jun 25 16:00:00 2017 +0900
| |
| | 2nd_branch 追加1
| |
| * commit 37378818d3cdce35f83950f13208e9822565b691
| | Author: hoge hogehoge
| | Date: San Jun 25 15:55:00 2017 +0900
| |
| | new_branch 追加 2
| |
| * commit a2458950a047450e1c07a54d109cc0f9b06b6196
|/ Author: hoge hogehoge
| Date: San Jun 25 15:50:00 2017 +0900
|
| new_branch 追加 1
|
* commit 76eb1f66a10cea1ac9e3b3b1f59b5fe946a29467
| Author: hoge2
| Date: San Jun 25 10:10:00 2017 +0900
|
| Update another user.
|
* commit b396e3f7adef3c4cedbda55df20ceac837750e0b
Author: hoge hogehoge
Date: Sat Jun 24 16:00:00 2017 +0900

Add new file.

ログを見ると "Merge: 76eb1f6 3737881 51b322c" と、
"76eb1f6" "3737881" "51b322c" の3つの変更履歴を取り込んだマージコミットが作成されている。






圧縮コミット


作業者にとって作業の履歴は必要なものだが、ときには途中経過は必要なく、最終結果があれば良いときもある。バグ修正のブランチで、作業の区切りが良いタイミングでコミットしていた場合など。
こういうときに履歴を圧縮(squash)してコミットできる。
git_merge02.png
"new_branch"ブランチでのログを確認してみる。
$ git log --graph
* commit a5d864ba614bee81b2a1f4e9a659b6c06950439c
| Author: hoge hogehoge
| Date: San Jun 25 16:30:00 2017 +0900
|
| new_branch 修正
|
* commit d45c9c87f3c59ffcac25af2e87607a016c6a2672
| Author: hoge hogehoge
| Date: San Jun 25 16:25:00 2017 +0900
|
| new_branch 追加 2
|
* commit c6b3d18719ced8097ecbc3dec1ccb51ee717491e
| Author: hoge hogehoge
| Date: San Jun 25 16:20:00 2017 +0900
|
| new_branch 追加 1
|
* commit 76eb1f66a10cea1ac9e3b3b1f59b5fe946a29467
| Author: hoge2
| Date: San Jun 25 10:10:00 2017 +0900
|
| Update another user.
|
* commit b396e3f7adef3c4cedbda55df20ceac837750e0b
Author: hoge hogehoge
Date: Sat Jun 24 16:00:00 2017 +0900

Add new file.

"new_branch" ブランチには3つのコミットが存在している。

これを "master" ブランチへ圧縮コミットする。

$ git merge --squash new_branch

Updating 76eb1f6..a5d864b
Fast-forward
Squash commit -- not updating HEAD
index.html | 4 ++++
1 file changed, 4 insertions(+)


"master" ブランチでステータスを確認してみる。
$ git status
branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD ..." to unstage)

modified: index.html

ステージされた状態になっている。
これは、圧縮コミットを実行しただけではマージコミットが作られないから。

ブランチ先でのすべてのコミットを1つにまとめて、チェックアウトしているブランチにステージするまで。コミットを再度実行する必要があることに注意。

$ git commit
[master 4f0b63b] Squashed commit of the following:
1 file changed, 4 insertions(+)

$ git log --graph
* commit 4f0b63b9131b3e50a9621502a18ae81e89bfc2be
| Author: hoge hogehoge
| Date: San Jun 25 20:40:00 2017 +0900
|
| Squashed commit of the following:
|
| commit a5d864ba614bee81b2a1f4e9a659b6c06950439c
| Author: hoge hogehoge
| Date: San Jun 25 16:30:00 2017 +0900
|
| new_branch 修正
|
| commit d45c9c87f3c59ffcac25af2e87607a016c6a2672
| Author: hoge hogehoge
| Date: San Jun 25 16:25:00 2017 +0900
|
| new_branch 追加 2
|
| commit c6b3d18719ced8097ecbc3dec1ccb51ee717491e
| Author: hoge hogehoge
| Date: San Jun 25 16:20:00 2017 +0900
|
| new_branch 追加 1
|
* commit 76eb1f66a10cea1ac9e3b3b1f59b5fe946a29467
| Author: hoge2
| Date: San Jun 25 10:10:00 2017 +0900
|
| Update another user.
|
* commit b396e3f7adef3c4cedbda55df20ceac837750e0b
Author: hoge hogehoge
Date: Sat Jun 24 16:00:00 2017 +0900

Add new file.


git_merge04.png





チェリーピック


特定機能のためブランチを切って進めていたが、このうちの一部を取り込む必要が出てきた。その一部は完成しているが、このブランチの状態とし不完全でマージすることができない。このような場合に一部のコミットだけ取り込むことができるのがチェリーピック(気に入ったものをつまみ食い)。

コミットIDを使うので、予め、gitログから取り込みたいコミットのIDを取得しておく。
git_merge05.png
$ git log
commit 27ea9f6315aa874c49917ae7295b83eac0dd5d53
Author: hoge hogehoge
Date: San Jun 25 12:55:00 2017 +0900

new_branch 追加 3

commit 516b29f44ebff0b18fe1d7dc3aab15d17a942d62
Author: hoge hogehoge
Date: San Jun 25 12:50:00 2017 +0900

new_branch 追加 2

commit 47210350a1abbd59a0e538ff2904b5ae45e07d73
Author: hoge hogehoge
Date: San Jun 25 12:45:00 2017 +0900

new_branch 追加 1

commit 76eb1f66a10cea1ac9e3b3b1f59b5fe946a29467
Author: hoge2
Date: San Jun 25 10:10:00 2017 +0900

Update another user.

commit b396e3f7adef3c4cedbda55df20ceac837750e0b
Author: hoge hogehoge
Date: Sat Jun 24 16:00:00 2017 +0900

Add new file.


コミットID:516b29f をチェリーピックでマージしてみる。
"master" ブランチをチェックアウトした状態で実行する。
git_merge06.png

$ git cherry-pick 516b29f

error: could not apply 516b29f... new_branch 追加 2
ヒント: after resolving the conflicts, mark the corrected paths
ヒント: with 'git add ' or 'git rm '
ヒント: and commit the result with 'git commit'

コンフリクトが発生した。とりあえずステータスを確認する。
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
You are currently cherry-picking commit 516b29f.
(fix conflicts and run "git cherry-pick --continue")
(use "git cherry-pick --abort" to cancel the cherry-pick operation)

Unmerged paths:
(use "git add ..." to mark resolution)

both modified: index.html

no changes added to commit (use "git add" and/or "git commit -a")


コンフリクトを修正する。
(fix conflicts and run "git cherry-pick --continue")

修正したら、ファイルをステージし、継続実行する。

ここでコミットログには、しっかりとチェリーピックを実施したことを残しておく。
マージのようにログにチェリーピックを実行したことは自動的には残らないので、どこからチェリーピックしたのかなど残しておくこと。後から作業履歴が追えなくなる。

$ git add index.html
$ git cherry-pick --continue

$ git log --graph
* commit 88299c730a7f61e3b12a5b74c4f4bcf5777fb1a2
| Author: hoge hogehoge
| Date: San Jun 25 12:50:00 2017 +0900
|
| new_branch 追加 2
|
| cherry-pick :new_branch ID:516b29f -> master
|
* commit 76eb1f66a10cea1ac9e3b3b1f59b5fe946a29467
| Author: hoge2
| Date: San Jun 25 10:10:00 2017 +0900
|
| Update another user.
|
* commit b396e3f7adef3c4cedbda55df20ceac837750e0b
Author: hoge hogehoge
Date: Sat Jun 24 16:00:00 2017 +0900

Add new file.


今回はコンフリクトを修正したが、やっぱり「チェリーピックは無しで」と思ったなら、
(use "git cherry-pick --abort" to cancel the cherry-pick operation)

$ git cherry-pick --abort

とすれば、チェリーピックの操作がキャンセルされる。





別のパターンでもチェリーピックしてみる。
$ git log
commit 51068aa82fd5e49945882d52635860f20f423ee5
Author: hoge hogehoge
Date: San Jun 25 13:15:00 2017 +0900

new_branch index.html変更4

commit 510ada971c99f12e849f05ee1fa5ff1e08a57dea
Author: hoge hogehoge
Date: San Jun 25 12:35:00 2017 +0900

new_branch index.html変更3, readme.txt変更2

commit 9d118d841fe194b89133d357db3d2b46e3c6e9ab
Author: hoge hogehoge
Date: San Jun 25 12:30:00 2017 +0900

new_branch readme.txt変更1

commit d72b4934eea9f324159fc4afd63e8c1622e40486
Author: hoge hogehoge
Date: San Jun 25 12:25:00 2017 +0900

new_branch index.html変更2, readme.txt追加

commit c88270579d1b1ecc78659e4199d7585d36d1ea26
Author: hoge hogehoge
Date: San Jun 25 12:20:00 2017 +0900

new_branch index.html変更1

commit 76eb1f66a10cea1ac9e3b3b1f59b5fe946a29467
Author: hoge2
Date: San Jun 25 10:10:00 2017 +0900

Update another user.

commit b396e3f7adef3c4cedbda55df20ceac837750e0b
Author: hoge hogehoge
Date: Sat Jun 24 16:00:00 2017 +0900

Add new file.

git_merge07.png


今回は、コミットID:d72b493, 9d118d8, 510ada9 の一連となる3つをチェリーピックしてみる。このような複数コミットのチェリーピックは、

$ git cherry-pick [cherry-pick の始点となるコミット]..[cherry-pick の終点となるコミット]


とすることで、始点~終点までの一連のコミットをチェリーピックできる。

ただし、注意点がある。
始点に指定するのは、取り込みたいコミットの1つ前を指定すること。
git_merge08.png


"master" ブランチをチェックアウトした状態で実行。

$ git cherry-pick c882705..510ada9

error: could not apply d72b493... new_branch index.html変更2,  readme.txt追加
ヒント: after resolving the conflicts, mark the corrected paths
ヒント: with 'git add ' or 'git rm '
ヒント: and commit the result with 'git commit'

コンフリクト発生。まずはステータスを確認する。
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
You are currently cherry-picking commit d72b493.
(fix conflicts and run "git cherry-pick --continue")
(use "git cherry-pick --abort" to cancel the cherry-pick operation)

Changes to be committed:

new file: readme.txt

Unmerged paths:
(use "git add ..." to mark resolution)

both modified: index.html

コンフリクトしたファイルを修正し、ステージしたら、チェリーピックを継続する。

$ git add index.html
$ git cherry-pick --continue

[master cc35b51] new_branch index.html変更2,  readme.txt追加
Date: San Jun 25 12:25:00 2017 +0900
2 files changed, 4 insertions(+)
create mode 100644 readme.txt
[master 50eec66] new_branch readme.txt変更1
Date: San Jun 25 12:30:00 2017 +0900
1 file changed, 1 insertion(+)
[master 72958d6] new_branch index.html変更3, readme.txt変更2
Date: San Jun 25 12:35:00 2017 +0900
2 files changed, 2 insertions(+)l


一連のチェリーピックは、複数のコミットを圧縮するわけではないので、そのまま複数のコミットとして取り込まれる。しかし、コミットコメントは1回だけの入力になるので、複数チェリーピックであることを、コミットコメントとして残すようにする。
$ git log --graph
* commit 72958d63e1b0767fe9558b788613c95aa83e52f2
| Author: hoge hogehoge
| Date: San Jun 25 12:35:00 2017 +0900
|
| new_branch index.html変更3, readme.txt変更2
|
* commit 50eec6691da28becce129856846bd35cd7efb282
| Author: hoge hogehoge
| Date: San Jun 25 12:30:00 2017 +0900
|
| new_branch readme.txt変更1
|
* commit cc35b51f100c13ca134e874032567fb6fd7f9440
| Author: hoge hogehoge
| Date: San Jun 25 12:35:00 +0900
|
| new_branch index.html変更2, readme.txt追加
|
| cherry-pick new_branch ID:d72b493, 9d118d8, 510ada9 -> master
|
* commit 76eb1f66a10cea1ac9e3b3b1f59b5fe946a29467
| Author: hoge2
| Date: San Jun 25 10:10:00 2017 +0900
|
| Update another user.
|
* commit b396e3f7adef3c4cedbda55df20ceac837750e0b
Author: hoge hogehoge
Date: Sat Jun 24 16:00:00 2017 +0900

Add new file.






まとめ


開発作業の中でマージ作業が必須。作業してきたコミット内容をどのようにすれば次の作業に送れるのかを考え、どのようなマージを使うか決める。特にチェリーピックはいろいろな場面で役立つが、マージ操作と違い、コミットログに出てこないため、しっかりとコメントを残し、作業履歴を失わないように注意したい。






gitをインストール
gitサーバーのセットアップ
git ブランチについて
git 変更を一時的に退避 stash
git ブランチを付け替える
git コミット履歴を変更する
git コミットを取り消す
git 変更をリセットする
git リモートでの操作
git ファイルの追跡
git リリース準備
git リモートブランチを追加
git チェックアウトをもっと便利に使う
git プロジェクトの構成
git 変更をpatchファイルにする
git コンフリクトに対処する
git 失敗したときの復元
posted by Zorinos at 23:00| Comment(0) | Linux | 更新情報をチェックする

2017年06月30日

「vim」の種類

linux系OSのテキストエディタ、「vi」と「vim」。
「vi」は、VIsual editorの略。
「vim」は、Vi IMprovedの略。

Wikipediaより抜粋。
  • キーボードのみで操作されることを前提としていたため、キーボードのみですべての操作が可能になっている
  • 他のエディタとは操作方法がまるで異なるため、一通りのテキスト編集作業ができるようになるまで慣れが必要となる。
  • 一旦慣れてしまえばメモ帳などとは比較にならないほどのテキスト編集速度を得ることができるため、数多くのVim愛好家が存在する


「vi」を使いやすいように機能を拡張したものが「vim」。
「vi」は現在ではほとんど使われておらず、「vi」のつもりでも実は「vim」をつかっていたりする。





環境:Ubuntu 16.04

標準でインストールされている vim の確認


Ubuntu では、標準で「vim-tiny」という簡易版がインストールされている。
$ which vi
/usr/bin/vi
$ ls -l /usr/bin/vi
lrwxrwxrwx 1 root root 20 5月 26 16:58 /usr/bin/vi -> /etc/alternatives/vi
$ ls -l /etc/alternatives/vi
lrwxrwxrwx 1 root root 17 5月 26 16:57 /etc/alternatives/vi -> /usr/bin/vim.tiny

「vi」を実行すると、「vim-tiny」が実行される。


起動画面

$ vi


vim-tiny01.png
日本語化はされていない。

詳細情報を確認してみる。
$ vim.tiny --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Nov 24 2016 16:44:48)
Included patches: 1-1689
Extra patches: 8.0.0056
Modified by pkg-vim-maintainers@lists.alioth.debian.org
Compiled by pkg-vim-maintainers@lists.alioth.debian.org
Small version without GUI. Features included (+) or not (-):
+acl -farsi -mouse_sgr -tag_any_white
-arabic -file_in_path -mouse_sysmouse -tcl
-autocmd -find_in_path -mouse_urxvt +terminfo
-balloon_eval -float -mouse_xterm -termresponse
-browse -folding +multi_byte -textobjects
+builtin_terms -footer -multi_lang -timers
-byte_offset +fork() -mzscheme -title
-channel -gettext -netbeans_intg -toolbar
-cindent -hangul_input +packages -user_commands
-clientserver +iconv -path_extra +vertsplit
-clipboard -insert_expand -perl -virtualedit
-cmdline_compl -job -persistent_undo +visual
+cmdline_hist +jumplist -printer -visualextra
-cmdline_info -keymap -profile -viminfo
-comments -langmap -python -vreplace
-conceal -libcall -python3 +wildignore
-cryptv -linebreak -quickfix -wildmenu
-cscope -lispindent -reltime +windows
-cursorbind -listcmds -rightleft +writebackup
-cursorshape -localmap -ruby -X11
-dialog -lua -scrollbind +xfontset
-diff -menu -signs -xim
-digraphs -mksession -smartindent -xsmp
-dnd -modify_fname -startuptime -xterm_clipboard
-ebcdic -mouse -statusline -xterm_save
-emacs_tags -mouse_dec -sun_workshop -xpm
-eval -mouse_gpm -syntax
+ex_extra -mouse_jsbterm -tag_binary
-extra_search -mouse_netterm -tag_old_static
system vimrc file: "$VIM/vimrc"
user vimrc file: "$HOME/.vimrc"
2nd user vimrc file: "~/.vim/vimrc"
user exrc file: "$HOME/.exrc"
fall-back for $VIM: "/usr/share/vim"
Compilation: gcc -c -I. -Iproto -DHAVE_CONFIG_H -Wdate-time -g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -DTINY_VIMRC -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
Linking: gcc -Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -o vim -lSM -lICE -lXpm -lXt -lX11 -lXdmcp -lSM -lICE -lm -ltinfo -lselinux -lacl -lattr -ldl

「vim」から機能を削ぎ落した簡易版であり、もともとの「vi」とほぼ同じ機能といえる。





インストールできるVimの種類


$ vim
プログラム 'vim' は以下のパッケージで見つかりました:
* vim
* vim-gnome
* vim-tiny
* vim-athena
* vim-athena-py2
* vim-gnome-py2
* vim-gtk
* vim-gtk-py2
* vim-gtk3
* vim-gtk3-py2
* vim-nox
* vim-nox-py2
次の操作を試してください: sudo apt install <選択したパッケージ>

このうち、"-py2" と付いたものは、
VIM は python3 をデフォルトとします

標準のVIMパッケージはpython2ではなくpython3用にビルドされています。つまりpython2インタープリターを必要とするVIMプラグインもはや動作しないということです。この問題に対応するため、たとえばvim-gnome-py2のように、python2をサポートした代替のVIMパッケージを用意しています。これらのパッケージはalternativesシステムを用いて、既定のvimコマンドに設定できます。

・sudo update-alternatives --set vim /usr/bin/vim.gnome-py2
引用:Ubuntu 16.04 LTS (Xenial Xerus) リリースノート(日本語)

ということで、vim種類に対してpython2をサポートがあるだけなので、とりあずは無視しておく。

そのため、種類としては以下の通り。
* vim
* vim-gnome
* vim-tiny(標準版)
* vim-athena
* vim-gtk
* vim-gtk3
* vim-nox






vim


単なる「vim」は、「vim.basic」のこと。

起動画面

$ vim


vim-basic01.png
日本語化はされている。

詳細情報を確認してみる。
$ vim.basic --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Nov 24 2016 16:44:48)
適用済パッチ: 1-1689
追加拡張パッチ: 8.0.0056
Modified by pkg-vim-maintainers@lists.alioth.debian.org
Compiled by pkg-vim-maintainers@lists.alioth.debian.org
Huge 版 without GUI. 機能の一覧 有効(+)/無効(-)
+acl +farsi +mouse_netterm +tag_binary
+arabic +file_in_path +mouse_sgr +tag_old_static
+autocmd +find_in_path -mouse_sysmouse -tag_any_white
-balloon_eval +float +mouse_urxvt -tcl
-browse +folding +mouse_xterm +terminfo
++builtin_terms -footer +multi_byte +termresponse
+byte_offset +fork() +multi_lang +textobjects
+channel +gettext -mzscheme +timers
+cindent -hangul_input +netbeans_intg +title
-clientserver +iconv +packages -toolbar
-clipboard +insert_expand +path_extra +user_commands
+cmdline_compl +job -perl +vertsplit
+cmdline_hist +jumplist +persistent_undo +virtualedit
+cmdline_info +keymap +postscript +visual
+comments +langmap +printer +visualextra
+conceal +libcall +profile +viminfo
+cryptv +linebreak -python +vreplace
+cscope +lispindent +python3 +wildignore
+cursorbind +listcmds +quickfix +wildmenu
+cursorshape +localmap +reltime +windows
+dialog_con -lua +rightleft +writebackup
+diff +menu -ruby -X11
+digraphs +mksession +scrollbind -xfontset
-dnd +modify_fname +signs -xim
-ebcdic +mouse +smartindent -xsmp
+emacs_tags -mouseshape +startuptime -xterm_clipboard
+eval +mouse_dec +statusline -xterm_save
+ex_extra +mouse_gpm -sun_workshop -xpm
+extra_search -mouse_jsbterm +syntax
システム vimrc: "$VIM/vimrc"
ユーザー vimrc: "$HOME/.vimrc"
第2ユーザー vimrc: "~/.vim/vimrc"
ユーザー exrc: "$HOME/.exrc"
省略時の $VIM: "/usr/share/vim"
コンパイル: gcc -c -I. -Iproto -DHAVE_CONFIG_H -Wdate-time -g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
リンク: gcc -Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -o vim -lm -ltinfo -lnsl -lselinux -lacl -lattr -lgpm -ldl -L/usr/lib/python3.5/config-3.5m-x86_64-linux-gnu -lpython3.5m -lpthread -ldl -lutil -lm







vim-athena



vim-athena01.png
日本語化はされている。

詳細情報を確認してみる。
$ vim.athena --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Nov 24 2016 16:44:48)
適用済パッチ: 1-1689
追加拡張パッチ: 8.0.0056
Modified by pkg-vim-maintainers@lists.alioth.debian.org
Compiled by pkg-vim-maintainers@lists.alioth.debian.org
Huge 版 with X11-Athena GUI. 機能の一覧 有効(+)/無効(-)
+acl +farsi +mouse_netterm +tag_binary
+arabic +file_in_path +mouse_sgr +tag_old_static
+autocmd +find_in_path -mouse_sysmouse -tag_any_white
+balloon_eval +float +mouse_urxvt +tcl
+browse +folding +mouse_xterm +terminfo
++builtin_terms -footer +multi_byte +termresponse
+byte_offset +fork() +multi_lang +textobjects
+channel +gettext -mzscheme +timers
+cindent -hangul_input +netbeans_intg +title
+clientserver +iconv +packages +toolbar
+clipboard +insert_expand +path_extra +user_commands
+cmdline_compl +job +perl +vertsplit
+cmdline_hist +jumplist +persistent_undo +virtualedit
+cmdline_info +keymap +postscript +visual
+comments +langmap +printer +visualextra
+conceal +libcall +profile +viminfo
+cryptv +linebreak -python +vreplace
+cscope +lispindent +python3 +wildignore
+cursorbind +listcmds +quickfix +wildmenu
+cursorshape +localmap +reltime +windows
+dialog_con_gui +lua +rightleft +writebackup
+diff +menu +ruby +X11
+digraphs +mksession +scrollbind +xfontset
-dnd +modify_fname +signs +xim
-ebcdic +mouse +smartindent +xsmp_interact
+emacs_tags +mouseshape +startuptime +xterm_clipboard
+eval +mouse_dec +statusline -xterm_save
+ex_extra +mouse_gpm -sun_workshop +xpm
+extra_search -mouse_jsbterm +syntax
システム vimrc: "$VIM/vimrc"
ユーザー vimrc: "$HOME/.vimrc"
第2ユーザー vimrc: "~/.vim/vimrc"
ユーザー exrc: "$HOME/.exrc"
システム gvimrc: "$VIM/gvimrc"
ユーザー gvimrc: "$HOME/.gvimrc"
第2ユーザー gvimrc: "~/.vim/gvimrc"
システムメニュー: "$VIMRUNTIME/menu.vim"
省略時の $VIM: "/usr/share/vim"
コンパイル: gcc -c -I. -Iproto -DHAVE_CONFIG_H -DFEAT_GUI_ATHENA -Wdate-time -g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
リンク: gcc -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -fstack-protector -rdynamic -Wl,-export-dynamic -Wl,-E -Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -o vim -lXaw -lXmu -lXext -lXt -lSM -lICE -lXpm -lXt -lX11 -lXdmcp -lSM -lICE -ldl -lm -ltinfo -lnsl -lselinux -lacl -lattr -lgpm -ldl -L/usr/lib -llua5.2 -Wl,-E -fstack-protector-strong -L/usr/local/lib -L/usr/lib/x86_64-linux-gnu/perl/5.22/CORE -lperl -ldl -lm -lpthread -lcrypt -L/usr/lib/python3.5/config-3.5m-x86_64-linux-gnu -lpython3.5m -lpthread -ldl -lutil -lm -L/usr/lib/x86_64-linux-gnu -ltcl8.6 -ldl -lz -lpthread -lieee -lm -lruby-2.3 -lpthread -lgmp -ldl -lcrypt -lm


X11-Athena GUI付き。Xawかな。

「vim」のGUI版は「gVim」
vim-athena02.png

文字化けがあるが、それより気になるのはGUIとして、いまいち美しくない。
vim-athena03.png





vim-gtk


vim-gtk01.png
日本語化はされている。

詳細情報を確認してみる。
$ vim.gtk --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Nov 24 2016 16:44:48)
適用済パッチ: 1-1689
追加拡張パッチ: 8.0.0056
Modified by pkg-vim-maintainers@lists.alioth.debian.org
Compiled by pkg-vim-maintainers@lists.alioth.debian.org
Huge 版 with GTK2 GUI. 機能の一覧 有効(+)/無効(-)
+acl +farsi +mouse_netterm +tag_binary
+arabic +file_in_path +mouse_sgr +tag_old_static
+autocmd +find_in_path -mouse_sysmouse -tag_any_white
+balloon_eval +float +mouse_urxvt +tcl
+browse +folding +mouse_xterm +terminfo
++builtin_terms -footer +multi_byte +termresponse
+byte_offset +fork() +multi_lang +textobjects
+channel +gettext -mzscheme +timers
+cindent -hangul_input +netbeans_intg +title
+clientserver +iconv +packages +toolbar
+clipboard +insert_expand +path_extra +user_commands
+cmdline_compl +job +perl +vertsplit
+cmdline_hist +jumplist +persistent_undo +virtualedit
+cmdline_info +keymap +postscript +visual
+comments +langmap +printer +visualextra
+conceal +libcall +profile +viminfo
+cryptv +linebreak -python +vreplace
+cscope +lispindent +python3 +wildignore
+cursorbind +listcmds +quickfix +wildmenu
+cursorshape +localmap +reltime +windows
+dialog_con_gui +lua +rightleft +writebackup
+diff +menu +ruby +X11
+digraphs +mksession +scrollbind -xfontset
+dnd +modify_fname +signs +xim
-ebcdic +mouse +smartindent +xsmp_interact
+emacs_tags +mouseshape +startuptime +xterm_clipboard
+eval +mouse_dec +statusline -xterm_save
+ex_extra +mouse_gpm -sun_workshop +xpm
+extra_search -mouse_jsbterm +syntax
システム vimrc: "$VIM/vimrc"
ユーザー vimrc: "$HOME/.vimrc"
第2ユーザー vimrc: "~/.vim/vimrc"
ユーザー exrc: "$HOME/.exrc"
システム gvimrc: "$VIM/gvimrc"
ユーザー gvimrc: "$HOME/.gvimrc"
第2ユーザー gvimrc: "~/.vim/gvimrc"
システムメニュー: "$VIMRUNTIME/menu.vim"
省略時の $VIM: "/usr/share/vim"
コンパイル: gcc -c -I. -Iproto -DHAVE_CONFIG_H -DFEAT_GUI_GTK -pthread -I/usr/include/gtk-2.0 -I/usr/lib/x86_64-linux-gnu/gtk-2.0/include -I/usr/include/gio-unix-2.0/ -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/libpng12 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/libpng12 -I/usr/include/pango-1.0 -I/usr/include/harfbuzz -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/freetype2 -Wdate-time -g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
リンク: gcc -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -fstack-protector -rdynamic -Wl,-export-dynamic -Wl,-E -Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -o vim -lgtk-x11-2.0 -lgdk-x11-2.0 -lpangocairo-1.0 -latk-1.0 -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lpangoft2-1.0 -lpango-1.0 -lgobject-2.0 -lglib-2.0 -lfontconfig -lfreetype -lSM -lICE -lXpm -lXt -lX11 -lXdmcp -lSM -lICE -lm -ltinfo -lnsl -lselinux -lacl -lattr -lgpm -ldl -L/usr/lib -llua5.2 -Wl,-E -fstack-protector-strong -L/usr/local/lib -L/usr/lib/x86_64-linux-gnu/perl/5.22/CORE -lperl -ldl -lm -lpthread -lcrypt -L/usr/lib/python3.5/config-3.5m-x86_64-linux-gnu -lpython3.5m -lpthread -ldl -lutil -lm -L/usr/lib/x86_64-linux-gnu -ltcl8.6 -ldl -lz -lpthread -lieee -lm -lruby-2.3 -lpthread -lgmp -ldl -lcrypt -lm

GTK2 GUI付き。

「gVim」。
vim-gtk02.png





vim-gtk3


vim-gtk301.png
日本語化はされている。

詳細情報を確認してみる。
$ vim.gtk3 --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Nov 24 2016 16:44:48)
適用済パッチ: 1-1689
追加拡張パッチ: 8.0.0056
Modified by pkg-vim-maintainers@lists.alioth.debian.org
Compiled by pkg-vim-maintainers@lists.alioth.debian.org
Huge 版 with GTK3 GUI. 機能の一覧 有効(+)/無効(-)
+acl +farsi +mouse_netterm +tag_binary
+arabic +file_in_path +mouse_sgr +tag_old_static
+autocmd +find_in_path -mouse_sysmouse -tag_any_white
+balloon_eval +float +mouse_urxvt +tcl
+browse +folding +mouse_xterm +terminfo
++builtin_terms -footer +multi_byte +termresponse
+byte_offset +fork() +multi_lang +textobjects
+channel +gettext -mzscheme +timers
+cindent -hangul_input +netbeans_intg +title
+clientserver +iconv +packages +toolbar
+clipboard +insert_expand +path_extra +user_commands
+cmdline_compl +job +perl +vertsplit
+cmdline_hist +jumplist +persistent_undo +virtualedit
+cmdline_info +keymap +postscript +visual
+comments +langmap +printer +visualextra
+conceal +libcall +profile +viminfo
+cryptv +linebreak -python +vreplace
+cscope +lispindent +python3 +wildignore
+cursorbind +listcmds +quickfix +wildmenu
+cursorshape +localmap +reltime +windows
+dialog_con_gui +lua +rightleft +writebackup
+diff +menu +ruby +X11
+digraphs +mksession +scrollbind -xfontset
+dnd +modify_fname +signs +xim
-ebcdic +mouse +smartindent +xsmp_interact
+emacs_tags +mouseshape +startuptime +xterm_clipboard
+eval +mouse_dec +statusline -xterm_save
+ex_extra +mouse_gpm -sun_workshop +xpm
+extra_search -mouse_jsbterm +syntax
システム vimrc: "$VIM/vimrc"
ユーザー vimrc: "$HOME/.vimrc"
第2ユーザー vimrc: "~/.vim/vimrc"
ユーザー exrc: "$HOME/.exrc"
システム gvimrc: "$VIM/gvimrc"
ユーザー gvimrc: "$HOME/.gvimrc"
第2ユーザー gvimrc: "~/.vim/gvimrc"
システムメニュー: "$VIMRUNTIME/menu.vim"
省略時の $VIM: "/usr/share/vim"
コンパイル: gcc -c -I. -Iproto -DHAVE_CONFIG_H -DFEAT_GUI_GTK -pthread -I/usr/include/gtk-3.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -I/usr/include/gtk-3.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/mirclient -I/usr/include/mircommon -I/usr/include/mircookie -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/harfbuzz -I/usr/include/pango-1.0 -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/libpng12 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -Wdate-time -g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
リンク: gcc -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -fstack-protector -rdynamic -Wl,-export-dynamic -Wl,-E -Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -o vim -lgtk-3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -lSM -lICE -lXpm -lXt -lX11 -lXdmcp -lSM -lICE -lm -ltinfo -lnsl -lselinux -lacl -lattr -lgpm -ldl -L/usr/lib -llua5.2 -Wl,-E -fstack-protector-strong -L/usr/local/lib -L/usr/lib/x86_64-linux-gnu/perl/5.22/CORE -lperl -ldl -lm -lpthread -lcrypt -L/usr/lib/python3.5/config-3.5m-x86_64-linux-gnu -lpython3.5m -lpthread -ldl -lutil -lm -L/usr/lib/x86_64-linux-gnu -ltcl8.6 -ldl -lz -lpthread -lieee -lm -lruby-2.3 -lpthread -lgmp -ldl -lcrypt -lm

GTK3 GUI付き。

「gVim」。
vim-gtk302.png





vim-gnome


vim-gnome01.png
日本語化はされている。

詳細情報を確認してみる。
$ vim.gnome --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Nov 24 2016 16:44:48)
適用済パッチ: 1-1689
追加拡張パッチ: 8.0.0056
Modified by pkg-vim-maintainers@lists.alioth.debian.org
Compiled by pkg-vim-maintainers@lists.alioth.debian.org
Huge 版 with GTK2-GNOME GUI. 機能の一覧 有効(+)/無効(-)
+acl +farsi +mouse_netterm +tag_binary
+arabic +file_in_path +mouse_sgr +tag_old_static
+autocmd +find_in_path -mouse_sysmouse -tag_any_white
+balloon_eval +float +mouse_urxvt +tcl
+browse +folding +mouse_xterm +terminfo
++builtin_terms -footer +multi_byte +termresponse
+byte_offset +fork() +multi_lang +textobjects
+channel +gettext -mzscheme +timers
+cindent -hangul_input +netbeans_intg +title
+clientserver +iconv +packages +toolbar
+clipboard +insert_expand +path_extra +user_commands
+cmdline_compl +job +perl +vertsplit
+cmdline_hist +jumplist +persistent_undo +virtualedit
+cmdline_info +keymap +postscript +visual
+comments +langmap +printer +visualextra
+conceal +libcall +profile +viminfo
+cryptv +linebreak -python +vreplace
+cscope +lispindent +python3 +wildignore
+cursorbind +listcmds +quickfix +wildmenu
+cursorshape +localmap +reltime +windows
+dialog_con_gui +lua +rightleft +writebackup
+diff +menu +ruby +X11
+digraphs +mksession +scrollbind -xfontset
+dnd +modify_fname +signs +xim
-ebcdic +mouse +smartindent +xsmp_interact
+emacs_tags +mouseshape +startuptime +xterm_clipboard
+eval +mouse_dec +statusline -xterm_save
+ex_extra +mouse_gpm -sun_workshop +xpm
+extra_search -mouse_jsbterm +syntax
システム vimrc: "$VIM/vimrc"
ユーザー vimrc: "$HOME/.vimrc"
第2ユーザー vimrc: "~/.vim/vimrc"
ユーザー exrc: "$HOME/.exrc"
システム gvimrc: "$VIM/gvimrc"
ユーザー gvimrc: "$HOME/.gvimrc"
第2ユーザー gvimrc: "~/.vim/gvimrc"
システムメニュー: "$VIMRUNTIME/menu.vim"
省略時の $VIM: "/usr/share/vim"
コンパイル: gcc -c -I. -Iproto -DHAVE_CONFIG_H -DFEAT_GUI_GTK -pthread -I/usr/include/gtk-2.0 -I/usr/lib/x86_64-linux-gnu/gtk-2.0/include -I/usr/include/gio-unix-2.0/ -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/libpng12 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/libpng12 -I/usr/include/pango-1.0 -I/usr/include/harfbuzz -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/freetype2 -D_REENTRANT -DORBIT2=1 -pthread -I/usr/include/libgnomeui-2.0 -I/usr/include/gnome-keyring-1 -I/usr/include/libbonoboui-2.0 -I/usr/include/libxml2 -I/usr/include/libgnome-2.0 -I/usr/include/libbonobo-2.0 -I/usr/include/bonobo-activation-2.0 -I/usr/include/orbit-2.0 -I/usr/include/libgnomecanvas-2.0 -I/usr/include/gail-1.0 -I/usr/include/libart-2.0 -I/usr/include/gtk-2.0 -I/usr/lib/x86_64-linux-gnu/gtk-2.0/include -I/usr/include/gio-unix-2.0/ -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/libpng12 -I/usr/include/pango-1.0 -I/usr/include/harfbuzz -I/usr/include/pango-1.0 -I/usr/include/freetype2 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/libpng12 -I/usr/include/gnome-vfs-2.0 -I/usr/lib/x86_64-linux-gnu/gnome-vfs-2.0/include -I/usr/include/gconf/2 -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -Wdate-time -g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
リンク: gcc -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -fstack-protector -rdynamic -Wl,-export-dynamic -Wl,-E -Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -o vim -lgtk-x11-2.0 -lgdk-x11-2.0 -lpangocairo-1.0 -latk-1.0 -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lpangoft2-1.0 -lpango-1.0 -lgobject-2.0 -lglib-2.0 -lfontconfig -lfreetype -lgnomeui-2 -lSM -lICE -lbonoboui-2 -lgnome-2 -lpopt -lbonobo-2 -lbonobo-activation -lORBit-2 -lgnomecanvas-2 -lart_lgpl_2 -lgtk-x11-2.0 -lgdk-x11-2.0 -lpangocairo-1.0 -latk-1.0 -lcairo -lgio-2.0 -lpangoft2-1.0 -lpango-1.0 -lfontconfig -lfreetype -lgdk_pixbuf-2.0 -lgnomevfs-2 -lgconf-2 -lgthread-2.0 -lgmodule-2.0 -lgobject-2.0 -lglib-2.0 -lSM -lICE -lXpm -lXt -lX11 -lXdmcp -lSM -lICE -lm -ltinfo -lnsl -lselinux -lacl -lattr -lgpm -ldl -L/usr/lib -llua5.2 -Wl,-E -fstack-protector-strong -L/usr/local/lib -L/usr/lib/x86_64-linux-gnu/perl/5.22/CORE -lperl -ldl -lm -lpthread -lcrypt -L/usr/lib/python3.5/config-3.5m-x86_64-linux-gnu -lpython3.5m -lpthread -ldl -lutil -lm -L/usr/lib/x86_64-linux-gnu -ltcl8.6 -ldl -lz -lpthread -lieee -lm -lruby-2.3 -lpthread -lgmp -ldl -lcrypt -lm

GTK2-GNOME GUI付き。

「gVim」。
vim-gnome02.png





vim-nox


vim-nox01.png
日本語化はされている。

詳細情報を確認してみる。
$ vim.nox --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Nov 24 2016 16:44:48)
適用済パッチ: 1-1689
追加拡張パッチ: 8.0.0056
Modified by pkg-vim-maintainers@lists.alioth.debian.org
Compiled by pkg-vim-maintainers@lists.alioth.debian.org
Huge 版 without GUI. 機能の一覧 有効(+)/無効(-)
+acl +farsi +mouse_netterm +tag_binary
+arabic +file_in_path +mouse_sgr +tag_old_static
+autocmd +find_in_path -mouse_sysmouse -tag_any_white
-balloon_eval +float +mouse_urxvt +tcl
-browse +folding +mouse_xterm +terminfo
++builtin_terms -footer +multi_byte +termresponse
+byte_offset +fork() +multi_lang +textobjects
+channel +gettext -mzscheme +timers
+cindent -hangul_input +netbeans_intg +title
-clientserver +iconv +packages -toolbar
-clipboard +insert_expand +path_extra +user_commands
+cmdline_compl +job +perl +vertsplit
+cmdline_hist +jumplist +persistent_undo +virtualedit
+cmdline_info +keymap +postscript +visual
+comments +langmap +printer +visualextra
+conceal +libcall +profile +viminfo
+cryptv +linebreak -python +vreplace
+cscope +lispindent +python3 +wildignore
+cursorbind +listcmds +quickfix +wildmenu
+cursorshape +localmap +reltime +windows
+dialog_con +lua +rightleft +writebackup
+diff +menu +ruby -X11
+digraphs +mksession +scrollbind -xfontset
-dnd +modify_fname +signs -xim
-ebcdic +mouse +smartindent -xsmp
+emacs_tags -mouseshape +startuptime -xterm_clipboard
+eval +mouse_dec +statusline -xterm_save
+ex_extra +mouse_gpm -sun_workshop -xpm
+extra_search -mouse_jsbterm +syntax
システム vimrc: "$VIM/vimrc"
ユーザー vimrc: "$HOME/.vimrc"
第2ユーザー vimrc: "~/.vim/vimrc"
ユーザー exrc: "$HOME/.exrc"
省略時の $VIM: "/usr/share/vim"
コンパイル: gcc -c -I. -Iproto -DHAVE_CONFIG_H -Wdate-time -g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
リンク: gcc -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -fstack-protector -rdynamic -Wl,-export-dynamic -Wl,-E -Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -o vim -lm -ltinfo -lnsl -lselinux -lacl -lattr -lgpm -ldl -L/usr/lib -llua5.2 -Wl,-E -fstack-protector-strong -L/usr/local/lib -L/usr/lib/x86_64-linux-gnu/perl/5.22/CORE -lperl -ldl -lm -lpthread -lcrypt -L/usr/lib/python3.5/config-3.5m-x86_64-linux-gnu -lpython3.5m -lpthread -ldl -lutil -lm -L/usr/lib/x86_64-linux-gnu -ltcl8.6 -ldl -lz -lpthread -lieee -lm -lruby-2.3 -lpthread -lgmp -ldl -lcrypt -lm

GUI無し。




機能の違い


「vim」機能が決定される方法のひとつとして、コンパイル時に指定する方法。
指定しなければ、"normal"となる。

タイプ説明vimの種類
tiny多くの機能を無効にしてコンパイル-
small一部の機能を無効にしてコンパイルvim-tiny
big多くの機能を有効にしてコンパイル-
hugeほとんどの機能を有効にしてコンパイルvim
vim-gnome
vim-athena
vim-gtk
vim-gtk3
vim-nox

どのような機能が含まれるかは、feature-list を参照。

GUI版「gVim」の有無
タイプvimの種類
GUI無しvim-tiny
vim
vim-nox
GUI有りvim-gnome
vim-athena
vim-gtk
vim-gtk3



機能比較(「vim-tiny」は機能が限定的なので除く)
少数派の機能設定をマーキング。
"GUI無し版"内で設定が異なる
"GUI有り版"内で設定が異なる
"GUI無し版"と"GUI有り版"で設定が異なる
種類機能
vim
+acl             +farsi           +mouse_netterm   +tag_binary
+arabic +file_in_path +mouse_sgr +tag_old_static
+autocmd +find_in_path -mouse_sysmouse -tag_any_white
-balloon_eval +float +mouse_urxvt -tcl
-browse +folding +mouse_xterm +terminfo
++builtin_terms -footer +multi_byte +termresponse
+byte_offset +fork() +multi_lang +textobjects
+channel +gettext -mzscheme +timers
+cindent -hangul_input +netbeans_intg +title
-clientserver +iconv +packages -toolbar
-clipboard +insert_expand +path_extra +user_commands
+cmdline_compl +job -perl +vertsplit
+cmdline_hist +jumplist +persistent_undo +virtualedit
+cmdline_info +keymap +postscript +visual
+comments +langmap +printer +visualextra
+conceal +libcall +profile +viminfo
+cryptv +linebreak -python +vreplace
+cscope +lispindent +python3 +wildignore
+cursorbind +listcmds +quickfix +wildmenu
+cursorshape +localmap +reltime +windows
+dialog_con -lua +rightleft +writebackup
+diff +menu -ruby -X11
+digraphs +mksession +scrollbind -xfontset
-dnd +modify_fname +signs -xim
-ebcdic +mouse +smartindent -xsmp
+emacs_tags -mouseshape +startuptime -xterm_clipboard
+eval +mouse_dec +statusline -xterm_save
+ex_extra +mouse_gpm -sun_workshop -xpm
+extra_search -mouse_jsbterm +syntax
vim-nox
+acl             +farsi           +mouse_netterm   +tag_binary
+arabic +file_in_path +mouse_sgr +tag_old_static
+autocmd +find_in_path -mouse_sysmouse -tag_any_white
-balloon_eval +float +mouse_urxvt +tcl
-browse +folding +mouse_xterm +terminfo
++builtin_terms -footer +multi_byte +termresponse
+byte_offset +fork() +multi_lang +textobjects
+channel +gettext -mzscheme +timers
+cindent -hangul_input +netbeans_intg +title
-clientserver +iconv +packages -toolbar
-clipboard +insert_expand +path_extra +user_commands
+cmdline_compl +job +perl +vertsplit
+cmdline_hist +jumplist +persistent_undo +virtualedit
+cmdline_info +keymap +postscript +visual
+comments +langmap +printer +visualextra
+conceal +libcall +profile +viminfo
+cryptv +linebreak -python +vreplace
+cscope +lispindent +python3 +wildignore
+cursorbind +listcmds +quickfix +wildmenu
+cursorshape +localmap +reltime +windows
+dialog_con +lua +rightleft +writebackup
+diff +menu +ruby -X11
+digraphs +mksession +scrollbind -xfontset
-dnd +modify_fname +signs -xim
-ebcdic +mouse +smartindent -xsmp
+emacs_tags -mouseshape +startuptime -xterm_clipboard
+eval +mouse_dec +statusline -xterm_save
+ex_extra +mouse_gpm -sun_workshop -xpm
+extra_search -mouse_jsbterm +syntax
vim-athena
+acl             +farsi           +mouse_netterm   +tag_binary
+arabic +file_in_path +mouse_sgr +tag_old_static
+autocmd +find_in_path -mouse_sysmouse -tag_any_white
+balloon_eval +float +mouse_urxvt +tcl
+browse +folding +mouse_xterm +terminfo
++builtin_terms -footer +multi_byte +termresponse
+byte_offset +fork() +multi_lang +textobjects
+channel +gettext -mzscheme +timers
+cindent -hangul_input +netbeans_intg +title
+clientserver +iconv +packages +toolbar
+clipboard +insert_expand +path_extra +user_commands
+cmdline_compl +job +perl +vertsplit
+cmdline_hist +jumplist +persistent_undo +virtualedit
+cmdline_info +keymap +postscript +visual
+comments +langmap +printer +visualextra
+conceal +libcall +profile +viminfo
+cryptv +linebreak -python +vreplace
+cscope +lispindent +python3 +wildignore
+cursorbind +listcmds +quickfix +wildmenu
+cursorshape +localmap +reltime +windows
+dialog_con_gui +lua +rightleft +writebackup
+diff +menu +ruby +X11
+digraphs +mksession +scrollbind +xfontset
-dnd +modify_fname +signs +xim
-ebcdic +mouse +smartindent +xsmp_interact
+emacs_tags +mouseshape +startuptime +xterm_clipboard
+eval +mouse_dec +statusline -xterm_save
+ex_extra +mouse_gpm -sun_workshop +xpm
+extra_search -mouse_jsbterm +syntax
vim-gtk
+acl             +farsi           +mouse_netterm   +tag_binary
+arabic +file_in_path +mouse_sgr +tag_old_static
+autocmd +find_in_path -mouse_sysmouse -tag_any_white
+balloon_eval +float +mouse_urxvt +tcl
+browse +folding +mouse_xterm +terminfo
++builtin_terms -footer +multi_byte +termresponse
+byte_offset +fork() +multi_lang +textobjects
+channel +gettext -mzscheme +timers
+cindent -hangul_input +netbeans_intg +title
+clientserver +iconv +packages +toolbar
+clipboard +insert_expand +path_extra +user_commands
+cmdline_compl +job +perl +vertsplit
+cmdline_hist +jumplist +persistent_undo +virtualedit
+cmdline_info +keymap +postscript +visual
+comments +langmap +printer +visualextra
+conceal +libcall +profile +viminfo
+cryptv +linebreak -python +vreplace
+cscope +lispindent +python3 +wildignore
+cursorbind +listcmds +quickfix +wildmenu
+cursorshape +localmap +reltime +windows
+dialog_con_gui +lua +rightleft +writebackup
+diff +menu +ruby +X11
+digraphs +mksession +scrollbind -xfontset
+dnd +modify_fname +signs +xim
-ebcdic +mouse +smartindent +xsmp_interact
+emacs_tags +mouseshape +startuptime +xterm_clipboard
+eval +mouse_dec +statusline -xterm_save
+ex_extra +mouse_gpm -sun_workshop +xpm
+extra_search -mouse_jsbterm +syntax
vim-gtk3
+acl             +farsi           +mouse_netterm   +tag_binary
+arabic +file_in_path +mouse_sgr +tag_old_static
+autocmd +find_in_path -mouse_sysmouse -tag_any_white
+balloon_eval +float +mouse_urxvt +tcl
+browse +folding +mouse_xterm +terminfo
++builtin_terms -footer +multi_byte +termresponse
+byte_offset +fork() +multi_lang +textobjects
+channel +gettext -mzscheme +timers
+cindent -hangul_input +netbeans_intg +title
+clientserver +iconv +packages +toolbar
+clipboard +insert_expand +path_extra +user_commands
+cmdline_compl +job +perl +vertsplit
+cmdline_hist +jumplist +persistent_undo +virtualedit
+cmdline_info +keymap +postscript +visual
+comments +langmap +printer +visualextra
+conceal +libcall +profile +viminfo
+cryptv +linebreak -python +vreplace
+cscope +lispindent +python3 +wildignore
+cursorbind +listcmds +quickfix +wildmenu
+cursorshape +localmap +reltime +windows
+dialog_con_gui +lua +rightleft +writebackup
+diff +menu +ruby +X11
+digraphs +mksession +scrollbind -xfontset
+dnd +modify_fname +signs +xim
-ebcdic +mouse +smartindent +xsmp_interact
+emacs_tags +mouseshape +startuptime +xterm_clipboard
+eval +mouse_dec +statusline -xterm_save
+ex_extra +mouse_gpm -sun_workshop +xpm
+extra_search -mouse_jsbterm +syntax
vim-gnome
+acl             +farsi           +mouse_netterm   +tag_binary
+arabic +file_in_path +mouse_sgr +tag_old_static
+autocmd +find_in_path -mouse_sysmouse -tag_any_white
+balloon_eval +float +mouse_urxvt +tcl
+browse +folding +mouse_xterm +terminfo
++builtin_terms -footer +multi_byte +termresponse
+byte_offset +fork() +multi_lang +textobjects
+channel +gettext -mzscheme +timers
+cindent -hangul_input +netbeans_intg +title
+clientserver +iconv +packages +toolbar
+clipboard +insert_expand +path_extra +user_commands
+cmdline_compl +job +perl +vertsplit
+cmdline_hist +jumplist +persistent_undo +virtualedit
+cmdline_info +keymap +postscript +visual
+comments +langmap +printer +visualextra
+conceal +libcall +profile +viminfo
+cryptv +linebreak -python +vreplace
+cscope +lispindent +python3 +wildignore
+cursorbind +listcmds +quickfix +wildmenu
+cursorshape +localmap +reltime +windows
+dialog_con_gui +lua +rightleft +writebackup
+diff +menu +ruby +X11
+digraphs +mksession +scrollbind -xfontset
+dnd +modify_fname +signs +xim
-ebcdic +mouse +smartindent +xsmp_interact
+emacs_tags +mouseshape +startuptime +xterm_clipboard
+eval +mouse_dec +statusline -xterm_save
+ex_extra +mouse_gpm -sun_workshop +xpm
+extra_search -mouse_jsbterm +syntax


依存するライブラリが異なる違いはあるが「vim-gtk」「vim-gtk3」「vim-gnome」は機能設定としては違いがない。



まとめ


結局、どれをインストールするのかと言うと、「vim」と他のアプリとでクリップボード連携が必要であれば、GUI付きを選ぶしかない(clipboard機能)。
もしストレージの容量がかつかつで、インストール時の容量が気になるのであれば、容量を優先して標準の「vim-tiny」のままでよいだろう。
それ以外は、機能設定として多数派にあたる「vim-gtk」「vim-gtk3」「vim-gnome」のどれか。ウィンドウマネージャがgnomeなら「vim-gnome」、それ以外なら「vim-gtk」「vim-gtk3」。どのGUIが好みかで決定すればよい。『SSH接続がほとんどで、GUIエディタ「gVim」は必要ない』としても大は小を兼ねるの方針でこの3つから選べばよいだろう。
posted by Zorinos at 23:00| Comment(0) | Linux | 更新情報をチェックする

2017年06月29日

git 変更を一時的に退避 stash

git でチェックアウトすると作業ツリーが変更される。

機能追加を行うために、ブランチを切って、チェックアウトして作業していたら、
作業優先度が高いバグ修正を依頼された、という状況はよくある。
機能追加を行っていた作業は、まだ中途半端。一旦、コミットしても良いが、確実に不要となるコミットになってしまう。

このような場合どうするか?

力技でいくなら、機能追加で使っている作業ツリーとは別に、新たなリポジトリを作って別の作業ツリーを用意して、その場所でバグ修正を行うという手もある。
が、簡単な作業ですぐに割り込み作業が終わるなら大丈夫だろう。しかし、もし、いろいろと作業があり過ぎて、頭が朦朧とした状態になり、間違った作業ツリーを更新してしまうかもしれない。そうなると元に戻すのに無駄な時間と労力を使うことになるかもしれない。ヒューマンエラーの温床になるかもしれない。

せっかく git を使っているので、git の能力をもっと活用してスマートに対応したい。





現在の作業を一時的に退避


"new_branch" ブランチで作業していて、別の作業が発生した。
現在の作業(作業ツリーも、ステージングエリアも)を退避する。

$ git stash save

または、"save" を省略して

$ git stash

stashの目印としてメッセージを付与することも可能。

$ git stash save "message"

メッセージをつけておくことで作業を再開するときにわかりやすい。



statusを確認してみる。
$ git status
On branch new_branch
nothing to commit, working directory clean

作業ツリー上には、更新状態の差分が無い状態になった。

git_stash01.png





退避した内容を確認する


$ git stash list

stash@{0}: WIP on new_branch: 44470bb new_branch 追加2
stash@{1}: On new_branch: stash確認2
stash@{2}: On new_branch: stash確認

この場合、stash には3つの変更が保存されていることがわかる(上が新しい保存)。

stash操作時に、メッセージを付与しなかった場合は、
: WIP on <stashしたブランチ>: <親コミットのハッシュ> <コミットコメント> となり、
メッセージを付与した場合は、
: On <stashしたブランチ>: <メッセージ> となる。

変更が保存されていれば安心。他のブランチをチェックアウトして作業できる。




退避した作業を復元する


最新のstash(stash@{0})を復元するには、

$ git stash pop

$ git status
On branch new_branch
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)

modified: index.html

no changes added to commit (use "git add" and/or "git commit -a")

変更内容が復元できた。

stash のリストを確認すると、
$ git stash list
stash@{0}: On new_branch: stash確認2
stash@{1}: On new_branch: stash確認

3つあったリストが2つに減っている。


"git stash pop" を行うと、復元したstashは削除されることに注意。
git_stash02.png


最新(stash@{0})以外の内容を復元するには、stash名を指定する。

$ git stash pop stash@{1}




stashした中身を確認したいときなど、復元するが stash からは削除したくない(残しておきたい)ときには、"pop" の代わりに "apply" を使う。

$ git stash apply

最新(stash@{0})以外の場合は、同様にstash名を指定すればよい。

$ git stash apply stash@{1}







退避した内容を削除する


"git stash apply" は復元後に、stashに残ったままになる。
個別にstash内容を削除するには、"drop" を使う。

$ git stash drop stash@{1}

stash名を指定しなければ、最新(stash@{0})が削除される。

$ git stash drop



stashを全削除する場合は、

$ git stash clear



不要なstashを残したままにすると、どれが必要なものなのかわからなくなり、無駄な労力が発生するのでこまめに整理すること。






ステージングエリアの内容の復元について


ステージングエリアの内容を退避し、復元する場合、
"--index" オプションを指定しないとステージングエリアに復元されないことに注意。

$ git stash pop stash@{0} --index

※"pop" でも "apply" でも同じ。




ファイルを追加した場合の退避について


作業ツリー上でファイルを追加した状態の場合、このままstash しても追加ファイルはgit管理下ではなってないので、退避されないことに注意。
中途半端な状態でファイルが残ったままとなるので、以降の作業で邪魔になったり、退避したものだと勘違いし削除してしまうと復元ができない。

ファイルを追加した場合は、stash する前に、ステージングエリアに移動させて、git管理下に置いてから、stash すること。



または、"-u" オプションをつけると追跡していないファイルも退避してくれるので、
ステージエリアに移動させなくても、追加ファイルを stash できる。

$ git stash -u








違うブランチで間違って作業をしていたとき


作業をしていてコミットしようとしたら、違うブランチで作業していたことに気づいてしまったようなシチュエーションでも、stash は使える。
一旦、stash して、目的とするブランチへ切り替えてから復元する。
stash にはこのような使い方もできる。






まとめ


割り込み的な作業を行わず、集中して作業できると良いが、うまくいかないこともあるので、切り替えながら進めないといけないこともしばしば。そのような場合に、目の前の作業をきれいに切り替えることで、すっぱりと頭の切り替えにもなる stash は便利。git の便利な機能をうまく使って、ヒューマンエラーを起こさないように、効率よく作業を進めたい。


gitをインストール
gitサーバーのセットアップ
git ブランチについて
git ブランチを合流するマージ
git ブランチを付け替える
git コミット履歴を変更する
git コミットを取り消す
git 変更をリセットする
git リモートでの操作
git ファイルの追跡
git リリース準備
git リモートブランチを追加
git チェックアウトをもっと便利に使う
git プロジェクトの構成
git 変更をpatchファイルにする
git コンフリクトに対処する
git 失敗したときの復元
posted by Zorinos at 20:00| Comment(0) | Linux | 更新情報をチェックする