Gitマスターへの道#2~わたしとリモートリポジトリ~
こんにちは。高須です。梅雨が明けているのか微妙な時期も終わり、夏がやってきましたね!暑いのは苦手ですが、晴れているのはうれしい!
それでは早速やっていきましょう!
今回は、「わたしとリモートリポジトリ」間で行われる主な作業をマスターしていきます。グループでのバージョン管理だけでなく、個人のデータ管理でもGitを利用している同僚もいたので、今回の機能をマスターできれば個人のデータ管理のための簡単な機能はおさえられると思います。ということで今回勉強する内容は、
- clone(リモートリポジトリのファイルをローカル環境にローカルリポジトリとして複製する)
- commit(ローカルリポジトリで変更した履歴を記録する)
- push(ローカルの変更をリモートリポジトリに反映)
- pull(リモートリポジトリの最新の状態をローカルに反映する)
- checkout(ローカルリポジトリ内で行われた変更をキャンセルし、リモートリポジトリの状態に戻す)
の5つです。
0. 下準備
はじめる前に、パソコンでGitの環境を作らないといけないです。Gitのダウンロードはこちらから。
やり方は今回は省きますが、こちらの記事などを参考にしてみてください。このダウンロードを終えると、以下の3つのツールが利用できるようになります。
・Git CMD:gitコマンドを使用した通常のWindowsコマンドプロンプト
・Git Bash:Windows上で使えるbash環境(命令を画面に打ち込みコンピュータが命令に従いファイルの操作やファイルの編集、削除といった操作ができるソフトウェア)
・Git GUI:コマンドラインに触れることなくGitを使用可能
基本的にGit Bashを使っていきます。使いたいフォルダを右クリックすると、「Git Bash Here」という項目があるので、それをクリックすると、以下のような画面がでてきます。そこにここから説明する諸々を打ち込むと、そのフォルダ内でファイルの操作ができるようになります。
よし、準備完了です。早速やっていきましょう!
1. clone(リモートリポジトリのファイルをローカル環境にローカルリポジトリとして複製する)
これはgitを活用する上でのファーストステップです。まず自分のパソコンにリモートリポジトリを複製することで、端末での操作が可能になります。
まずcloneしたいリポジトリをGitHubで開き、“code”内に表示される[path]をコピーします。
それを、ローカルでCloneしたいフォルダを作成し、Git Bashに以下を入力します。
$ git clone [path]
そうすると、ローカルの指定したフォルダに、リモートリポジトリのファイルが複製され、そのファイルを実際に編集することが出来ます。
これでバージョン管理の準備が整いました。やった~!
2. commit(ローカルリポジトリで変更した履歴をローカルリポジトリに記録する)
ローカルでファイルを編集していく過程で、変更にメッセージを付けてリポジトリに登録する操作をcommitといいます。それによって、変更の履歴が時系列につながった形で記録されていき、履歴を確認する際にいつ誰がどういう編集を行ったのかを確認することができます。
変更するファイルをコミットする場合は、変更作業を行ったファイルを、ステージに移動する、という工程が必要です。ステージとは簡単に言うと、「どのファイルを管理対象にするか」を記録するエリアです。そのため、コミットという工程はステージに追加→コミットという2段階であることを理解しておく必要があります。
そのため、あるファイルを編集した場合、Gitに入力するコードは以下になります。
//git addでファイルをstagedという状態にする
$ git add [filename]
//git commitでローカルリポジトリにコミットする
$ git commit -m "message"
ここにおける”message”は基本何でも良いのですが、チーム内で統一しておくと便利です。
ファイルの追加や変更ではaddが使われますが、削除のときはaddではなくrm(removeの略)にして同様にcommitすれば、削除のログが記録されます。
3. push(ローカルの変更をリモートリポジトリに反映)
次は、commitによって記録された変更をリモートリポジトリへ反映していきたいと思います。
$ git push origin main
これだけです!簡単ですね。これでcommitによって変更が記録されたファイルはリモートリポジトリに反映されます。
ただ、もしaddやcommitをしないままpushしようとするとエラーが出るので、ローカルでファイルを変更した場合の反映はadd→commit→pushという一連の流れで覚えておきましょう。
4. pull(リモートリポジトリの最新の状態をローカルに反映する)
リモートリポジトリの最新の状態をローカルに反映します。
$ git pull
こちらもこれだけです!これでローカルリポジトリが最新の状態に更新されます。
実験として弊社の石原さん、蒔苗さんに協力してもらい、ローカルリポジトリでテキストファイルを変更してリモートリポジトリにaddしてもらいました。その状態で私のローカルリポジトリにpullすると、ちゃんと彼らの更新が私のローカルリポジトリに反映されます。
そしてGitHub上には、具体的に誰が何行目をどう編集したかを表示してくれます。
普段Gitを使わずにこのような「共有ファイルの更新」をする場合、一番怖いのは「他のメンバーが同時にファイルをいじっている」状況ですよね。チーム内で複数人が同時に編集する場合は、どちらかの変更が反映されなかったり、自分の編集が消えてしまったりしてスムーズに仕事が進まないので、ローカルに落としてから作業したり、「今から○○のファイルを編集します」という宣言をしてから作業するなど、皆さんそれぞれに工夫しながら作業していると思います。gitではこのような更新の重複を防ぐことができます。
例えば、(突然のQ&A形式)
Q.「自分のローカルで編集したファイルをaddしてない状態で編集前の状態のファイルをリモートリポジトリからpullすると編集前の状態に戻っちゃうの?」
A. 戻りません!最新の状態ですって言われるだけで、ファイル自体に変更はありませんでした。
Q.「自分のローカルで編集したファイルをaddしてない状態で誰かが編集してaddしたファイルをリモートリポジトリからpullすると誰かに編集されたバージョンに上書きされちゃうの?」
A. 上書きされません!ただエラーとともに自分のをcommitかstash(コミットせずに変更を一時的に退避すること)をしろっていう警告がでます。
このように、自分が編集している最中にほかの人が編集してpushしていた場合でも、自分の努力が消えてしまうような悲しい結果にならずに済むのです!ありがたい~!
(番外編)Rhinoceros, Grasshopperデータの管理
ただ気をつけるべきこととして、gitはプログラミング向けの共有ツールとしては非常に便利ですが、建築業界でよく使われるRhinocerosのファイルはGit上ではレイヤーのON/OFFの変更といった無意味な変更でも記録される上に、どこをどう編集したかが見えにくいという欠点があります。
そこで弊社では、何を変更したのかGitのcommitにコメントを残せるのと同じように、RhinocerosのKey/Valueとしてコメントを残せる機能を持ったコマンド(Commit Command)を作成しました。バージョン更新の保存日だけを追うだけでなく、どこがどう変更になったかを3dmファイル内のUser Attributeに日付と変更内容を記入することで管理するという試みです。
詳しくは(壁谷さんのブログ?)
こうやってそれぞれのファイルのタイプに合った管理方法を見つけていきたいですよね。
Grasshopperの管理方法はまだ模索中です。なにかいい案があったらぜひコメントをお願いします!
5. checkout(ローカルリポジトリ内で行われた変更をキャンセルし、リモートリポジトリの状態に戻す)
編集はしてローカル内で保存したけど、やっぱりリモートリポジトリ内にある編集前の状態に戻したい。という場合もあるでしょう。そんなときは、
$ git checkout [fimename]
これで元の状態に戻すことが出来ます。
checkoutは今後も違う使い方でまた登場します!ややこしい!
まとめ
いかがでしたか?想像以上にボリューミーになってしまいましたが、かる~い気持ちでとりかかってみてください◎現状、この5つだけでかなりスムーズに複数人でバージョン管理できています。
次回は、ブランチについて学んでいこうと思います。