git初心者向け練習
初心者向けgitの使い方練習をまとめた
概要
の二人で共同編集しながら論文(最終版 https://github.com/niitsumatmp/tex-example/blob/master/1.tex )を完成させるまでの手順を説明していく。
この手順と同じ事を自分自身でも行うことでgitの使い方の概要がわかるようになっている。
最終的には以下のような履歴ができる
この履歴は学生と教師の二人で平行して行っていくため、下図のようなネットワークになる
- 更新履歴のネットワーク図 https://github.com/niitsumatmp/tex-example/network
準備
gitの初期設定
Linuxの場合は
~/.gitconfig
のファイルを
[user] name = Myname email = myname@example.com
のように編集しておく。WindowsのtortoiseGitのようなGUIソフトの場合はインストール時に(同じ内容を)設定するように言われるので、言われたとおりに設定しておく。
最初の原稿を作る
最初に学生が初期バージョンの原稿を作成する。学生のフォルダに移動して原稿を作るフォルダーを作る。それから原稿のフォルダー student/paper に移動する
cd student mkdir paper cd paper
初期バージョンの原稿ファイル 1.tex を学生原稿フォルダー student/paper にダウンロードして置く
https://github.com/niitsumatmp/tex-example/tree/58f467db644f14653c4e84edf3d031422ec2f011/1.tex
具体的には以下のコマンド
cd student/paper
wget https://raw.github.com/niitsumatmp/tex-example/58f467db644f14653c4e84edf3d031422ec2f011/1.tex
をすればいい。原稿 1.tex の中身はsentenceA sentenceB sentenceC sentenceD の4つの文があるだけの簡単なもの
\documentclass{jarticle} \title{title} \author{name} \begin{document} \maketitle \section{sectiom} sentenceA sentenceB sentenceC sentenceD \end{document}
原稿をgitに登録する
学生原稿フォルダに移動して
cd student/paper
gitの初期化をする
git init
すると
student/paper/.git
というディレクトリが出来て、ここに編集履歴情報が保存されるようになる
次にgitに原稿ファイル 1.tex を登録する
git add 1.tex
今の原稿の状態を履歴データベースに "ver1"という名前で登録する
git commit -a -m "ver1"
名前 ver1 をつけておくことで、後で履歴データ一覧( https://github.com/niitsumatmp/tex-example/commits/master/1.tex )からver1を探すのが簡単となる
学生が教師に原稿を提出する
gitに登録した編集履歴と一緒に原稿を教師に提出する
cd student
tar zcf paper.tar.gz paper
のように
student/paper/.git
のgitの情報も一緒にまとめて圧縮ファイル paper.tar.gz にして電子メールで教師に送る。この練習では電子メールでの送受信は省略して、適当なフォルダ /tmp/ などにコピーすることで電子メール送受信の代用にする。
rm -Rf /tmp/paper* cp paper.tar.gz /tmp/
教師が学生の原稿を受け取る
/tmp/paper.tar.gz
に置かれたファイルを教師が受け取り、自分のフォルダに展開する
cd teacher tar zxf /tmp/paper.tar.gz cd paper
teacher/paper/1.tex ファイルを教師がさらに編集する
教師が原稿を編集する
teacher/paper/1.tex
のファイルを
https://github.com/niitsumatmp/tex-example/tree/271dc9588c28881433615281636a660cc8f83d31/1.tex
の様に編集する。具体的には
- sentenceA を sentenceA2 に変える.
- sentenceA2 の後に sentenceAA を追加する
この編集結果をファイル 1.tex として上書き保存してから"ver2"という名前をつけてgitにも保存する
git commit -a -m "ver2"
なお上書き保存しても編集前のファイルはgitの履歴一覧( https://github.com/niitsumatmp/tex-example/commits/master/1.tex )から簡単に復活できる。
その後、原稿と編集履歴情報
teacher/paper/.git
も一緒に圧縮ファイルにして電子メールに添付して学生に送る。手順は 学生が教師に原稿を提出する 場合と同様
cd teacher
tar zcf paper.tar.gz paper
cp paper.tar.gz /tmp/
学生も教師と平行して原稿の編集をする
教師が原稿
teacher/paper/1.tex
を編集している間に、学生も同時平行作業で原稿
student/paper/1.tex
ファイルの編集をしているとする(一人二役なので同時には出来ないので上記の教師の編集の後で行う)。
具体的には
https://github.com/niitsumatmp/tex-example/tree/580a05c1c93b2f70e94b5473f1916615fbfae25d/1.tex
のように
- sentenceC を sentenceC2 に変える.
編集し終わったら学生原稿のフォルダ student/paper/ で 1.tex を上書き保存して、
git commit -a -m "ver1.1"
として ver1.1という名前をつけてgitにも保存する
教師の編集結果 ver2 と学生の編集結果 ver1.1 を結合する
学生の編集結果 ver1.1
student/paper
に教師から送られてきた(ver1.1ではなくver1を編集した)ver2
/tmp/paper.tar.gz
を結合する
ver2を適当な場所に展開する
cd /tmp
tar zxf /tmp/paper.tar.gz
/tmp/paper/ に ver2 が展開される。これを ver1.1 に結合するにはver1.1のある学生原稿フォルダに移動してから
cd student/paper/
gitの結合コマンド git pull を実行する
git pull /tmp/paper
(この時、vim、nano、emacsなどの端末のデフォルト設定エディタの画面が表示される事がある。自動結合が正しくない可能性があるため、確認のためにエディタで編集しろという意味がある。しかし何も編集しないで保存して終了する。)
結合の結果、原稿ファイル
student/paper/1.tex
は
https://github.com/niitsumatmp/tex-example/tree/9bbff3d52f00935bf18cc6dec355986cb9b06668/1.tex
のようなver2と ver1.1の両方の変更が反映されたファイルになる。具体的には
- sentenceA を sentenceA2 に変えた
- sentenceA2 の後に sentenceAA を追加した
- sentenceC を sentenceC2 に変えた
この結合版をver2.1と呼ぶことにする
自動で結合出来ない場合の例
次に学生と教師の同時平行編集がコンフリクトして自動的には結合できない場合の練習をする
ver2.1を教師にも渡す
学生の結合結果ver2.1を教師にも電子メールなどで送る
学生が編集結果を教師に送信
cd student tar zcf paper.tar.gz paper rm -Rf /tmp/paper* cp paper.tar.gz /tmp/
教師が受信した結果を結合
cd /tmp tar zxf paper.tar.gz cd teacher/paper git pull /tmp/paper
教師がver2.1を編集してver3を作る
教師がver2.1の原稿
teacher/paper/1.tex
を
https://github.com/niitsumatmp/tex-example/tree/13f7fb20a5315adbb6cc8fc40905a212022959f1/1.tex
のように編集する。具体的には
- sentenceAA を sentenceAA2 に変える
- sentenceB を sentenceB2 に変える
この編集されたファイル 1.tex を上書き保存して ver3という名前でgitにも保存する
git commit -a -m "ver3"
この教師のver3を学生に送信する
cd teacher tar zcf paper.tar.gz paper rm -Rf /tmp/paper* cp paper.tar.gz /tmp/
学生がver2.1を編集してver2.2を作る
教師がver2.1を編集してver3を作る間に、平行作業で学生もver2.1を編集してver2.2を作る
student/paper/1.tex
の原稿ファイルを
https://github.com/niitsumatmp/tex-example/tree/d8beaaa85c9b102c02357ee7b37a8710d5381c88/1.tex
のようにして上書き保存する。具体的には
- sentenceA2 を sentenceA3 に変える
- sentenceAA を sentenceAA2 に変える
- sentenceB を sentenceB2 に変える
これにver2.2という名前をつけてgitにも保存する
git commit -a -m "ver2.2"
学生がver2.2に教師のver3を結合する
cd /tmp tar zxf /tmp/paper.tar.gz cd student/paper/ git pull /tmp/paper
ver3とver2.2では、どちらも同じように sentenceAA2 sentenceB2 の変更を行ったが、この様な場合は自動的に結合されずwarningが表示される。
自動結合出来ない場合は以下のような自動結合できない部分に===などの印がついたファイルとなる
https://github.com/niitsumatmp/tex-example/blob/2ecade5a09eac7e60e1da837fc0f84b4ec203a32/1.tex
\documentclass{jarticle} \title{title} \author{name} \begin{document} \maketitle \section{sectiom} <<<<<<< HEAD sentenceA3 ======= sentenceA2 >>>>>>> 13f7fb20a5315adbb6cc8fc40905a212022959f1 sentenceAA2 sentenceB2 sentenceC2 sentenceD \end{document}
これを ver3.2と呼ぶことにしよう
ver3.2を手動で編集する
ver3.2を人間が編集して以下のようにする
https://github.com/niitsumatmp/tex-example/tree/3f9e297f3dfe34778a8e760d185f4d5b778854b2/1.tex
\documentclass{jarticle} \title{title} \author{name} \begin{document} \maketitle \section{sectiom} sentenceA3 sentenceA2 sentenceAA2 sentenceB2 sentenceC2 sentenceD \end{document}
自動結合は単純な結合なので、このように人間が目で見て確認して手動編集をする事が必ず必要になる
まとめ
以上で最終原稿が出来た。これまでの作業コマンドをまとめる
nano ~/.gitconfig
[user] name = Myname email = myname@example.com
cd ~ mkdir student mkdir teacher cd student mkdir paper cd paper wget https://raw.github.com/niitsumatmp/tex-example/58f467db644f14653c4e84edf3d031422ec2f011/1.tex git init git add 1.tex git commit -a -m "ver1" cd .. tar zcf paper.tar.gz paper rm -Rf /tmp/paper* cp paper.tar.gz /tmp/ cd ../teacher tar zxf /tmp/paper.tar.gz cd paper wget https://raw.github.com/niitsumatmp/tex-example/271dc9588c28881433615281636a660cc8f83d31/1.tex git commit -a -m "ver2" cd .. tar zcf paper.tar.gz paper rm -Rf /tmp/paper* cp paper.tar.gz /tmp/ cd ../student/paper wget https://raw.github.com/niitsumatmp/tex-example/580a05c1c93b2f70e94b5473f1916615fbfae25d/1.tex git commit -a -m "ver1.1" cd /tmp tar zxf /tmp/paper.tar.gz cd ~/student/paper/ git pull /tmp/paper
ここでviの画面が表示されるが ESCキーを押してから :q と入力して抜ける
cd ~/student tar zcf paper.tar.gz paper rm -Rf /tmp/paper* cp paper.tar.gz /tmp/ cd /tmp tar zxf paper.tar.gz cd ~/teacher/paper git pull /tmp/paper wget https://raw.github.com/niitsumatmp/tex-example/13f7fb20a5315adbb6cc8fc40905a212022959f1/1.tex git commit -a -m "ver3" cd .. tar zcf paper.tar.gz paper rm -Rf /tmp/paper* cp paper.tar.gz /tmp/ cd ~/student/paper wget https://raw.github.com/niitsumatmp/tex-example/d8beaaa85c9b102c02357ee7b37a8710d5381c88/1.tex git commit -a -m "ver2.2" cd /tmp tar zxf /tmp/paper.tar.gz cd ~/student/paper/ git pull /tmp/paper
ここでviの画面が表示されるが ESCキーを押してから :q と入力して抜ける
最後に ~/student/paper/1.tex を手動で編集して終わり
githubを使う練習
参考
- git全般 http://git-scm.com/book/ja/
- emacsからgitを使う方法の解説 http://dev.ariel-networks.com/articles/emacs/part7/