とりあえずこれだけ知っていれば
お仕事ができる(であろう)gitガチ入門
〜ソースのクローンからコミットのプッシュまで〜
gitってなんすか? ('A`)y-~
wikipediaより
なんでこういう技術的な事って
わざわざ難しく書くの?
バージョン管理を使ってないソース管理の事例
個人用PC 個人用PC 個人用PC
共有PC
WEBサーバー
直接改修
直接改修
直接改修
デプロイ
(FFFTP)
('A`)y-~ 私の前職での環境です
今日の目標
無理に使い方を覚えようとするのではなく、興味を持って頂く事。
使い方の解説も行いますがこんなスライドのみで使い方を覚えるなんて無理な話なので
こんな使い方出来るんだよ〜、という事を知って「使ってみたい」と思って頂きたいと。
結局gitって何よ?
とにかくわかりやすく、乱暴に解説
ファイルに対して「誰が」「いつ」「何を変更したか」というような
情報を記録することで、過去のある時点の状態を復元したり変更内容の差分を
表示できるようにするシステムのこと。
よくわからないから図で見せて
ひのきのぼう と きのたて 買った
なんか女の子仲間になった
レベル10まで上げた
お墓のボス倒した
女の子に危ない水着買ってやった
ひとりになった
gitのリポジトリ関係図
ローカル
リポジトリ
ローカル
リポジトリ
リモートリポジトリ
ソースの
作成・改修
ソースの
作成・改修
ローカル環境
コミット作成 コミット作成
コミットのpush コミットのpush
コミットのclone
merge / rebase
コミットのclone
merge / rebase
実際にやってみます
※注意※
解説中に出てくるorigin/masterというブランチ名はプロジェクトによって異なる可能性があります。
その際は脳内で読み替えてください(・∀・)
git clone
ローカル
リポジトリ
リモートリポジトリ
ローカル環境
コミットのクローン
https://github.com/vjsigsig/testhoge.git
リポジトリURL
ひのきのぼう と きのたて 買った
なんか女の子仲間になった
レベル10まで上げた
お墓のボス倒した
女の子に危ない水着買ってやった
ひとりになった
git log
git log
プロジェクトの歴史が表示されます。下であれば古く、上に行くほど新しくなります。
一つ一つのコミットそれぞれにソースコードの改変や新規作成をしたんだよ。という歴史の単位と認識頂ければわかりやすいと思います。
正確にはコミットを表すものは黄色い文字の「239b4fc787・・・・」ですが、これだけだとなんのコミットなのか意味がわからないので
「Logクラスの実装」などわかりやすく名前をつけてあげます。(コミットメッセージ)
コミットメッセージのガイドライン
✔コミット名と本文の間は一行空けよう
✔コミット名は50文字以内で!(つまり日本語だと25文字までって事ですね)
✔本文は一行72文字以内で!(つまり日本語だと36ry)
✔「何をしたか」よりも「なぜそうしたか」を書くように意識しよう
git status
ファイルの状態
 [modified:]
既存のファイルに変更があったよ、という状態です。
 [Untracked]
gitの管理下に無いファイルが存在してるよ。という状態です。
つまり新規作成されたファイルですね。
 [both modified:]
取り込んできたコミットの内容と自分が編集した(だけではありません)箇所等で
変更内容が重複しており、どちらを反映させればよいかgitだけでは判断ができず
ユーザーの修正を待っている。という状態です。コンフリクトと言います。
git status
現在の状態から、どのファイルが変更されたか。どのファイルが新たに追加されたか。という情報を閲覧できます。
こちらのコマンドは恐らくgitで最も使うコマンドかと思います。
コミットを作成する前や作成した後など、何かしらの変更を加えた際は都度git statusで確認する癖をつけると安心です。
git add / git commit
git add
新規作成されたファイルや、変更のあったファイルをインデックスに追加、ステージングに追加など難しい言い方をされることが多いですが
簡単に言うと次回コミットの対象にするファイルを選択するコマンドです。
modified: wasshoi1.txt
modified: wasshoi2.txt
Untracked files
./wasshoi7.txt
modified: wasshoi4.txt
modified: wasshoi5.txt
new file: wasshoi8.txt
wasshoi4,5,8を修正・追加
#modified: wasshoi4.txt
#modified: wasshoi5.txt
#new file: wasshoi8.txt
なんか一人になった
#deleted: onnna.txt
add前の編集中のファイル
ステージングに登録中の
ファイル
ローカルコミット
git commit
git add で登録したファイルをコミットという単位にパッケージ化して登録するコマンドです。
1コミットはなるべく規模を小さく区切ると、バグの調査やコミットの取り消しが容易になるというメリットがあります。
git fetch
git fetch
ローカルリポジトリをリモートリポジトリと同期させます。 つまり自分の環境にリモートリポジトリの情報を取ってくるコマンドです。
ただし、実行した時点でコミットが反映されるわけではなく、あくまで後程ご紹介するコミットを反映させる準備を整えるだけです。
リモートリポジトリ
リモートの状態を
fetch
ローカル
リポジトリ
git rebase
git rebase
rebaseは少し複雑で、リモートリポジトリから取得したコミット(正確にはorigin/masterに格納されているコミット)をローカルリポジトリに
反映させるコマンドですが、もう一つ役割があります。
リモートからコミットを反映させる際、ローカルのみに存在しているコミットがあった場合、一旦そのコミットを亜空間に移します。
その状態でリモートからのコミットを反映させ、先程亜空間に送ったコミットを元にコミット内容を忠実に再現し、現在のコミット群の上に
積む。という複雑な事をしています。
亜空間から取出したコミットはあくまで再現なので、コミット識別番号(ハッシュ値)はrebase前のものとは異なります。
ローカル
ゲームオーバーになっ
た
ひとりになった
危ない水着買ってやっ
た
origin/master
お金が無くなった
イケメンになった
ひとりになった
危ない水着買ってやった
rebase origin/master
ローカル
ひとりになった
危ない水着買ってやっ
た
ゲームオーバーになった
ローカルのみの
コミットを亜空間へ
合体後ローカル
お金が無くなった
イケメンになった
ひとりになった
危ない水着買ってやっ
た
ゲームオーバーになった
再現
合体
git push
ローカル
リポジトリ
リモートリポジトリ
ローカル環境
コミットのプッシュ
https://github.com/vjsigsig/testhoge.git
リポジトリURL
git push
ローカルにて作成したコミットをリモートリポジトリに反映させるコマンドです。改修・追加したコミットは最終的にこのコマンドによって
リモートリポジトリに送られ、改修を終えます。(現実的にはレビューや新たに発生したバグで更にコミットを追加するのですが…)
ローカル
ゲームオーバーになった
ひとりになった
危ない水着買ってやった
女の子仲間になった
リモート
ひとりになった
危ない水着買ってやった
女の子仲間になった
ゲームオーバーになった
push
その他便利なコマンド
git branch
ブランチの概念は麻雀に於ける平和のようなもので、gitでの基本概念ではあるのですが、実際にgitを運用せずに理解するのは
非常に難解です。今回の解説では、あえてブランチについては触れないようにさせて頂きました。
ぜひ実際に自分自身で運用し、ブランチの便利さと面白さを知って頂きたいと。
こちらのコマンドでは、そのブランチ名・ブランチの状態を確認することができます。
大まかにブランチは3種類あり、それぞれオプションを指定することで確認可能です。
ローカルブランチ
story
character
master_test
master
トラッキングブランチ
origin/story
origin/character
origin/master
git branch git branch -vv
リモートブランチ
origin/logic
origin/story
origin/character
origin/master
git branch -r
git stash
改修中のファイル(例によって厳密にはファイル単位ではありませんが)を亜空間に送り込むコマンドです。
modifiedやdeleted状態のファイルが、移動元・移動先何れかにしか存在していないコミットの中に含まれていた場合、ブランチ間の移動が
出来ないなど、改修の真っ只中の状態は割と制約を受ける事が多いです。
こちらのコマンドで今の変更を一時的に亜空間に送り込みましょう。 もちろん後から取り出せるのでご安心を。
ただ、stashは割と信用できない所があり、個人的にはstashに頼りすぎずこまめにコミットしてしまう事をおすすめします。
modified: wasshoi1.txt
modified: wasshoi2.txt
deleted: wasshoi3.txt
add前の編集中のファイル
nothing to commit,
working directory clean
未編集状態
『体験した事故事例』
うっかりHEADコミットで1000行程改修してしまったので、目的のコミットに反映させるため手動rebase(rebase -i)を行う。
目的のコミットをHEADにし、stash popした時点でちょっと用事を思い出し、手動rebase取消(rebase --abort)。
stash pop → No stash found. → 地獄
①git stash
①git stash
②git stash pop
②git stash pop
git diff
現在行っている修正を、指定の箇所・ファイル・状態と比較して確認できるコマンドです。
デフォルトでは、最新のコミットとの比較に見えるのですが、正確にはインデックスとの比較です。addでインデックスに登録した後再度同じ
ファイルを修正し、git diffを使用すると再現できます。
様々な対象との比較が出来るので汎用性が高く、こちらもよく使うコマンドの一つです。
@@ -308,28 +308,28 @@ class Team
/**
* フィーバータイムログstructure形式に変換する
- * @param array $fever_time_log フィーバータイムログ
- * @param int $fever_interval フィーバーの時間
- * @return array <structure name="FeverLog">型
+ * @param array $fever_time_log フィーバータイムログ
+ * @param int $fever_interval フィーバーの時間
+ * @return array <structure name="FeverLog">型
*/
- static public function toFeverLogStructure($fever_time_log, $fever_interval)
+ public static function toFeverLogStructure($fever_time_log, $fever_interval)
現在の修正 と インデックスとの比較
$ git diff
現在の修正 と HEADコミットとの比較
$ git diff HEAD^
インデックス と HEADコミットとの比較
$ git diff --cached
特定のファイル と 特定のファイルとの比較
$ git diff ./hoge1.txt ./hoge2.txt
その他コマンド、ざっくり紹介
$ git checkout
1.ローカルブランチを切り替える  2.ローカルブランチを作成して切り替える  3.ファイルをHEADコミット時の状態に戻す
これ以外にもたくさんの機能があり、覚えたての頃は、わかりにくいからコマンド分けろや!! と思っておりましたw
$ git reset
1.指定のコミットまで打ち消す  2.ファイルのインデックス登録を取り消す
こちらもcheckoutと同じく、似てるようで全く違う事をやる系です。
$ git cherry-pick
別のブランチからコミットを引っ張り込みます。 masterに居ながらorigin/characterなどのトラッキングブランチからも直接取り出す
事も可能ですが、元となるファイルが無かったり、あまりにも差分が大きい場合はコンフリクトしたり等、すんなりいかない事が多い
です。
まとめ
・後半は割と突っ込んだコマンドの紹介をさせて頂きましたが最初は clone ~ pushまでの
流れを覚えておけば OKです。 使っていくうちに自然と身についていきます。
・繰り返しになりますが、こんなスライドだけで全部覚えようとしても難しいです。
実際に手を動かして実行結果を自分で確認しながら学ぶ学習法に勝るものは無いです。
・gitが楽しく感じてきたら後は時間の問題。
参考資料
サルでもわかるGit入門 〜バージョン管理を使いこなそう〜 http://www.backlog.jp/git-guide/
Gitがこわくて触れなかったけど、このスライドで
理解できるようになったよGitサイトまとめ
http://programmerbox.com/2013-07-17_git_summary/
Git ワークフローとそのチュートリアル | アトラシアン https://www.atlassian.com/ja/git/workflows

とりあえずこれだけ知っていればお仕事ができる(であろう)gitガチ入門