Gitはファイルのバージョン管理をする為のもの
バージョン管理をしないと、最新状態がわからなくなったり、いつ誰が何を変更したのかわからない。また、上書き修正してしまう恐れがある。
それらを防止するためにGitが使われる。
【構成】
個人ファイル → ステージングエリア → ローカルリポジトリ → リモートリポジトリ
個人ファイル → ステージングエリア:git add
ステージングエリア → ローカルリポジトリ:git commit
ローカルリポジトリ → リモートリポジトリ:git push
リモートリポジトリ → ローカルリポジトリ:git pull
・バージョン確認
git version
・初期設定
〇ユーザー名登録
git config --global user.name "github user name"
git config user.nameで登録確認
〇メールアドレス登録
git config --global user.email "github@useremail"
git config user.emailで登録確認
〇使用エディタの登録
git config --global core.editor "atom --wait"
git config core.editorで登録確認
・ローカルリポジトリの作成
リポジトリとは、ファイルやディレクトリの状態、変更履歴を記録する場所。
"git init"コマンドでリポジトリを新規作成する
→.gitディレクトリが作成され、変更ごとにファイルが格納される
・既にGithub上にあるプロジェクトをローカルにコピーする
git clone <Github上のアドレス>
・変更確認
〇変更確認
git diff :個人ファイルとステージングエリアとの違い
git diff --staged :ステージングエリアとローカルリポジトリの違い
〇変更履歴の確認
git log --oneline #一行で表示する
git log -p index.html #ファイルの変更差分を表示する
git log -n <コミット数> #表示するコミット数を制限する
・削除
〇ファイルの削除(ローカルリポジトリとファイル自身)
git rm <ファイル名>
git rm <ディレクトリ名>
〇ファイルを残したいとき(ローカルリポジトリからは削除するが、ファイル自身は残す)
git rm --cached <ファイル名>
・取り消し
・変更を取り消す
git checkout -- <ファイル名> #個人ファイルの復元
git checkout -- <ディレクトリ名> #個人ファイルの復元
git checkout -- . #全変更を取り消す
git reset HEAD <ファイル名> #ステージの復元
git reset HEAD <ディレクトリ名> #ステージの復元
git reset HEAD . #全変更を取り消す
git commit --amend #直前のコミットをやり直す(pushしたコミットはやり直してはいけない)
・移動
・ファイルの移動
git mv <旧ファイル> <新ファイル>
下記コマンドと同じ内容
mv <旧ファイル> <新ファイル>
git mv <旧ファイル>
git add <新ファイル>
・リモートリポジトリ
〇リモートリポジトリ(Github)を追加
git remote add origin <リモートリポジトリURL>
〇リモートリポジトリ(Github)を新規追加
git remote add origin <リモート名><リモートリポジトリURL>
〇push
git push <リモート名><ブランチ名>
git push -u origin master #初回のみ実行、次回以降git pushコマンドのみでpushできるようになる
・エイリアス
〇コマンドにエイリアス(別名)を付ける
→毎回長いコマンドを入力するのが面倒
git config --global alias.ci #ci=>commit
git config --global alias.st #st=>status
git config --global alias.br #br=>branch
git config --global alias.co #co=>checkout
--globalを付けるとPC全ユーザーに反映
〇エイリアスを削除する方法
git config --global --unset alias.co
〇エイリアスの一覧を確認する
git config --global --list
・ignore
〇バージョン管理したくないファイルを記載した.gitignoreファイルを作成する
.gitignore
#から始まる行はコメント扱い
〇指定したファイルを除外
index.html
〇ルートディレクトリを指定
/root.html
〇ディレクトリ以下を除外
dir/
〇/以外の文字列にマッチ[*]
/*/*.CSS
・リモート
〇リモート情報を表示する
git remote
git remote -v #対応するURLを表示
〇リモートから情報を取得する(ローカルリポジトリに保存してから、個人ファイルに反映)
git fetch <リモート名>
git fetch origin
情報はローカルリポジトリのremoteフォルダに格納されるため、個人ファイルには反映されない。反映させるコマンドはマージを使用する
git merge /origin
〇リモートから情報を取得する(直接、個人ファイルに反映)
git pull<リモート名><ブランチ名>
git pull origin master
上記コマンドは省略可能
git pull
これは下記コマンドを実行したのと同じこと
git fetch origin master
git merge origin master
〇pullとfetchの使い分け
pullはリモートから直接情報を取得できるので楽だが、挙動が特殊なので慣れるまでは、fetch・mergeの方が良い
〇リモートの詳細情報を表示したい時
git remote show <リモート名>
git remote show origin
〇リモートを変更する
git remote rename <旧リモート名><新リモート名>
git remote rename turorial new_turorial
〇リモートを削除する
git remote rm <リモート名>
git remote rm new_turorial
・ブランチ
〇ブランチとは
分岐することで複数機能を同時並行で開発するための仕組み
ブランチとはコミットを指すポインタ
〇ブランチを作成するだけで、ブランチの切り替えまでは行わない
git branch <ブランチ名>
git branch feature
〇ブランチの一覧を表示する
git branch
git branch -a #すべてのブランチを表示する
〇ブランチを切り替える
git checkout <既存ブランチ名>
git checkout feature
〇ブランチを新規作成して切り替える
git checkout -b <新ブランチ名>
-bオプションを付けるとブランチの作成と切り替えを一度にしてくれるので便利
〇ブランチを変更する
git branch -m <ブランチ名>
git branch -m new_branch #自分が作業しているブランチの名前を変更する
〇ブランチを削除する
git branch -d <ブランチ名>
git branch -d feature #masterにマージされていない変更が残っている場合削除しない
〇強制削除する
git branch -D <ブランチ名>
・マージ
〇マージとは
他の人の変更内容を取り込む作業の事
git merge <ブランチ名>
git merge <リモート名/ブランチ名>
git merge origin/master #作業中のブランチにマージする
〇マージの概念
マージには3種類ある
1種類目:Fast Foward、早送りになるマージ
ブランチが枝分かれしなかったときは、ブランチのポインタを前に進めるだけ
2種類目:Auto Merge、基本的なマージ
枝分かれして開発していた場合、マージコミットという新しいコミットを作る
3種類目:コンフリクト
同じファイルの同じ行に対して異なる編集を行った時に発生
GitHubを利用した開発手順
プルリクエストの流れ
プルリクエストとは、自分の変更したコードをリポジトリに取り込んでもらえるように依頼する機能
1.ローカルリポジトリのmasterブランチを最新に更新
2.ローカルリポジトリに新しいブランチを作成
3.ローカルリポジトリのファイルを変更
4.変更をコミット
5.GitHub(リモートリポジトリ)へプッシュ
6.GitHubでプルリクエストを送る
7.コードレビューしてもらう
8.プルリクエストをマージ
9.ブランチを削除
10.GitHub上のmasterをローカルリポジトリへpullし最新状態にする
11.ローカルリポジトリのブランチを削除
GitHub Flowの流れ
GitHub社のワークフロー
master → branch → プルリクエスト → master ...
・リベース
〇リベースとは、履歴をきれいに整えた形で変更を統合する
git rebase <ブランチ名> #ブランチの基点となるコミットを別のコミットに移動する
〇リベースとマージの違い
履歴が一直線かそうでないか
〇リベースでしてはいけないこと
GitHubにプッシュしたコミットをリベースするのはNG
git push -f は絶対NG
〇マージかリベースは考え方次第
・マージ
メリット:コンフリクトの解決が比較的簡単
デメリット:マージコミットがたくさんあると履歴が複雑化する
・リベース
メリット:履歴をきれいに保つことができる
デメリット:コンフリクトの解決が若干面倒(コミットそれぞれに解消が必要)
〇使い分け
作業の履歴を残したいならマージ、履歴をきれいにしたいならリベース
・タグ
〇タグ
コミットを参照しやすくするために分かりやすい名前を付けるのがタグ。
リリースポイントに使用される。
git tag #すべてのタグが表示される
git tag -l 201705 #201705に該当するタグが表示される
〇タグには、注釈付き版(annotated)と軽量版(lightweight)の2種類がある
注釈付き版(annotated)、情報量がある正式版。
軽量版(lightweight)、情報量が少ない省略形。
よく使用されるのが注釈付き版。
〇注釈付き版(annotated)
git tag -a [タグ名] -m "[メッセージ]"
git tag -a 20170520_01 -m "version 20170520_01"
-aオプションを付けると注釈付きタブを作成。
-mオプションを付けるとエディタを立ち上げずにメッセージを入力できる
〇軽量版(lightweight)
git tag [タグ名]
git tag 20170520_01
〇後からタグ付けする
git tag [タグ名][コミット名]
git tag 20170520_01 8a5cbc4
〇タグのデータを表示する
git show [タグ名]
git show 20170520_01
〇タグをリモートリポジトリに送信する
git push [リモート名][タグ名]
git push origin 20170520_01
git push origin --tags
--tagsを付けるとローカルにあってリモートリポジトリに存在しないタグを一斉に送信する。
・スタッシュ
〇作業が途中でコミットしたくないけど、別のブランチで作業しないといけない。
そういう時に作業を一時避難する。
git stash (= git stash save)
〇避難した作業を確認する
git stash list
〇避難した復元する
git stash apply #最新の作業を復元する(ワークのみ)
git stash apply --index #ステージの状況も復元する
〇特定の作業を復元する
git stash apply [スタッシュ名]
git stash apply stash@{1}
〇避難した作業を削除する
git stash drop #最新の作業を削除する
〇特定の作業を削除する
git stash drop [スタッシュ名]
git stash drop stash@{1}
〇全作業を削除する
git stash clear