資料作成につきまとう問題
会社の業務や大学のレポートでパワポやWordを使って資料を作成することは多いと思います.その際,上司などからアドバイスを受けて変更したけど,ひょんなことから昨日(変更前)のバージョンを見たくなる状況があったりします.
手っ取り早い方法は,昨日のファイルは残しておいて,新しい別のコピーに変更を加えていくことですが,そうすると,"商品Aプレゼンv2.pptx","商品Aプレゼンv3.pptx"のようなファイルが無限に作られていきます.
更に,
僕:「大芝さん(上司)!明日のプレゼン資料作ったのでチェックお願いします!」
大芝:「お前今日のミーティング聞いていたのか?直すべきとこにコメント入れておいたから早急に修正しろ!終わるまで帰るなんて論外だぞ!この無能な新人が!」
僕:「すみません!ありがどうございます!今日は徹夜で修正版を作ります!残業バンザイ!!」
のように,ファイルを共同編集するような状況で,それをメールで送りあったりしていると,以下のようなファイル群が生成されていくことになります.

もう最悪ですよね.同じ資料なのに複数ファイルがあるのがまず最悪だし,「修正版」や「v2」も何を修正したのかがさっぱり分かりません(しかも最終版の修正とは?).かといって,"商品Aプレゼン_大芝コメント入れ211205_村上修正211206.pptx"のようにファイル名に追加していくのも最悪です.
そこで,ファイルを複数作るのではなく,一つのファイルの中で編集履歴を管理したいと思うわけです.
一応パワポには変更履歴の表示機能があるようですが,正直使いづらいです.また,パワポに似たGoogle Slide,Wordに似たGoogle Docsは変更履歴を管理できる(皆さん知っていました?)のですが,使ったことある人はわかると思いますが,Google Docsはまだしも,Google Slideはゴミみたいに使いづらいサービスですよね.はっきり言ってあんなものちゃんとした資料作りに使おうと思いません(信者がいたらすみません)
そこで,Gitというツールを使ってバージョン管理をすることをおすすめします.Gitを使えば,上のような問題は起こりえないですし,もっと使いこなせば,複数人で同じパワポを同時に編集したりできます(ここではその方法は紹介しませんが)
この記事では,実際に手を動かしながら使ってみてもらうことで,その素晴らしさを紹介したいと思います.
最初はとっかかりが難しく,慣れるまでは大変ですが,使いこなせるようになれば上記の問題からは一生解放されるので,一度チャレンジしてみましょう.
Gitとは?
Gitとは,VCS(Version Control System: バージョン管理システム)の一つで,今や世界中のエンジニアに広く使われています(詳しいことはググってください1).
ソフトウェア開発時に用いられることが多く,現代のエンジニアにとっては必須のスキルの一つになっています.
ソフトウェア開発では機能ごとに細かく実装したり,頻繁にバージョンを変更したり,他の人が編集した部分を取り込んだりしながらソースコードをいじっていくので,先述したような編集履歴の管理が非常に大事になります.そこでGitというものは非常に重宝します.
下の画像は研究用のソースコードの開発履歴を表示したものなのですが,このように細かく履歴が時系列で残っているので,「この部分だけは前のバージョンに戻したい!」といったことが簡単にできるようになります.

GitHub
Gitはローカルでバージョン管理をするものですが,複数人で同じファイルを編集しようと思った場合,そのファイルの情報をインターネット上にアップロード/ダウンロードしながら,共同でバージョン管理する必要があります.
そういったサービスの中で最も使われているものがGitHubです(2018年にMicrosoftに買収されて,その地位を確実にしました).
自分で作ったソフトウェアを世界中に公開したり,公開されているソフトウェア開発に貢献したりと,いわばエンジニアのSNSとも言えます.
プロフィール画面には下のようなカレンダーがあって,どれだけアクティブに活動しているかが分かります(頑張ってコードを書いたりしてここを緑色にすることを,「草を生やす」と言ったりします)

