Gitの使い方
分散型バージョン管理システムです。
DropboxやGoogleドライブ、iCloud等のオンラインストレージのバージョン管理特化版だと思っていただいて差し支えないです。
Gitのイメージ
https://gyazo.com/9f9035b25ea86b50bb39fceacd314eec
gitのシステムをホスティング(ストレージ貸してくれる)サービスは複数あります。
また自分でサーバーを立てる事もできます。
自力でsshとかを設定する
よくある間違い:
Git ≠ Github
これは下と大体同じ感じです
Wiki ≠ Wikipedia
Java ≠ JavaScript
インド ≠ インドネシア
(とりあえず必要な)用語集と基礎知識
リポジトリ
バージョン管理してるフォルダのこと
ブランチ
歴史の流れ。世界線とか、アドベンチャーゲームのシナリオのイメージがわかりやすいかもしれない。
コミット
編集したイベント。歴史を刻む。
https://gyazo.com/89b652a034798986e3d56d591eb7cf68
フェッチ
リモートの状態を見に行って手元のキャッシュを更新する。ブラウザのF5更新と同じです。
プル
歴史に存在してないリモートのコミットをローカルの取り込む。
手元に保存するイメージ
https://gyazo.com/6b25762fe1943d398d1dc9abfd0080d9
プッシュ
ローカルの歴史をリモートに送り込む。
アップロードのイメージ
新しく追加される歴史以外の部分が不整合だとエラーになる。(※ハマりポイント)
https://gyazo.com/3e9cf081dba6944952b763d0db2563e9
マージ
分岐した歴史を合わせる。
修正がかぶってるとエラーになる。手動の修正が必要になる(※ハマりポイント)
https://gyazo.com/14c9cf0aa57f81df5691c2393697295f
プルリクエスト
レビューしてもらってメインストリームのブランチにマージ許可をお願いすること。
言葉としてはマージリクエストの方が正しいが、Githubではプルリクエストになっている。
コミットの基礎知識
それぞれのコミットはプログラムの修正パッチ。
コードを変更して修正パッチに梱包して確定した結果コミットになる。
https://gyazo.com/ebe7bda19c202023a34019165184c2cf
stageはgit addのこと
unstage は git reset --mixed のこと
gitを始める
Githubにリモートリポジトリを作って手元にコピーを用意しましょう。
「クローン=手元にコピーを作る」で問題ないです。
code:bash
# github.com の hoge さんの fuga リポジトリをクローン(ローカルにコピー)する
# 最初は master ブランチっていうメインの歴史が作られる
# ちなみに余談だけど、コレ自体はsshでサーバーに接続してディレクトリの内容を送ってる
git clone git@github.com:hoge/fuga.git
共同作業するときのポイント
レビューのしかたを決める。誰がレビューやるのかとか。
二人ならクロスレビュー
レビューと言わずに意見交換くらいのイメージ。上下関係なくガンガン意見言ってねって最初に言っておくことがとても重要。
これは絶対やっとかないといけないこと
予めメインストリームになるブランチを決めておくこと。
単純に何も考えなければ master ブランチをメインに置きます。
本番反映とかリリースとかがある場合は develop ブランチをメインに置きます。(常に本番反映中のものを master にするため)
要はみんなで共同作業するための決めごとです。
ここからは、master ブランチをメインにおいた場合の話をします。
ベストプラクティス:
共同編集するときは絶対にmasterに直接コミットしない。
プルリクエストのマージだけにすると安全。
原則として一つのブランチに対して基本一人で編集を行うこと。
https://gyazo.com/d0a7f4bf8ef9353203d9fd420dfc7fce
共同作業の流れ(基本編)
1. topicブランチを切る
2. 想いのままに歴史を刻む
3. PullRequest を出して他人にレビューもらう
4. マージする
1. topicブランチを切る
共同作業するときに新しいブランチを切って別の分岐をする。
特に、追加する機能ごとに切ったブランチのことをfeatureブランチと言ったりする。
code: bash
# ブランチを切る前に情報をなるべく新しくしよう(ベストプラクティス)
# いまは master ブランチの想定です
# (1) 今のブランチを確認するコマンド
# master でした
git branch
* master
# (2) master を最新にします
git pull
# (3) feature/hoge って名前のブランチを作る
# 名前はわかればいいんだけど、"feature/xxx"みたいな名前が多いです
git checkout -b feature/hoge
https://gyazo.com/f3ff1778cf0e6ab731f815283f7eb49c
3. 想いのままに歴史を刻む
ソースコードの変更をおこなう。そのあとバージョン管理のために歴史を刻む
編集したあとコミット(歴史を刻む)する
code:bash
# 変更したファイルの一覧を見る
git status
# ファイルの変更箇所を確認する
git diff
# ファイルを指定するとそのファイルだけの変更点が見れる
# ./hoge ファイルの変更点を見る
# $ git diff ./hoge
# "./hoge" ファイルを コミット対象(stage)にする
git add ./hoge
# 一応 * とか使えるので
# $ git add *.html
# とかで一気にhtmlファイルを入れたりできる
# フォルダも指定できる "." とかすると自分自身全部対象になる。
# $ git add .
# ファイルを削除したことをコミット対象にしたい場合は…
# "./hoge" ファイルの削除をコミット対象にする
git rm ./hoge
# 間違えちゃったりした場合はコミット対象から外す
git reset ./hoge
# コメントエディタで書いてコミット
git commit
# エディタを使いたくない場合は-mでコメントをかける
# $ git commit -m "コミットの説明とか"
# origin のリモートに feature/hoge っていう名前で変更をプッシュ
git push origin feature/hoge
横着して雑にコミットしたい場合は下みたいな運用もできる。(↑はこれを丁寧にやってるだけ)
code:bash
# 雑に全部突っ込む
git add --all
# 雑にコメント書く
git commit -m "hoge"
# プッシュ
git push
https://gyazo.com/ce3e7f8c600c84065662e7296a4537c7
3. PullRequest を出して他人に見てもらったりする
レビューしてもらう。
Github上からプルリクエスト作ってレビューしてもらう
https://gyazo.com/33872a0d92b01e049f9dc97e65c07a1b
画面上でこんなかんじ。
https://gyazo.com/85904a6a2e3b3ea99cc78d0225f9a611
上下関係気にせず気になる点を指摘しよう。レビューするときに役立つ慣用句。
[Q] 質問。わからなかったら遠慮なく聞こう
[MUST] 必ず修正すること。明らかにヤバいやつ。
[IMO] In My Oppinion。私の意見。こうがいいんじゃない?とか。話し合おう。
[nits] nitspick。細かいこと。誤字脱字とか。
[LGTM] Looks Good To Me。よさそう!
いいと思ったらガンガンOK出してく。おもしろ画像とか貼られたらOKとかにしておくと楽しい!
https://gyazo.com/2cb1c0c6cd94eff4bd495fd5306f519b
4. マージする
プルリクエストのマージボタンを押す
https://gyazo.com/98180d99d518abe12daaa90aba1c2d77
基本的には上記のことを問題が怒らない程度の最小の機能単位でタスクを分割して繰り返す。
細かく作業を分割することでやらないといけないタスクが見えてくる効果もある。
分割の具体例:
ボタンのデザイン変えた
画面のコーディングした。
ボタンが押したら起こることの一連の処理を実装した。
残りの基礎操作
使う上で支障がない程度の状況に応じた対処法とか。
code:bash
# リモートの状態を確認する
git fetch
# ブランチ一覧を見たい
git branch
# リモートも含めたブランチ一覧を見たい
git branch -a
# ブランチを変えたい
# hoge ブランチに切り替える
git checkout hoge
# リモートのブランチをコピーして作業したい
# hoge っていう名前でリモートの fuga ブランチを持ってくる
git checkout -b hoge origin/fuga
# hoge ブランチを削除したい
# -D = --delete
# ※今いじってるブランチは消せないので、消したい場合はブランチを切り替えるように
git branch -D hoge
# origin リモートの hoge ブランチを削除したい
git push origin :hoge
# または $ git push --delete origin :hoge
実践編
こういうときどうするかをQ&A方式で書いていく。
Q. 間違ってコミットをしてしまった
共同編集してるリモートにプッシュしてなければ間に合う。
コミットを取り消したいとき(2タイプ)
code:bash
# ファイルの修正内容ごと捨てる
git reset --hard HEAD^
# コミットを取り消したいがコミットに含まれてた修正は残したい
git reset --soft HEAD^
softとhardの違い⇒手元のファイルにするかしないか
soft 手元のファイルを変更しない
hard 手元のファイルを変更する
ちなみに
HEAD とは直近のコミットを指す
HEAD^ は一つ前のコミットを指す
HEAD^^ は更に一つ前のコミットを指す
コミットを修正したいとき
code:bash
# 直近のコミットに修正を加える
# stageしてるのは追加される、コメントも変えれる
git commit --amend
Q. 修正がよくわからなくなったからリセットしたい
code: bash
# すべての変更を直近のコミットまで戻す
git checkout .
# ./hoge ファイルを直近のミットまで戻す
git checkout ./hoge
Q. プッシュしたいけどリモートとずれててプッシュできない
自分しかいじってない場合に限り、フォースプッシュが許可される!(それ以外の場所では許されないので慎重に)
みんなが共同編集してる所にフォースプッシュすると先祖返りしたりすることになる。
code:bash
# hoge を origin にフォースプッシュ(上書き)する
git push -f origin hoge
みんなで共用しているリモートリポジトリに場合は、自分側があきらめましょう。
例えば名前を変えてプッシュしてマージしたり。
Q. PullRequestがマージできない
多分コンフリクト(競合)してます。他人と修正箇所がかぶってる状態をコンフリクトといいます。
そもそも論として大きい修正をしているうちに他人の作業がかなり進むし、変更箇所が多いので、他人の修正と同じ所を修正する可能性が増えます。なので小さい変更を短いスパンでたくさんプルリクエストとして修正を出してくようにしましょう。
https://gyazo.com/dd28e30a17760185b9d4da8760578c35https://gyazo.com/1a53c9b03dab45fe2a4de53fb61e7fb7
コンフリクトしないようにする心得
なるべく最新のコードからブランチを切る
必要な箇所だけを修正する(気になる場所があったら、また別のブランチで行う)
なるべく早くプルリクエストを作ってマージする
どうしてもコンフリクトした場合手動での修正が必要です。
https://gyazo.com/47964da9df59f0c58a0ba57ebc13d080https://gyazo.com/9e177dd376da5c2293ddf09255069acd
code:bash
# 競合している自分のブランチを hoge とする
# コミット番号 XXXX からブランチ切ったことにする
git rebase XXXXXX
# コンフリクトしたとエラーが出る
# 競合したファイルに下みたいな目印が出るのでここでコードを修正する
# 多々順番を変えるだけでいいこともあれば、書き直す必要があることもある。
# 記号の部分を見ていいとこ取りして修正しよう(慣れ)
# <<<<<<< hoge
# =======
# >>>>>>> fuga
# 修正し終わったら追加する(例えば ./piyo ファイルがコンフリクトして直したので追加したい)
git add ./piyo
# リベースを続ける
# コンフリクトが解消されれば英語でそういうメッセージが出てくるのでそこでリベース完了
git rebase --continue
# リモートの hoge を上書きする(自分だけのブランチのハズなのでフォースプッシュで問題なし)
git push -f origin hoge
リベースとはブランチを切ったベースとなってるコミットを差し替える作業です。
https://gyazo.com/600bbcee847316b7828c26ac56c2ddf5
Q. 変更したファイルがある状態でブランチを変えたいけどエラーが出る
スタッシュして持ってきましょう。
スタッシュとは変更を一時退避しておく所です。
code:bash
# 変更点を一時退避してまっさらな状態にする
git stash
# ブランチを変更する
git checkout fuga
# 一時退避したものをすべて戻す
git stash pop
コンフリクトと同じエラーが出るときもあるのでそのときは、リベースと同じようにコンフリクトを解消しよう。
stash自体もっと高度な使い方できますので、それ以上はgoogleさんに。
応用編
使う上で支障がない以上のこと
自由に歴史改竄できるようになると自由にgit使えるようになるよねっていう話。
TODO: チェリーピック ... 好きな所からコミットを持ってきて歴史に追加する
TODO: スカッシュ ... 複数のコミットを一つのコミットにまとめる
TODO: インタラクティブリベース ... コミットの順番を変えたり、コミットをまとめたり自由に歴史改竄をする
Let's 歴史修正主義!