git初心者向け練習

初心者向けgitの使い方練習をまとめた

概要

の二人で共同編集しながら論文(最終版 https://github.com/niitsumatmp/tex-example/blob/master/1.tex )を完成させるまでの手順を説明していく。

この手順と同じ事を自分自身でも行うことでgitの使い方の概要がわかるようになっている。

最終的には以下のような履歴ができる

この履歴は学生と教師の二人で平行して行っていくため、下図のようなネットワークになる

上側の黒線が学生の編集履歴
下側の分岐が教師の編集履歴

準備

gitの初期設定

Linuxの場合は

~/.gitconfig

のファイルを

[user]
	name = Myname
	email = myname@example.com

のように編集しておく。WindowstortoiseGitのようなGUIソフトの場合はインストール時に(同じ内容を)設定するように言われるので、言われたとおりに設定しておく。

練習用のフォルダーの準備

以下の練習では学生と教師の一人二役をする。具体的には学生と教師のフォルダーを適当な場所に分けておくことで一人二役をする。例えば以下のようにする

mkdir student
mkdir teacher

以下では学生フォルダー下のpaperフォルダーに移動することを

cd  student/paper

と略記する。教師フォルダーについても同様

最初の原稿を作る

最初に学生が初期バージョンの原稿を作成する。学生のフォルダに移動して原稿を作るフォルダーを作る。それから原稿のフォルダー 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を使う練習

以上で最終原稿が出来たので、これをグラフィカルに表示してくれるウェブサービスgithubにアップロードする。手順は

参考