アカウントを見ると,その人がエンジニアとしてどれくらい実力があるかがある程度わかりますし2,最近は「GitHub採用」なんてのもあるので,将来エンジニアを雇う側になるであろう皆さんは知っておいて損のない情報だと思います.(去年ぐらいにあったSMBCソースコード流出事件は,これが悪い方向に働いた例です.丁度数日前もLINE Pay決済情報流出事件が同じようなメカニズムで起きていましたね)
インストール
前置きはこの辺にしておいて,これから実際に試しながら使い方に慣れていってもらえばと思います.
まずはインストールからです.
Windowsの場合
パワポやWordなどOffice系のアプリを使う人は,Windowsユーザが多いと思いますが,残念ながらWindowsにはデフォルトでGitが入っていません.そのため,自分でインストールする必要があります.
以下の記事の「②Gitの初期設定」までを行ってください(Progateはわかりやすいね~).
Macの場合
MacにはデフォルトでGitがインストールされています.
ターミナルアプリを開いて,以下のように打ち込んで実行して(Enterを押す)みましょう.(注): 今後,以下のように$ ...
と書いているものはターミナルに打ち込んで実行するということを意味します.先頭の$
は除いてください)
$ git --version
git version 2.17.1
のようにバージョンが表示されると思います.インストールされている証拠です.3
あとは,初期設定をしておきましょう.以下のようなコマンドを実行します.名前とメアドはよしなにしてください.
$ git config --global user.name "Keitaro Murakami"
$ git config --global user.email "keitaro.mrkm@gmail.com"
Linux(Ubuntuなど)の場合
もちろんデフォルトでGitは入っていますし,Linuxを使っている人はおそらくこの記事を読む必要はないでしょう.さようなら.
ケーススタディ
さあ,いよいよ実践してみましょう.パワポ資料作成を例にとって説明します.
(前置き)
- ここからは,パワポやWordを使うことが多い人はWindowsユーザであろうという前提のもと,Windows環境で実行します.基本的にはMacでもコマンドは同じですが,スクショが異なる&動作確認していないので注意してください.
- Gitを使うには,上記のようにGit BashやターミナルといったCUI上でコマンドを打つことが不可欠になります.SourceTreeのような,GUIで直感的に操作できるアプリもあるようですが,僕は使ったことないですし,慣れればコマンドの方が楽なので,こちらで説明させてください.
- Gitには,多種多様なコマンドが存在します.僕も全てを知っていたり覚えているわけではないので備忘録を作っていたりします.コマンドの数だけ色々なこと(例えば,同じファイルを同時に別々の人が編集して最後に統合したり,過去の変更を書き換えたり)ができるのですが,そういったテクいをしようと思わなかったら,これから紹介するコマンドで十分です.慣れてきたら,色々と使いこなすぐらいの気持ちがいいです.
Git Bashの開き方
まず,好きなフォルダ上で白紙のパワポを作りましょう.(日本語だと文字化けするので,ファイル名を"presentaion.pptx"にしました)
そして,そのディレクトリでGit Bashを開きます.

