目次
はじめに
今の職場では、ソースコードのバージョン管理システムとしてSVNを使っています。自分が入社する前からずっと使い続けているようですが、今は当時よりも共同作業者の数が圧倒的に増えて、最近ではコミットの度に他に同じコードを編集している人がいないか確認したりとか、一つのブランチにいろんな人が同時に複数の変更を入れてマージが面倒になったりと非効率感が漂っています。
そこで、分散バージョン管理ができるGitを導入出来れば、今の問題が解決できるのではないかと考え、上記の書籍を読んでGitについて学ぶことにしました。
今回の記事は、これを読んで参考になった部分をTwitter上でメモしたものになります。
メモ
年末年始の読書3冊目はこれ!
— Shisato (@4310sy) 2019年1月2日
2019年の目標達成に必要不可欠な1冊なので、今回1番楽しみにしてたやつ!! pic.twitter.com/OI3nAbWKef
Gitの特徴
— Shisato (@4310sy) 2019年1月2日
大規模なプロジェクトを高速に、そして複数人で並行して扱いやすくした仕組みを持っている。
GitHubの普及により、インターネット上でのスムーズな共同作業も可能。
コミットを指定するためのコミットハッシュ
— Shisato (@4310sy) 2019年1月2日
コミットをする時にSHA-1ハッシュ関数と呼ばれる計算式により割り出されるもの。
ハッシュ値を指定すればそこからコミットを特定出来る。
ローカルにコミットを行い状態を保存するのに用いる場所
— Shisato (@4310sy) 2019年1月2日
ワークツリー
編集の開始地点。新規追加ファイルは、Git管理外の状態。
ステージングエリア(インデックス)
コミットしたいファイル選んで登録する場所。
Gitディレクトリ
それ以降変更されないデータとしてコミットを格納する場所。
さまざまなリポジトリから変更を受け付ける時
— Shisato (@4310sy) 2019年1月2日
リモートリポジトリをクローンしたらブランチを切って、各々が作業しコミット
複数作業を並行して進め、それぞれを任意の時点でリモートに反映
コンフリクトを検知した際に教えてくれる
Git操作専用のGUIクライアント
— Shisato (@4310sy) 2019年1月2日
Sourcetree
GitHub Desktop
IDEのプラグイン
git checkout
— Shisato (@4310sy) 2019年1月2日
ワークツリーの変更を取り消す
git reset
ステージングエリアに入れた変更をワークツリーに戻す
git diff
ワークツリー、ステージングエリア、Gitディレクトリ間の差分を確認する
ステージングエリアとGitディレクトリの差分を確認する時は、
— Shisato (@4310sy) 2019年1月2日
git diff --cachedというようにオプションを付ける。
コミット時などのメッセージを入力する時にエディタを開くように設定する
— Shisato (@4310sy) 2019年1月2日
git config --global core.editor "exeファイルのパス --wait"
エディタを設定しておくと、git commit実行時にエディタが自動的に開く。
— Shisato (@4310sy) 2019年1月2日
オススメのコミットメッセージ形式
1行目に要約
2行目に空欄
3行目以降に詳細説明を書く
エディタを開く必要がない時は、
— Shisato (@4310sy) 2019年1月2日
git commit -mで直接メッセージを指定してコミットする
ワークツリーの変更を取り消すコマンド
— Shisato (@4310sy) 2019年1月2日
git checkout -- ファイルパス or ディレクトリパス
ハイフン2つで直前のコミット状態に戻す働きをする。
ブランチ名を指定するとブランチを切り替える。
ステージングエリアへの登録を取り消すコマンド
— Shisato (@4310sy) 2019年1月2日
git reset HEAD ファイルパス or ディレクトリパス
HEADは最後にコミットした状態を意味する。
.gitignoreファイルで管理しないファイルを設定する
— Shisato (@4310sy) 2019年1月2日
.gitignoreファイルを作って、管理しないファイルやディレクトリを直接指定する
ファイルが配置されたディレクトリ配下のパスにしか効果はない
差分付きでコミット履歴を確認する
— Shisato (@4310sy) 2019年1月2日
git log -p
SSHと公開鍵を用いたサーバ認証
— Shisato (@4310sy) 2019年1月3日
SSHキーを生成
ssh-keygen -t rsa -b 4096 -C "メルアド"
鍵の保存場所を確認して、パスフレーズを設定
確認用に2度入力
公開鍵の保存パスをコピー
clip < 保存パス
GitHubの設定画面でSSH and GPG keysを選択し、New SSH keyをクリック
公開鍵を貼り付ける
— Shisato (@4310sy) 2019年1月3日
タイトルは、どのPCで発行したキーか分かるようにする
確認用コマンドを入力する
ssh -T git@github.com
yesと入力
パスフレーズを入力する
Hi ユーザ名! You've successfully authenticated
と表示されれば成功
フォーク機能によるリポジトリの複製
— Shisato (@4310sy) 2019年1月3日
フォーク元に変更を変更することも出来る。
複製元のリポジトリのページを開いてForkクリック
完了すると、自分のアカウントページに同一内容のリポジトリが作成される。
リモートリポジトリの設定を確認する
— Shisato (@4310sy) 2019年1月3日
git remote -v
ローカルリポジトリに紐付いたクローン元のリモートリポジトリURLがoriginとして表示される
ローカルリポジトリに対して複数のリモートリポジトリを設定できる
それぞれを識別するための名前が必要。初期値でoriginという名前がつく。
プルリク時のブランチ選択
— Shisato (@4310sy) 2019年1月4日
レビュー対象のトピックブランチとマージ先ブランチを設定する。
マージ先ブランチがあるリポジトリからフォークしたものである場合は、リポジトリも設定する必要がある。
デフォルトではフォーク元のリポジトリが指定されるので、自分のアカウントのリポジトリに変更する。
プルリク作成時はレビュアーを設定する。
— Shisato (@4310sy) 2019年1月4日
レビュアーに指定できるのは、リポジトリのコラボレータとなっているアカウント。権限を与えたいアカウントをSetting→Collaborators→Add collaboratorから追加する。
追加されたアカウントにはInvitationメールが届くのでAcceptする。
プルリクの内容はブラウザ上でレビューする。
— Shisato (@4310sy) 2019年1月4日
Files changedで差分の確認
Commitsでコミット履歴を確認
コメント欄にメッセージを記入してCommentする
レビュー後のマージ実行者はチームによって異なる。
— Shisato (@4310sy) 2019年1月4日
レビューした人がマージするか、レビューを依頼した人がするか。
どちらを選択するか決める際は、マージの影響をしっかり把握した人が、適切なタイミングで操作を行えるルールになっていることが大切。
GitHubでのコミュニケーションには、略語を活用する文化がある。
— Shisato (@4310sy) 2019年1月4日
最も有名なのは下記。
「問題ないと思う」「よいと思う」の意味で「LGTM(Looks Good To Me」。
プルリクの内容を承諾する意味でレビュアーがLGTMを伝えるのは定番。
レビュー結果の種類
— Shisato (@4310sy) 2019年1月4日
Comment
疑問点が見つかり、依頼者に確認をしたい時
Approve
マージを承認する時
Request changes
修正依頼を出す時
3種類のマージ方法
— Shisato (@4310sy) 2019年1月4日
Create a merge commit
全てのマージコミットが履歴に残る。
Squash and merge
トピックブランチを一つにまとめた後でマージする。
Rebase and merge
ブランチの分かれ元をベースブランチの最新コミットに変更して。
マージ後の履歴が一直線になる。
プルのフェッチの違い
— Shisato (@4310sy) 2019年1月4日
プル
リモートからの取得内容がワークツリーまで反映される。
パソコン内のファイルが即座に書き替わる。
フェッチ
ローカルリポジトリまでしか取得内容が反映されない。
すぐにマージしたくない、内容を確認したいだけの場合はフェッチを使う。
git pullコマンド
— Shisato (@4310sy) 2019年1月4日
git pull プル先のリモートリポジトリ プルするブランチ
例: git pull origin master
git fetchコマンド
git fetch フェッチ先のリモートリポジトリ
git fetch origin
ローカルに持っていないリポジトリをリモートから取得したい場合はプルができないのでフェッチを使う。
— Shisato (@4310sy) 2019年1月4日
git checkoutコマンドでも同様のことが出来る。この際は、-bオプションがなくてもGitが自動でローカルにリポジトリを作成する。
— Shisato (@4310sy) 2019年1月4日
checkoutは特定のバージョンをワークツリーに反映させる。ワークツリーにあるファイルがmodifiedである場合は、不要な上書きを防ぐためにcheckoutを出来ないようにする。
GitHubフロー
— Shisato (@4310sy) 2019年1月4日
作業ごとに一つだけトピックブランチを作って、細かい単位でサイクルを回す。頻繁なデプロイを前提とする。
masterブランチからトピックブランチ作成
↓
変更したい内容をコミット
↓
プルリクを作成してレビュー、デプロイ
↓
masterブランチにマージ
作業ごとにブランチを使い分ける理由
— Shisato (@4310sy) 2019年1月4日
・作業の影響範囲を限定できる
・リリースしたい部分だけを抽出するのが楽
・片方にバグがあったときは、それだけを元に戻せる
別作業用に追加でブランチを作成するときは、他の作業と切り分けるために、一度masterブランチに戻ってからブランチを作成する。
— Shisato (@4310sy) 2019年1月4日
作業が途中のブランチの作業を再開する際は、その時点での最新のmasterブランチの情報を取り込んでからにする。
— Shisato (@4310sy) 2019年1月4日
git mergeコマンドで取り込む
— Shisato (@4310sy) 2019年1月4日
git merge 取り込みたいブランチ
例: git merge master
git statusコマンドでコンフリクトの発生を確認できる。
— Shisato (@4310sy) 2019年1月4日
コンフリクトしているファイルはboth modifiedと表示される。
コンフリクト発生時のyouとthem
youはマージ元である現在使用中のブランチ
themはマージ先のブランチ
これで一旦読了!
— Shisato (@4310sy) 2019年1月4日
今年はこの本で学んだことを活かして職場でGitを導入する活動をしたい。
次は自分なりに導入資料を作ってみよう。
SourceTreeを用いたGitによるバージョン管理の練習
今回の書籍で学んだことを踏まえて、GUIツールであるSourceTreeを用いたGitのバージョン管理を練習してみました。その流れを下記の記事に書いているので、参考にどうぞ。
www.eureka-moments-blog.com