非エンジニアのためのGit(バージョン管理ツール)の使い方

「非エンジニア Git 使い方」で検索したらコマンドラインの説明をされたので、勢いで書いてみた。

Gitと書いてありますが、その他のバージョン管理ツールでも出来る内容になっています。

# 対象者

 * 非エンジニア
 * Excelなどのツールは使える
 * ファイルの更新履歴ページを作成したことがある
 * ファイル名に○○ver1.1.xlsとか○○20150203.pptとかつけたことがある
 * 過去のファイルをoldフォルダに入れたことがある
 * 近くでGitを使っているエンジニアがいる

# バージョン管理ツールとは

質問です。どれが最新版でどれを使えばいいでしょう？

![スクリーンショット 2015-02-04 1.23.21.png](https://qiita-image-store.s3.amazonaws.com/0/20058/835e7ad9-d1e6-671b-a6f3-4ee4c9030c56.png)

・・・わかりません！

他にもこういうことを経験したことありませんか？

 * 以前使っていたテストユーザデータがどれか調べたい
 * 誰がこのファイルを変更したのか知りたい
 * このファイルどこが変わったのか比較したい
 * x日前のファイルに戻したい

それバージョン管理ツールで全部出来ますよ！

バージョン管理ツールとは編集されるファイルの変更履歴を管理するためのツールです。SVN/Subversion/Gitなどがそれにあたります。

# GitとGitHubを使ってみる

習うより慣れろ。いきなりですが、Gitと[GitHub](https://github.com/) [^1]を使ってみます。

~~GitHubでは、ファイルは全ユーザから見ることができるようになっています。
もし、このアップロードするファイルを見られたくない！という場合、GitHubの有料サービスを使うか、[Bitbucket](https://bitbucket.org/) [^2]のようなプライベートリポジトリ [^3] [^4]が作れるサービスを利用して下さい。~~

2019年からGitHubは無料でプライベートリポジトリ [^3] [^4]が利用できるようになりました。全ユーザから見られたくないファイルをGitHubで管理したい場合、プライベートリポジトリを利用して下さい。
もちろん、[Bitbucket](https://bitbucket.org/) [^2]のようなサービスでも引き続き、プライベートリポジトリが利用可能です。
https://github.blog/2019-01-07-new-year-new-github/

最初にGitHubのアカウントを取得して下さい。取得方法は省略します。わからない場合は「github アカウント 登録」で検索して、作成して下さい。

取得したアカウントでリモートリポジトリ [^5]を作成します。右側にある、「New repository」ボタンをクリックします。

![スクリーンショット 2015-02-06 0.34.03.png](https://qiita-image-store.s3.amazonaws.com/0/20058/edc9deef-d9f3-53f6-38c4-88e624e61ba9.png)

リポジトリ名とその説明を指定します。
今回は名前を「how-to-git」、説明文を「Gitの使い方の練習」とします。
「Create repository」ボタンをクリックします。

![create_repo.png](https://qiita-image-store.s3.amazonaws.com/0/20058/36f90f39-9ccf-32a1-f012-0944f9d9ac29.png)

色々わからない言葉が書いてある画面に遷移すると思いますが、これでGitHub上にリポジトリ作成が完了しました。

![スクリーンショット 2015-02-06 0.44.48.png](https://qiita-image-store.s3.amazonaws.com/0/20058/e16e318d-4948-e301-c7bd-569aa04155af.png)

このリポジトリにファイルをアップロードして、バージョン管理をしていきたいと思います。

# SourceTreeを使ってローカルリポジトリを作成してみる

GitHubに作成したリモートリポジトリをローカルリポジトリ [^6]にダウンロードします。
[SourceTree](http://sourcetreeapp.com/) [^7]はMac/Windowsで使えるGitを扱うことができるツールの一つです。
この[リンク](http://sourcetreeapp.com/)からダウンロード＋インストールしてみて下さい。
(30日間のトライアルの後、メールアドレスなどの登録を促されますが、無料で使い続けられます。)

無事にインストールが完了し、立ち上げるとウインドウが出てきます。
「リモート」ボタンをクリックします。

![スクリーンショット 2015-02-06 22.45.42.png](https://qiita-image-store.s3.amazonaws.com/0/20058/8c2e4c43-f05b-6586-c0c8-05894663cf53.png)

SourceTreeではデフォルトでいくつかのリポジトリのウェブサービスが利用できます。
「Connect a remote account」ボタンをクリックし、先ほど作成したGitHubアカウントを接続してみます。

![スクリーンショット 2015-02-06 22.49.52.png](https://qiita-image-store.s3.amazonaws.com/0/20058/dfc82bb8-3a1d-1576-4ce8-215698cf6cf8.png)

出てきたポップアップウインドウに以下の情報を入力し、「OK」ボタンをクリックします。

|項目|入力内容|
|-----------|------------|
|ホスト|GitHub|
|ユーザ名|GitHubのユーザ名|
|パスワード|GitHubのパスワード|
|プロトコル|HTTPS|

![スクリーンショット 2015-02-06 22.51.41.png](https://qiita-image-store.s3.amazonaws.com/0/20058/658aefe0-9a65-934b-5ead-758b225831cf.png)

GitHubにあるリポジトリの一覧が出てきます。
how-to-gitの横にある「クローン」をクリックします。

![スクリーンショット 2015-02-06 22.53.43.png](https://qiita-image-store.s3.amazonaws.com/0/20058/34756065-eb06-27e4-61a1-3ee9713b1c06.png)

「クローン」とはGitのコマンドの一つで、リモートリポジトリのファイルを丸ごと複製し、ローカル環境へダウンロードすることです。

ポップアップウインドにリモートリポジトリの情報を入力します。

|項目|入力内容|
|-----------|------------|
|ソースURL|https://{GitHubのユーザ名}@github.com/{GitHubのユーザ名}/how-to-git.git|
|保存先のパス(Macの場合)|/Users/{Macのユーザ名}/how-to-git/|
|名前|how-to-git|

{GitHubのユーザ名}と{Macのユーザ名}はあなたのユーザ名です。この画像は私のユーザ名、「shiraji」になっています。
入力が完了したら、「クローン」ボタンをクリックします。

![スクリーンショット 2015-02-06 22.59.12.png](https://qiita-image-store.s3.amazonaws.com/0/20058/89d47076-d9b4-c1da-9c77-9754ef47f037.png)

リモートリポジトリをローカルにダウンロード(クローン)することが出来ました。
「Finderで開く」ボタンをクリックしてみて下さい。/Users/{Macのユーザ名}/how-to-gitという空のフォルダが確認できるはずです。

![スクリーンショット 2015-02-06 23.09.43.png](https://qiita-image-store.s3.amazonaws.com/0/20058/0c4e6705-86c5-d3f0-cb2e-230cfeea3b74.png)

これでローカルリポジトリの準備が完了しました。

# ファイルをローカルリポジトリに追加する。

ローカルリポジトリの準備が出来ました。次にローカルリポジトリにファイルを追加してみます。

テキストエディット（Windowsはメモ帳）を立ち上げて下さい。

「テキストファイルを作成します。」
と入力します。
テキストエディットのデフォルト設定だと「.rtf」ファイルになってしまうので、「フォーマット」 > 「標準テキストにする」を選択して下さい。

![スクリーンショット 2015-02-06 23.30.06.png](https://qiita-image-store.s3.amazonaws.com/0/20058/692e64ca-64c9-2690-d8f3-cd885cdd91f8.png)

このファイルをhow-to-gitフォルダ内に保存します。
ファイル名は「textfile.txt」とします。

SourceTreeを見てみます。

![スクリーンショット 2015-02-06 23.35.04.png](https://qiita-image-store.s3.amazonaws.com/0/20058/ab2afc5b-e722-0aee-c42a-fa969bb8883b.png)

textfile.txtが「作業ツリーのファイル」の項目内に出来ました。
「textfile.txtを追加した」ことをGitに伝え、ローカルリポジトリにtextfile.txtを追加しようと思います。

textfile.txtを右クリックし、「Indexに追加」を選択します。

![スクリーンショット 2015-02-06 23.43.25.png](https://qiita-image-store.s3.amazonaws.com/0/20058/1d15d27d-45c8-04d6-e234-9a1b0403e574.png)

textfile.txtが「Indexにステージしたファイル」の項目に移動しました。
次に、上にある「コミット」ボタンをクリックします。

![スクリーンショット 2015-02-06 23.44.33.png](https://qiita-image-store.s3.amazonaws.com/0/20058/dd8d9a72-f248-d485-f680-a6629520fadd.png)

下のテキストエリアにフォーカスされるので、「textfileを追加しました。」と入力し、「コミット」ボタンをクリックします。

![スクリーンショット 2015-02-06 23.48.55.png](https://qiita-image-store.s3.amazonaws.com/0/20058/8f58f1cb-044a-3cdc-bcd4-1e9b292ff4bb.png)


「コミット」とはIndexにステージした全ファイルの追加・変更・削除を確定させることです。
今回はtextfile.txtを追加したことを確定させたことになります。

左上にある、時計のボタンをクリックします。
ローカルリポジトリにコミットした履歴が表示されました。

![スクリーンショット 2015-02-06 23.54.503.png](https://qiita-image-store.s3.amazonaws.com/0/20058/d72de500-4931-6905-f0dd-669a156d2dfc.png)

# ファイルをリモートリポジトリに追加してみる

ファイルをローカルリポジトリに追加することができました。
このファイルをGitHubにアップロードしリモートリポジトリに追加してみようと思います。

SourceTreeの右上にある「プッシュ」ボタンをクリックするとプッシュに必要な情報の入力を求められます。

|項目|入力内容|
|-----------|------------|
|プッシュ先のリポジトリ|origin|
|プッシュするブランチ|masterをチェックする|

「OK」ボタンを押すとプッシュされます。
（初めての場合、Keychainへのアクセスを求められますので、許可して下さい。)

![スクリーンショット 2015-02-07 0.06.45.png](https://qiita-image-store.s3.amazonaws.com/0/20058/6393d636-ce27-3f8d-99e5-dfcd5fc466b4.png)

プッシュとはローカルリポジトリに加えたコミットをリモートリポジトリに反映させることです。
ブランチは説明を省略します。ここではmasterというブランチがあるのだということだけ知っていれば問題ありません。

プッシュが出来たかどうかGitHubで確認してみます。

![スクリーンショット 2015-02-07 0.11.15.png](https://qiita-image-store.s3.amazonaws.com/0/20058/c8cda4da-a2fa-88eb-1b74-bc66567f03e6.png)

textfile.txtをリモートリポジトリに追加することに成功しました。

# ファイルを変更してみる

ファイルの追加が完了したので、次にファイルを変更してみます。
/Users/{Macのユーザ名}/how-to-git/フォルダにある、textfile.txtを開きます。
ファイルの内容を「テキストファイルを変更します。」に変更し、保存します。

![スクリーンショット 2015-02-07 0.23.05.png](https://qiita-image-store.s3.amazonaws.com/0/20058/04430a48-d053-0ca2-25b1-2b16e2e3cd2f.png)

SourceTreeを見てみます。

一番右側のカラムに変更した内容が記載されています。

 * 赤色の背景の行が削除された行
 * 緑色の背景の行が追加された行

「テキストファイルを作成します。」の行が削除され、「テキストファイルを変更します。」が追加されたことがわかります。

![スクリーンショット 2015-02-07 0.23.30.png](https://qiita-image-store.s3.amazonaws.com/0/20058/873187ba-83b6-b0e2-529e-b9bc20a65522.png)

ローカルリポジトリにファイルが変更されたことを登録するため、textfile.txtを先ほどと同じようにコミットします。
コミットメッセージには「textfileを変更しました。」と入力します。コミット後にプッシュもして下さい。

GitHubを見てみると「2 commits」になっています。
この「2 commits」をクリックしてみます。

![スクリーンショット 2015-02-07 0.30.24.png](https://qiita-image-store.s3.amazonaws.com/0/20058/008adc8b-031f-4e0c-0c2b-f9b22cf23390.png)

最初に行ったファイルの追加と今行ったファイルの変更を行った履歴が出来ました。

![スクリーンショット 2015-02-07 0.34.08.png](https://qiita-image-store.s3.amazonaws.com/0/20058/be5f705c-04d6-6d18-62c7-c37b2bca946c.png)

ファイルを追加した時ってなんという内容で追加したのか確認したくなった場合、この履歴から遡ることが可能になります。

# ファイルを元に戻してみる

もう一度textfile.txtを開いて、今度は「このメッセージは後で消えます。」と書き換えます。
ファイルを保存し、テキストエディットを閉じます。

![スクリーンショット 2015-02-07 0.50.42.png](https://qiita-image-store.s3.amazonaws.com/0/20058/b0f34f01-f216-8cc4-6ac8-b1fb9c724a17.png)




・・・


やっぱりさっきの内容のほうが良かった！戻そう！！！・・・あれ？もうテキストエディット閉じちゃってるから戻せなくない？？？・・・まずい・・・。
なんてことがあっても大丈夫！Gitで元に戻してしまいましょう！

SourceTreeを開きます。

案の定、textfile.txtに変更が入っていることになっています。

「リセット」ボタンをクリックします。
（時々ですが、このボタンが押せない場合があります。その時はSourceTreeを再起動してみて下さい。謎です。。。）

![スクリーンショット 2015-02-07 0.48.59.png](https://qiita-image-store.s3.amazonaws.com/0/20058/77ed0aff-2b26-0069-a6df-106adf426599.png)

変更を破棄するためのwindowが開きます。
textfile.txtを選択し、「変更内容を破棄」ボタンをクリックします。

![スクリーンショット 2015-02-07 0.56.59.png](https://qiita-image-store.s3.amazonaws.com/0/20058/c9484da9-41eb-9470-2706-bbf7d646598e.png)

もう一度、テキストエディットでtextfile.txtを開いてみましょう。

![スクリーンショット 2015-02-07 0.58.15.png](https://qiita-image-store.s3.amazonaws.com/0/20058/67b2adad-dac5-d60b-e40a-0c3eb86b2f56.png)

無事元に戻せました！

# GitHub上でファイルを変更してみる

ファイルの編集は、実はGitHub上でも可能です。
textfile.txtをクリックして下さい。

![edit_on_github.png](https://qiita-image-store.s3.amazonaws.com/0/20058/89e2b9e1-dab0-0088-70b1-8d94c3140954.png)

右側にある、ペンのアイコンをクリックして下さい。

このページでファイルの編集を行うことができます。
ファイルの中身を「GitHub上でファイルを変更します。」とし、下のほうにある、Commit changesにコミットメッセージ「GitHub上でファイルを変更しました。」と入力します。
その後、「Commit changes」ボタンをクリックするとGitHub上でファイルの変更が完了します。

![スクリーンショット 2015-02-08 15.42.31.png](https://qiita-image-store.s3.amazonaws.com/0/20058/0746f60d-ba52-1c58-dd96-358eb4bae837.png)

# ローカルリポジトリにリモートリポジトリを同期させてみる

リモートリポジトリにファイルの変更を加えましたが、ローカルリポジトリではファイルの変更を加えていません。
SourceTreeを見てみます。
３つ目のGitHubのコミットが存在していません。

![スクリーンショット 2015-02-08 15.54.46.png](https://qiita-image-store.s3.amazonaws.com/0/20058/07deca5a-351f-6e01-12d6-194b8cc11098.png)

ローカルリポジトリとリモートリポジトリの状態がバラバラだとプッシュ出来なくなります。
そこで、ローカルリポジトリにリモートリポジトリの状態を同期（プル）させます。

右上にある、「プル」をクリックします。

![スクリーンショット 2015-02-08 16.00.15.png](https://qiita-image-store.s3.amazonaws.com/0/20058/a213db00-eaf4-6c59-ce35-a5bc2bfb75d1.png)

何も変更せずに、「OK」ボタンをクリックします。

![pull.png](https://qiita-image-store.s3.amazonaws.com/0/20058/43fe49e8-7fa7-bd80-a027-2fe295ba1045.png)

変更が同期されました。

![スクリーンショット 2015-02-08 16.01.58.png](https://qiita-image-store.s3.amazonaws.com/0/20058/6bdc4480-42c3-655b-803d-f7852202d8dc.png)

実際にローカルにある、textfile.txtを開いてみると、反映されたようです。

![スクリーンショット 2015-02-08 16.03.02.png](https://qiita-image-store.s3.amazonaws.com/0/20058/c1150f06-cf61-50fb-0f9f-8cc2185436a7.png)

# pdfファイルを管理してみる

テキストファイルの管理が出来ました。では非エンジニア職がよく使うであろうxlsやpdfファイルの管理もGitにさせてみます。
テキストエディットを開き、「ファイル」 > 「新規」をクリックし、「pdfファイルを追加してみる。」と入力します。

![スクリーンショット 2015-02-07 12.00.22.png](https://qiita-image-store.s3.amazonaws.com/0/20058/f412b12b-3841-9c57-dc2b-89880ca1612e.png)

テキストエディットの「ファイル」 > 「PDFとして書き出す...」をクリックし、how-to-gitフォルダ内に、「pdffile.pdf」として保存して下さい。

![スクリーンショット 2015-02-07 12.02.05.png](https://qiita-image-store.s3.amazonaws.com/0/20058/1ddf8ac5-1b57-48e4-3418-58d3225a854e.png)

Windowsの場合は、エクセルを開き、「pdfファイルを追加してみる。」とA1に入力し、「PDFとして書き出す」でいけるはずです。

SourceTreeを開きます。

pdffile.pdfが追加されたことになっていますので、先ほどと同じようにコミットし、プッシュします。
コミットメッセージは「pdfファイルの追加しました。」とします。

![スクリーンショット 2015-02-07 12.05.46.png](https://qiita-image-store.s3.amazonaws.com/0/20058/be52afab-f9d8-ad9f-7d9d-1efcb653f13c.png)

GitHubでコミットの履歴を見てみます。
しっかりとプッシュされています。２回目のコミットである「textfileを変更しました。」をクリックしてみます。

![commit_his_2.png](https://qiita-image-store.s3.amazonaws.com/0/20058/7c098af4-3173-4a31-a659-3eeb66312541.png)

実際にこのコミットで変更した点が記載されています。
デフォルトでこの表記になっていないかもしれません。その場合、「Unified」から「Split」にするとこの表記になります。
（個人的で申し訳ないのですが、わかりやすいので、Splitを使っています。）

![スクリーンショット 2015-02-07 12.10.15.png](https://qiita-image-store.s3.amazonaws.com/0/20058/e9114dbf-fe5a-49c1-f0e1-d372eb91bde3.png)


一つ前のコミット履歴の画面で、今度は「pdfファイルの追加しました。」をクリックします。
ここには変更点が記載されていません。その代わり、「Binary file not shown」と記載されています。

![スクリーンショット 2015-02-07 12.10.43.png](https://qiita-image-store.s3.amazonaws.com/0/20058/3a2b2f3c-f2dd-8fb0-e1d4-0c2e466e3ba8.png)

バージョン管理の問題点の一つにバイナリファイル [^8]の変更点が確認できないというものがあります。
もし、pdfやxlsをGitで管理するのであれば、コミットメッセージにどんな変更を加えたファイルなのかをはっきり記載すべきです。
それ以外の機能、ファイルを保存したり、特定のコミットまで戻すことはバイナリファイルでも可能です。
GitHubは一つのファイルの最大容量が100MBなので、その点にも注意が必要です。

# まとめ

今回行ったことをリストしてみます。

 * GitHubにリモートリポジトリを作成しました。
 * SourceTreeを使い、リモートリポジトリからローカルリポジトリを作成しました。（クローン）
 * ファイルを追加し、ローカルリポジトリに登録しました。（コミット）
 * ローカルリポジトリの変更をリモートリポジトリに登録しました。（プッシュ）
 * ローカルリポジトリのファイルを直前のコミットの状態に戻しました。（リセット）
 * リモートリポジトリの状態をローカルリポジトリに同期しました。（プル）

これらはバージョン管理の基本的な動作です。また、今回やってみたのは一人でのバージョン管理になります。
まずは一人で触ってみて、Gitって便利なのだよと感じてくれたら良いなと思って記事を書いています。
複数人が同じリポジトリで仕事をする場合同じファイルを編集して、競合状態（コンフリクト）に陥ることもあります。
気分が乗ったらブランチやコンフリクト、マージなどの説明を書こうと思います。

Gitを使っていて、わからなくなったら近くにいるエンジニアにわからないから教えて欲しいと伝えて下さい。
（コーヒー飲んでるときとか、トイレから帰ってくるときとかに聞くのがベストです。）
コマンドラインじゃないGitなんてわからねwとか言ったら
「え？まだコマンドラインで消耗してるの？」
と驚いてあげて下さい。きっとムキになって解決してくれます。

# 追記

この記事を書いた後にGitHubが公式で出した[GitHub Desktop](https://desktop.github.com/)もWindowsで利用可能です。
バージョン管理という点ではSourceTreeでもGitHub Desktopでも同じです。

# 注釈

[^1]: GitHub。Gitのwebサービス。オンライン上でファイルのバージョン管理ができる。無料。
[^2]: bitbucket。Gitのwebサービス。GitHub同様オンライン上でバージョン管理ができる。全リポジトリがプライベートリポジトリ。無料。
[^3]: リポジトリ。開発プロジェクトに関するファイルの貯蔵庫。
[^4]: プライベートリポジトリ。ネットワーク上のどこかに存在し、特定のユーザからしか閲覧することができないリポジトリ。
[^5]: リモートリポジトリ。ネットワーク上のどこかに存在するリポジトリ。
[^6]: 今起動しているPC上に存在するリポジトリ。
[^7]: SourceTree。Mac/Windowsで使えるGitを扱うことができるツールの一つ。
[^8]: バイナリファイル。画像やxls、pdfなど文字列以外で構成されたファイル。メモ帳で開いて読むことができないファイルのこと。