画像のように,対象となるファイルが存在するフォルダを開いた後,右クリックをし"Git Bash Here"を選択します.(ここに出てこないようであれば,先ほどのインストールに失敗しているのでやり直して下さい.) そうすると,インストール時に使った"Git Bash"というアプリが開きます.
以後は,ここにコマンドを打ち込んでいくことになります.また,一度アプリを閉じてしまったら,同様の方法でまた開きます.
試しにここで,ls
と打ち込んでみましょう.すると,以下のように表示されるはずです.
これは,このディレクトリにあるファイル一覧を表示するコマンドなのですが,このフォルダに"presentation.pptx"というファイルがあることが確認できます.
$ ls
presentation.pptx
Macの場合
Macの場合はターミナルアプリを開きます.
Windowsの説明と同じように,対象となるファイルが存在するフォルダを「右クリック」->「サービス」->「ターミナルをタブで開く」で,ターミナルアプリが開きます.
ディレクトリの初期化
Gitはディレクトリ(フォルダだと思ってください)単位でファイルの管理がされます.つまり,ここでは,"会社資料"というディレクトリにある全部のファイルをGitの管理下にします.
まず,このことを明示してあげるために,initialize(初期化)をする必要があります.
$ git init
と打ち込んでみましょう.
そうすると,Initialized empty Git repositpry in ...
のように表示されると思います.これで初期化は完了し,このディレクトリはGit管理下に入りました4.以降,このディレクトリ内にあるファイルは,バージョン管理されていくということです.
バージョンの記録
では,バージョンの記録はどのようにするのでしょうか.
(バージョンと言われてピンとこないようであれば,RPGゲームでセーブをするようなものだと思っておいてください.ある時点まで作業した状態で,セーブするということです.そこからまた作業を続けていて,もし前の状態に戻りたくなったり,万が一データを壊しても,以前にセーブしたところには戻れます.そんなものです.)
この,バージョンの記録をすることを**「コミットする」**と言います.
さて,今現在は「白紙のパワポ(presentation.pptx)を作った」という状態です.
ここで,$ git status
と打ち込んでみましょう.以下のようにででくるはずです.
$ git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
presentation.pptx
nothing added to commit but untracked files present (use "git add" to track)
このコマンドは,現在の状態を表示するためのコマンドです(多分一番使います.意味もなく打って心を落ち着けたりします(多分共感されるはず))
「presentation.pptx というまだ追跡されていないファイルがありますよー」と言っているだけです.
まずは,この状態をコミットしましょう.
ここでまた話を難しくして申し訳ないのですが,コミットをするには2段階を踏む必要があります.
前提として,コミットは意味ごとにまとめることが大事です.「商品Aの説明書きを加えたところまで」「上司にコメントを入れてもらった」などのような単位でコミットをすると,あとから振り返りやすいです.逆に,「〇月〇日までの作業」のようなコミットの仕方は好ましくありません.後から見ても,何を変更したのかが全く分からないからです.
そうすると,(今回は一つのファイルだけを編集しますが)複数のファイルを編集しているとき,次のコミットにファイルAの変更は含みたいけど,ファイルBの変更は加えたくない,といった状況が出てきます.また,同じファイルの中でも,この編集の部分は含みたいけど,この編集の部分は次のコミットに分けた方がいいなという状況もあります.
そこで,**「次のコミットに含みたいファイルを一時的な場所(インデックスと呼びます)に予約して,予約されたものが次のコミットに含まれる」**という仕組みになっています.(最初はこんなものかとだけ思っておいてください)

インデックスに予約するには,$ git add [ファイル名]
コマンドを使います."presentation.pptx"をaddしたあと,また$ git status
で状態を確認してみてください.
$ git add presentation.pptx
$ git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: presentation.pptx
changes to be commited: new file: presentation.pptx
というように出ました.インデックスに登録されて,次のコミットに含まれますよということです.
じゃあ,コミットしましょう.
コミットには,短いメッセージを加えます.$ git commit -m "コミットメッセージ"
のように打ち込みます.
先ほどコミットは意味ごとにまとめると言ったやつです.今回は空のファイルを作っただけなので,"blank pptx"とでもしておきましょう.
$ git commit -m "blank pptx"
これでコミットができました.$ git log
と打ってみましょう.このようにログが出てきて,先ほどのコミットが記録されていることが分かると思います.
$ git log
commit 71e63db6d90137198f395ad6c071d7109e78f885
Author: Keitaro Murakami <keitaro.mrkm@gmail.com>
Date: Mon Dec 6 04:20:06 2021 +0900
blank pptx
初めはとっつきにくいと思いますが,とりあえず**「ファイルを変更したらaddしてcommit」**とだけ覚えておけばいいでしょう.
変更
さて,翌日にパワポにタイトルと以下のようなスライドを加えて保存したとしましょう.

$ git status
コマンドで状態を確認すると,以下のように出ます.
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: presentation.pptx
no changes added to commit (use "git add" and/or "git commit -a")
modified: presentation.pptx
とあるように,"presentation.pptx"が編集されたことが明示されています.
さあ,この状態をコミットしておきたいと思ったらどうしますか?
そうです.「addしてcommit」です
$ git add presentation.pptx
$ git commit -m "add title and description"
$ git log
コマンドでコミットログを見てみましょう.(--oneline
オプションをつけると完結に表示できます)
下のように履歴が積み重なっているのが見て取れます.
$ git log --online
6d9b8b5 add title and description
71e63db blank pptx
変更2
上のスライドを作ったあとに,上司から「商品プランが変わったからスライドを作り直せ」と言われたとします.
そこで,下のようにスライドを作り直したとしましょう(さすがにさっきのプランは大盤振る舞いしすぎたんでしょうね)

