図書館でこのような本を借りたので,
Gitをちゃんと勉強してこなかった私のメモ.
とっても読みやすくてわかりやすかった.
問題はこの後自分がどれだけ使っていけるかだと思う.
*Gitの基礎知識*
・Gitはバージョン管理システムである
・他にもCVSとかSubversionといったものが存在する
・集中型バージョン(リポジトリはリモートだけ)管理システム:CVS,Subversion
・分散型バージョン(リポジトリをリモートとローカルで持つ)管理システム:Git
・作業ディレクトリ、ステージング・エリア、Gitディレクトリの3つのデータ領域がある
*Gitを使った作業の流れ*
① 作業ディレクトリへ移動
② Gitリポジトリを作成(git init)
[リポジトリの状態の確認(git status)←適宜必要な時に]
④ Git管理するファイルをステージング・エリアに登録(git add [file])
⑤ ステージング・エリアに登録された内容を
Gitディレクトリに登録(git commit -m “[message]”)
⑥ ファイルを編集
⑦ 変更をステージング・エリアに登録(git add [file] or git add .)
⑧ ⑦をローカルリポジトリに登録(git commit -m “[message]”)
*Gitの設定*
Gitの設定ファイルは3種類存在する.
設定ファイル | 変更するためのコマンド |
/etc/gitconfig | git config –system <引数> |
~/.gitconfig(アカウント毎の共通設定) | git config –global <引数> |
各プロジェクト内の .git/config | git config <引数> |
・ユーザ情報の登録
Gitでコミットを行う際は,ユーザ情報が必要となるので登録してみる.
1 2 |
$ git config --global user.name "USERNAME" # ユーザネームの登録 $ git config --global user.email "E-MAIL" # メールアドレスの登録 |
・コマンドのエイリアス登録
長いコマンドとかをエイリアス登録して使いやすくする.
1 2 |
$ git config --global alias.co checkout # checkoutをcoに $ git config --global alias.ci commit # commitをciに |
*Gitの準備と基本操作*
・1からリポジトリを作りたい
(シチュエーション)
リポジトリを作成したいとき。
1 |
$ git init <filename> |
・既存のリモートレポジトリを使いたい
(シチュエーション)
既存のリモートレポジトリの複製をローカル環境に作成したいとき。
1 |
$ git clone <repoURL> <copyする場所> |
・ファイルの状態を確認したい
(シチュエーション)
ステージング・エリアに登録したいファイルや,次回コミット時に変更履歴として
Gitで管理されるファイルを確認したいとき。
1 |
$ git status |
・変更内容をステージング・エリアに登録したい
(シチュエーション)
新しいファイルや,変更されたファイルの内容をステージング・エリアに登録したいとき。
1 2 3 4 5 6 7 |
$ git add <filenames> $ git add . # 登録されているファイル全てをadd (オプション) -p : 変更箇所を確認しながら,1ファイルずつステージング・エリアに登録 -u : すでにGitで管理しているファイルの全ての変更をステージング・エリアに登録 -A : まだGitで管理していないファイルも含め,全ての変更をステージング・エリアに登録 |
・ステージング・エリアの変更内容をコミットしたい
(シチュエーション)
ステージング・エリアの内容をGitディレクトリに登録したいとき。
1 2 3 4 5 6 |
$ git commit (オプション) -m <msg> : メッセージを指定してコミットする -a : ステージング・エリアに変更内容が登録されているか関係なく, Git管理されている全ファイルの変更をコミットする |
1 |
$ git reset <filename> |
・ファイルをGit管理から削除したい
(シチュエーション)
作業ファイルのファイルから特定のファイルを削除しても,
ステージング・エリアのファイルは削除されないので,
ステージング・エリアに対し削除情報を登録したいとき。
(尚、Gitディレクトリには過去のリポジトリを保つためファイルは削除されない)
1 2 3 4 |
$ git rm <filename> (オプション) --cached : ステージング・エリアから削除されるが,作業ディレクトリ上のファイルは消えない |
・ファイル名を変更したい
(シチュエーション)
ファイル名を変更したり,ファイルを移動したりしたいとき。
1 |
$ git mv <old_filename> <new_filename> |
・Git管理していないファイルだけ削除したい
(シチュエーション)
Git管理していない作業ディレクトリ上のファイルを削除したいとき。
1 2 |
$ git clean -n # cleanされるファイルの一覧 $ git clean -f # git管理されていないファイルの削除 |
・Git管理の除外対象ファイルを設定したい
(シチュエーション)
*.logや*.bakなどリポジトリの管理から除外したいファイルを設定したいとき。
ここを参考に編集するのがいい
1 2 3 4 5 6 7 8 9 |
$ vi .gitignore # .gitignoreが設定ファイルなのでこれに記述する (記述ルール) ・空白行は無視される ・#で始まる行はコメント ・#のファイルを除外する場合は\でエスケープ $ git add .gitignore # ステージングエリアに登録 $ git commit # Gitディレクトリにも登録 |
・Git管理しているファイルを後から除外対象に設定したい
(シチュエーション)
一度ステージングエリアに登録していしまったファイルを,
後から除外対象ファイルに設定したいとき。
1 2 3 |
$ vi .gitignore # Git除外対象を定義 $ git rm --cached <新たに除外対象にするファイル> # ステージングエリアから削除 $ git add .gitignore # .gitignoreファイルを登録 |
・除外対象に設定されているファイルをステージングエリアに登録したい
(シチュエーション)
除外対象のファイルを強制的にステージングエリアに登録したい場合。
1 |
$ git add -f <filename> |
・空のディレクトリをGit管理したい
(シチュエーション)
事前に空のディレクトリを準備しておいて,
都度Git管理するファイルを増やす形を取りたいとき。
1 2 3 |
$ touch <dirname>/.gitkeep $ git add <dirname> $ git commit <dirname>/.gitkeep -m "Added empty dir." |
・変更内容を一時的に退避したい
(シチュエーション)
Git管理されているファイルをちょこっといじってみたいだけで,
いちいちその変更をリモートリポジトリに反映させたくないとき。
stashという領域を用いてそこに退避させておくイメージ。
1 2 3 4 5 6 7 8 9 10 11 |
$ git stash save "stash1" # 一時退避した内容のリスト(stashファイルを確認する時に便利) $ git stash list # 一時退避した内容を反映 $ git stash pop stash@{0} --index # 一時退避した変更内容を削除 $ git stash drop stash@{0] # 一時退避した変更内容の変更点を確認 $ git stash show stash@{0} -p # 一時的に退避した変更内容を全て削除 $ git stash clear |
*リポジトリの操作*
・リポジトリを変更履歴の状態に戻したい
(シチュエーション)
現在の状態を特定の変更履歴に戻し,そこからまた異なる変更をしていきたい場合。
1 2 3 4 5 6 7 8 |
$ git log # コミットIDを確認する $ git reset <commitID> (オプション) --soft : HEADの位置を変更する。ステージングエリアと作業ディレクトリの状態に影響なし。 コミットのみをやり直したい場合に利用。 -- mixed : HEADの位置を変更し,ステージングエリアの状態も戻す。 作業ディレクトリには影響なし。 -- hard : HEADの位置を変更し,ステージングエリアと作業ディレクトリの状態も戻す。 |
・特定のファイルを指定した変更履歴の状態に戻したい
(シチュエーション)
特定のファイルを指定した変更状態に戻したい場合。
1 2 |
$ git log <filename> # ファイルの変更履歴を確認 $ git checkout <commitID> <filename> # commitIDを指定して元に戻す |
・特定のファイルを過去の変更履歴から完全に削除したい
(シチュエーション)
パスワードが記載されたファイルを履歴に含めてしまうと,
対象ファイルを削除したとしても履歴に残ってしまい,
そこから復元されてしまう。
過去の変更履歴を含めてファイルを完全に消去したい場合。
1 2 3 |
$ git filter-branch --tree-filter # これで履歴も含め完全にファイル削除 # リモートリポジトリに反映させたい場合 $ git push -f |
・間違えて戻してしまった変更履歴を元に戻したい
(シチュエーション)
git reset –hard などを誤って実行してしまい,
意図せず変更履歴を戻してしまったとき。
1 2 |
$ git reflog # HEADブランチの変更履歴を表示 $ git reset --hard <commitID> # 変更前に戻す |
・特定の変更履歴の内容をなかったことにしたい
(シチュエーション)
変更履歴に問題が見るかり,その変更自体をなかったことにしたい場合。
git reset との一番の違いは特定の変更履歴をなくすためのコミットを作る点。
1 2 3 4 5 |
$ git revert <commitID> (オプション) --no-edit : コミットメッセージが自動で適用される。 -n : 変更履歴の自動登録が行われなくなる。 -m parent-number : マージコミットでも元に戻す変更ができる。 |
・複数の変更履歴を1つにまとめたい
(シチュエーション)
複数の変更履歴を1つにまとめて整理したい。
1 2 3 4 5 6 7 8 9 |
$ git rebase -i <commitID(treeの親)> (オプション) -p : このコミットをそのまま採用する -r : コミットメッセージを編集する -e : このコミットの内容を編集する -s : このコミットを、それ以前のコミットにマージする -f : このコミットを、それ以前のコミットにマージする(コミットメッセージは破棄する) -x : 指定したコマンドを実行する 行を削除する : このコミットを削除する |
*ブランチとタグの操作*
・新しいブランチを作成したい
(シチュエーション)
複数人で同じプロジェクトを扱うときに,目的毎にブランチを作成したいとき。
1 2 3 4 5 6 |
$ git branch # ブランチの一覧を表示 $ git branch <new branch name> # 新しいブランチを作成 $ git branch -b <new branch name> # -b オプションをつけると作成とHEADの切り替えを同時に行う |
・ブランチの一覧と現在のブランチを表示したい
(シチュエーション)
ブランチの一覧を表示したい、現在のブランチを表示したいとき。
1 2 3 4 |
$ git branch (オプション) -r : リモートリポジトリに対応する追跡ブランチの表示 -a : ローカルリポジトリのブランチと,リモートリポジトリに対応する追跡ブランチの一覧の表示 |
・ブランチ名を変更したい
(シチュエーション)
ブランチ名を変更したいとき。
1 |
$ git branch -m <old branch name> <new branch name> |
・ブランチを削除したい
(シチュエーション)
ブランチを削除したいとき。
1 |
$ git branch -d <branch name> |
・他のブランチに切り替えたい
(シチュエーション)
現在作業中のブランチを他のブランチに切り替えたいとき。
1 |
$ git checkout <new branch> |
・ブランチをマージしたい
(シチュエーション)
ブランチをマージしたいとき。
1 |
$ git merge <branch name> # HEADのブランチに<branch name>がマージされる |
・ブランチをリベースしたい
(シチュエーション)
マージのように新たな変更履歴を作らずに、ブランチを統合したい。
1 |
$ git rebase <branch name> # <branch name> に対してリベースされる |
・他のブランチの一部変更履歴を取り込みたい
(シチュエーション)
git merge や git rebase だと対象のブランチの変更履歴を全て取り込んでしまう。
全てではなく,一部だけを取り込みたいとき。
1 2 3 4 5 |
$ git cherry-pick <commitIDs> # 複数のコミットIDを指定できる (オプション) -e : コミットメッセージを編集 -n : コミットが行われず,取り込んだ変更履歴がステージングエリアに登録された状態になる -m parent-number : マージコミットで複数の親がいる時に,どちらを利用するか指示できる |
・コンフリクトを解消したい
(シチュエーション)
マージを行うと
①マージ後の変更内容を作成
②作成した変更内容をコミット
という2つの処理が自動的に行われる。
コンフリクトが起こると①だけが行われ,
変更内容はステージングエリアのみに登録された状態となる。
マージを完了させるには,①で作成された変更内容を手作業で修正し,
コンフリクトを解消する必要がある。
1 2 3 4 5 6 7 8 |
$ git status # コンフリクトが発生するとboth modifiedと表示される # コンフリクトが発生したファイルをチェック <<<< と ====で囲まれた部分は現在のブランチで変更した内容を含んでいる ==== と >>>> で囲まれた部分はマージ先として指定したブランチの変更した内容を含んでいる ファイルを望ましい形に修正する $ git add <file> # ステージングエリアに登録 $ git commit # commitする |
・新しいタグを作成したい
(シチュエーション)
新しいタグを作成したいとき。
1 |
$ git tag <tagname> |
・タグを削除したい
(シチュエーション)
タグを削除したいとき。
1 |
$ git tag -d <tang name> |
*リモートリポジトリの操作*
・リモートリポジトリの情報を確認したい
(シチュエーション)
リモートリポジトリの情報を確認したいとき。
1 |
$ git remote -v |
・リモートリポジトリを追加・削除したい
(シチュエーション)
複数のリモートリポジトリと連携して,それぞれのリモートリポジトリに対して
変更履歴を反映したり,取り込んだりするとき。
1 2 3 4 5 6 |
# リモートリポジトリを追加する場合 $ git remote -v # 連携しているリモートリポジトリを確認 $ git remote add <reponame> <repoURL> # 連携先のリモートリポジトリを追加 # リモートリポジトリを削除したい場合 $ git remote remove <reponame> |
・リモートリポジトリの設定内容を変更したい
(シチュエーション)
リモートリポジトリの設定を変更したいとき。
1 2 3 4 5 |
# リモートリポジトリのリポジトリ名を変更したい場合 $ git remote rename <oldreponame> <newreponame> # リモートリポジトリのURLやプロトコルを変更したい場合 $ git remote set-url <reponame> <repoURL> |
・リモートリポジトリの変更内容を取り込みたい
(シチュエーション)
リモートリポジトリの変更内容を取り込みたいとき。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# git fetch を利用する場合 $ git fetch <reponame> $ git marge <追跡用ブランチ> # git pull を利用する場合 $ git pull <reponame> $ git pill --rebase <reponame> # margeでなくrebaseを行いたい場合 (オプション) $ git fetch --all 全てのリモートリポジトリから変更履歴を取得する。 $ git fetch --tags リモートリポジトリから変更履歴とタグを取得する。 $ git fetch --prune リモートリポジトリ上から削除されたブランチやタグを,ローカルリポジトリからも削除する。 $ git pull --no-ff 必ずマージコミットを作成するオプション。 |
・ローカルリポジトリの変更をリモートリポジトリに反映したい
(シチュエーション)
ローカルリポジトリの変更履歴をリモートリポジトリに反映したいとき。
1 2 3 4 5 6 7 8 |
$ git push <remoterepo-name> <branch-name> (オプション) $ git push -f リモートリポジトリに変更履歴をプッシュするためには,ローカルリポジトリの変更履歴が リモートリポジトリの最新の変更履歴を含んでいる必要がある。 変更履歴が途中までしか含まれていないと, プッシュ時にマージ処理が必要となってしまうためだ。 -f オプションを指定するとこの制限が解除される。 |
・ローカルリポジトリに作成したタグをリモートリポジトリに反映したい
(シチュエーション)
ローカルリポジトリに作成したタグをリモートリポジトリに反映したいとき。
1 2 3 |
$ git tag # タグを確認 $ git ls-remotge --tags # 対象タグがリモートリポジトリに存在しないことを確認 $ git push <reponame> <tagname> |
・リモートリポジトリ上のブランチを削除したい
(シチュエーション)
リモートリポジトリ上のブランチを削除したいとき。
1 2 3 4 |
$ git ls--remote --heads # リモートリポジトリ上のブランチの一覧 $ git push <reponame> :<branchname> (オプション) -n : 削除される予定のブランチが表示される |
・リモートリポジトリ上のタグを削除したい
(シチュエーション)
リモートリポジトリ上のタグを削除したいとき。
1 2 3 4 |
$ git ls-remote --tags # リモートのタグの一覧を表示 $ git push <reponame> :<tagname> (オプション) -n : 削除されるタグの一覧を表示 |
・リモートリポジトリ上で削除されたブランチやタグをローカルリポジトリに反映したい
(シチュエーション)
リモートから削除しても,ローカルには反映されずブランチやタグが残ったままになってしまう。
ローカルからも削除したいとき。
1 2 3 4 5 |
# ブランチを反映したい場合 $ git fetch --prune <reponame> # タグを反映したい場合 $ git fetch --tags <reponame> |
*リポジトリ内を調べる*
1 2 3 4 5 6 7 8 9 10 |
$ git log # リポジトリの変更履歴を確認 $ git show <commitID> # リポジトリの状態は変更せずに,ある時点の変更履歴の状態を確認する $ git blame <filename> # 指定したファイルの行単位の変更履歴を確認したい場合 $ git diff # 作業ディレクトリとステージングエリアの差分 $ git diff --no-index <path> <path> # 指定した2つのパス間の差分 $ git diff --cached <commitID> # ステージングエリアと指定したコミットの差分 $ git diff <commitID> # 作業ディレクトリと指定したコミットの差分 $ git diff <commitID> <commitID> # 指定した2つのコミットの差分 $ git diff <commit1>...<commit2> # commit1とcommit2の共通の祖先とcommit2の差分 $ git grep # リポジトリ内のファイルを検索したい |
*困った時の対応*
・誤ってファイルを削除してしまった
1 |
$ git checkout HEAD <filename> |
・ローカルリポジトリの変更をリモートリピジトリに反映できない
1 2 |
$ git pull origin $ git push origin |
・直前のコミットメッセージを間違ってしまった
1 |
$ git commit --amend -m "NEW COMMIT MESSAGE" |