変更を施したので,コミットしておきましょう.
もうお手の物ですよね.
$ git add presentation
$ git commit -m "change plan"
バージョンを戻す
ここまでは,わざわざGitを使う必要がないように思えたかもしれませんが,ここからバージョン管理の恩恵の受けどころです.
昨日上司に商品プランの変更を命じられてスライドを変更しましたが,やはり元のプランでゴリ押すことが決まったとします.すると,あなたのパワポはやはり昨日のバージョンにそっくりそのまま戻したいとなるわけです.
普通にパワポを編集していただけでは昨日のバージョンは残っていませんから,またファイルを開いて編集しなければいけません.今回の例では変更箇所が少ないですが,もっとたくさんの変更があった場合は大変です.上司の大芝も「資料が完成までは帰らせないからな!」と威圧してきます.
しかし,あなたにはGitという強い味方がいて,昨日のバージョンはコミットしてあるので安心できるのです.コマンド一つ打ったら昨日のバージョンに戻すことができます.定時で帰って,アマプラでバチェラーSeason4でも見ましょう.
さて,今あなたのコミットログは次のようになっています.
$ git log --oneline
04aad5d (HEAD -> master) change plan
6d9b8b5 add title and description
71e63db blank pptx
図にすると以下のようになります.
それぞれのコミットは"71e63db"や"6d9b8b5"といった数字5を持っています.この値はハッシュ値と呼ばれ,各々のコミットは固有のハッシュ値を持っているため,ハッシュ値を指すことで,特定のコミットを指定することができます.HEADというのは今あなたがいる場所です.
つまりあなたは,"04aad5d"というハッシュ値を持ったコミットの場所にいます.
さあ今回行いたいのは,一つ前のコミット,つまり"6d9b8b5"のコミットに戻ることです.
特定のコミットに移動するには$ git checkout [コミットハッシュ値]
コマンドを使います.
つまり,以下のようにコマンドを打ちます.
$ git checkout 6d9b8b5
これだけです.
"presentation.pptx"を開いてみてください.画像のように,元のバージョンに戻っていることが確認できます!本当にコマンド一つで元のバージョンに移動することができましたね.
この後,やっぱり最新のバージョンに戻りたい場合はどうしますか?
今と全く同じです.最新のコミットのハッシュ値は"04aad5d"ですから,以下のようにすればいいです.
$ git checkout 04aad5d
# もしくは $ git checkout master <- この説明は省略します
ファイルを開いてみると,最新のバージョンになっていることが分かります.
これだけです.簡単でしょ?
これであなたも,複数のバージョンを自在に行き来することができるようになりました!
(上級者向け)差分の表示
上記の$ git status
コマンドによって,どのファイルが変更されたかは分かります.しかし,どのように変更されたか(=差分)は分かりません.
そこで使うのが $ git diff [ファイル名]
というコマンドです.これを使うと,どの行が足された/消された/変更されたかを行単位で解析して表示してくれます.
しかし,.pptxファイルや.docsファイルは普通のテキストファイルではないので,少しだけ設定が必要です.
ここからは少し難しいですが,差分の表示は非常に便利な機能なので,是非以下の設定をやってみてください.(色々と調べて一番簡単で確実な方法を模索したので是非.というか,本当はこの内容をメインにしようと思っていた)
1. Javaのインストール
この記事に従ってJavaをダウンロードしましょう(環境変数の設定も忘れずに).2021/12/7現在で最新のバージョンは17.0.1なので,これをダウンロードします.
最後にGit Bashで,
$ javac --version
javac 17.0.1
のように表示されれば,Javaのインストールは完了です.
もし表示されなければ何か間違っているか,もしくはGit Bashを立ち上げなおして試してみてください.
2. Apache Tika のインストール
Apache Tikaというツールキットを使うと,パワポやWordから文字データを抽出してくれます(これを使うためにJavaをインストールしました.)
http://archive.apache.org/dist/tika/
このサイトから"tika-app-1.26.jar"をダウンロードして,C:\Program Files\Git\bin
に置いておきます.
3. ~/.gitattributes, ~/.gitconfig の設定
エクスプローラでC:\Users\username
に移動して,[表示] > [表示] > [隠しファイル] のチェックを入れてください.すると,.gitconfig
というファイルがあることが分かると思います.これを開いてみると,最初に入力したあなたの名前とメールアドレスが書き込まれていると思います.
そうです,これはGitの設定ファイルです.ここに,以下のように項目を追記してください(email, nameはあなたのメアドと名前になっているままにしてください).
[user]
email = keitaro.mrkm@gmail.com
name = Keitaro Murakami
[core]
attributesfile = ~/.gitattributes
[diff "tika"]
binary = true
textconv = java -Dfile.encoding=UTF-8 -jar 'C:\\Program Files\\Git\\bin\\tika-app-1.26.jar' -t
次に,同じ場所に.gitattributes
というファイルを作成し,以下のように書き込んで保存してください.
*.pptx diff=tika
*.docx diff=tika
*.xlsx diff=tika
これで設定は完了しました.
試しに,"presentation.pptx"に何か変更を加えたあと,addする前に$ git diff presentation.pptx
と打ってみてください.差分が表示されるはずです.
以下は,二番目のコミットのあと,商品プラン変更に伴ってファイルを編集したときに差分を表示したものです.
$ git diff presentation.pptx
diff --git a/presentation.pptx b/presentation.pptx
index 3640c3d..c2031ea 100644
--- a/presentation.pptx
+++ b/presentation.pptx
@@ -4,8 +4,8 @@
商品A
-月額3000円
-データ通信無制限
-家族割引適用
+月額5000円
+データ通信50GBまで
+親子割引適用
-
とついている行は,その行を消したという意味で,+
とついている行は,その行を追加したという意味です.
何を消して,何を追加したかが一目で分かるため,非常に便利です.是非,これも使えるように設定しておきましょう.
もっと網羅的に勉強したい人へのおすすめサイト
ここでは,本当に触りの部分だけを紹介しました.でも,それだけでも十分便利なツールであることが分かってくれたと思います(くれたら嬉しいな)
他にもたくさんのコマンドがあり使いこなせば本当に強力なツールなので,エンジニアに限らず色んな人に習得してほしい技術です(エンジニアもその他のオフィスワーカーも,テキストファイルを編集することが業務という意味では同じです).そして周りの人にも広めてみてください(GitはGitHubを使って複数人と共同編集をするときにさらに威力を発揮します).
この記事だけではわからないこともたくさんあると思うので,興味のある人は以下のサイトなどで勉強してみてください.
-
サル先生のGit入門
サルでも分かるシリーズのサイトで,初心者におすすめです.僕もこれで勉強しました. -
Git progate
Progateのコースなので,多分わかりやすいはず. -
それでも忘れるので頻出gitコマンドをまとめておく
僕が個人的にまとめていて,たまに更新しているコマンド集です.ここにあるものを眺めると,どんなことができるのかが何となく分かる?かもしれません.
-
この「世界中のエンジニアに広く使われている」ツールを2週間で作ったLinusという人物は神です(Linuxとgitを作ったLinus) ↩
-
社内のプライベートなプロジェクトでの貢献は表示されなかったりするので,凄腕ソフトウェアエンジニアでも簡素なアカウントだったり,逆にカスみたいな実力しかないのにプロフィールだけ一丁前に豪華なやつ(僕みたいなつ)もいるので,ちゃんと見極めましょうね. ↩
-
もし無かった場合は,公式サイト(https://git-scm.com/download/mac) に従ってインストールしてください. ↩
-
$ ls -a
と打ってみてください..git
という隠しフォルダが生成されていることが分かります.この中に,フォルダのバージョンの履歴や何やの情報は保存されていきます. ↩ -
本当はもっと桁数が多いです.ハッシュ値はハッシュ関数から生成されます.Gitは初期はSHA-1(シャーワン)というハッシュ関数を採用していましたが,最新のバージョンではもう少し強固なSHA-2を採用しています.ハッシュ関数は暗号技術の基礎です. ↩