ローカルリポの作成方法
ディレクトリをローカルリポとして新規作成する
git init prj_name
カレントディレクトリに,prj_nameディレクトリが作成される.prj_nameディレクトリに.gitディレクトリが入っている.
これを作成した時点では,まだコミットは作成されない.
既存ディレクトリをローカルリポにする
ローカルリポにしたいディレクトリにて,以下を実行する.
git init
これを作成した時点では,まだコミットは作成されない.
その後,remoteリポを追加する.
git remote add origin http/or/ssh.git
もし,remote origin already existsの場合は,既存のremoteを削除する.
git remote rm origin
その後ローカルでpullする
git pull origin main
リモートリポからローカルリポを作成する
git clone http/or/ssh.git
なお、ほかの人のリモートリポをクローンする場合、それをフォークしてからの方がよい。
ローカルに紐づいたリモートリポの確認
git remote -v
fetch先,push先のurlを確認できる.
基本操作
ブランチの一覧,現在のブランチを確認する
git branch
現在のブランチに*マークがついている.
バージョン,セルによっては,pagerが開く(画面一杯にブランチが開く)場合がある.
これを無効にするには次のようにやる.
git config --global --replace-all core.pager "less -F -X"
ブランチを切る(ワーキングブランチはそのまま)
git branch hoge-branch
ブランチを切る(ワーキングブランチも切り替える)
git checkout -b hoge-branch
ワーキングブランチを切り替える
git checkout hoge-branch
作業状態を確認する
git status
ステージに上げる
git add hoge.txt
git add .
git add -A hoge.txt
ファイルの削除を反映するには,-Aオプションが必要.
コミットする
git commit -m "hoge"
コミット履歴を見る
git log
GitHubでリポジトリを作成した時点で,Initial commitが作成される.
全ブランチの最新コミットがわかる.
originはリモートリポのこと.
HEADは今のブランチみたいなもの.
プルする
ローカル→リモートへ更新する前に,リモートで更新されている分をローカルに反映させる.
git pull remote branch
git pull origin main
今のワーキングブランチに反映される.
remoteは,リモートリポのこと.git remote -v
で出力されるものを指定すれば良い.大体origin
のはず.
branchは,リモートリポのブランチのこと.大体main
のはず.
プッシュする
git push remote branch
remoteは,リモートリポのこと.大体origin
のはず.
branchは,ローカルのブランチ名を指定する.これと同名のリモートにあるブランチにpushされる.
リモートリポでマージする
基本的にマージはプルリクエストを送って,差分を確認したのちにマージする.
1: プルリクエストを送る
GItHubのページにあるPull requestタブから,New pull requestをクリック.
マージ元→マージ先を選択して,差分を確認して,Create pull requestをクリック.
Titleを入力し,(commentも入力し,)Create pull requestをクリック.
2: マージする
プルリクエストがあると,GitHubのPull requestsタブにその数が表示されているはず.
Pull requestsタブから,マージするプルリクエスト(の名前のところ)をクリックする.
さらにFile changeタブから,差分を確認する.
Conversationタブから,Merge pull requestをクリックする.
リモートのmainにマージ後にローカルでプルする
ローカルのmainブランチに反映させたいので,mainに切り替えてからプルする.
git checkout main
git pull origin main
ブランチの削除
1: ローカルリポのブランチの削除
git branch -d branch
なお,mainにマージしていないブランチは削除できない?(できた?)
強制削除の場合は,-d
→ -D
とする.
2: リモートリポのブランチ削除
GitHubのCodeタブから,branchesをクリック.
そこからブランチをゴミ箱マークで削除する.
管理
追跡中のファイル
git ls-files
追跡してないファイル
git clean -n
追跡してないファイルを削除する
git clean -f
追跡しないファイルを指定する
.gitignoreファイルに記載する.
サイズが大きいもの.
パスワード等のもの.
システムが生成するキャッシュファイルなど.
公式がignoreするファイルを言語ごとまとめてる.
https://github.com/github/gitignore
記述の仕方
ワイルドカード:*.txt
ディレクトリ:hoge/
ファイル:hoge.txt
追跡をやめる
git rm --cached hoge_file
ステージから下ろす
git reset HEAD file_name
HEAD: 今いるブランチを指す.
実際は,リポジトリにある内容を,ステージに上書きしている.
編集を破棄する
git checkout -- file_name
--:以降はファイルを示す.
コミット時点まで戻されるので注意.
実際は,ステージにある内容を,ワーキングディレクトリに上書きしている.
ファイル名を変更する
git mv ho.txt ge.txt
ファイル名変更の情報がステージに上がる.
なお,gitを介さずにディレクトリ名を変更すると,削除+追加の処理になる.
削除+追加を同時にステージに上げると,ファイル名変更の情報になる.
ファイルを削除する
git rm hoge.txt
追跡してないファイルは削除できない.
ステージ上のファイルは削除できない.
gitを介さずにファイルを削除すると,次のように-A
オプションをつけて 削除の情報をステージに上げる必要がある.
git add -A rmoved.txt
履歴を表示する
一覧で表示する
git log
線で結ぶ
git log --graph
1行で表示する
git log --oneline
特定のファイルの履歴を表示する
git log -- hoge.txt
git log --follow hoge.txt
ファイル名変更前も辿るには,--follow
をつける.
特定のコミットの詳細を表示する
git show commit_id
commit_id: コミットID.すべての文字列でなくて,先頭の一部でも良い.一意となれば良い?
他のブランチの情報も表示する
git log --all
ブランチ詳細
ブランチは,コミットのポインタ.
そのコミットに親コミットの情報が入っているので,コミットの一連のように見える.
ブランチ一覧表示
git branch
git branch -a
リモートリポのブランチを表示するには,-a
をつける.
ブランチ名変更
git branch -m before_branch after_branch
ブランチ削除
git branch -d branch_name
コミット
最新のコミットのメッセージ修正
git commit --amend -m "<re_masseage>"
前のコミットに戻す
前のコミットを消すコミットを作る: Revert
git revert <commitID>
git revert HEAD
リモートリポでrevertすることも可能
前のコミットを削除する: Reset
git reset <commitID>
Revert推奨.機密情報等,履歴に残したくない場合のみ使用.
削除するコミットを元に開発が進められていると汗.
1.resetすることで,HEADが指定したcommitIDを指すようになる.
--soft
指定したコミット以降のreset時の変更とかはそのまま残る.
2.さらに,HEADが指定してたコミットの内容をステージに移動(デフォ)
--mixed
reset時にステージにあったものは,作業ディレクトリにコピー.
ただし,作業ディレクトリに変更ある場合は最新の変更が残る.
3.さらに,作業ディレクトリにもステージのものをコピー.
--hard
指定したコミット以降の変更等は全て消えるので注意.
マージ詳細
別のブランチをカレントブランチにマージする
git merge other_branch
マージの種類
早送りマージ(fast-forward)
ブランチAからブランチBを分岐させて、ブランチBを変更する。
ブランチAの変更がなくて、ブランチB→ブランチAにマージするとき、ブランチAの指すコミットを移動するだけでマージできる。
これを早送りマージ、fast-forwardマージという。
なお、別でマージコミットを作成するnon fast-forwardマージにすることもオプションにより可能(説明略)。
自動マージ(automatic)
ブランチA、ブランチBに共通の変更がないときは、別のマージコミットが作成される。
コンフリクト(conflict)
ブランチA、ブランチBに共通の変更がある場合、マージされない。何らかの処理が必要になる。
マージできなかったものは、git status
のUnmerged pathsに追加される。
このあと、コンフリクトを解消して、コミットをする。
p4merge(diffのと同じ)等のソフトがある.
設定は略.
Rebase
分岐してる場合,一方を他方の後ろにつけて(新コミットIDが振られる)ブランチを一本化し,他方を削除.
→マージしやすくする.ゆくゆくのマージ先であるmasterを,branchにrebaseして,branchをmasterにマージしやすくする.
(branchにいる状態で) git rebase master
コンフリクトの場合,エラーが出る.コンフリクトを直したのち,
git rebase --continue
(コンフリクトならマージすればいいと思う)
削除するため,リモートリポでそれを使われていたら最悪.
→push済みはrebaseするな.自分のローカルのやつのみにしとく.
pullする際のmergeをrebaseにすることも可能.
commitが綺麗になるくらい.個人でならいらないかも.
Stash
Workingディレクトリ,ステージにあるものを一度とっておく.
stashに移す
git stash
メッセージつける場合
git stash save "<message>"
untrackのファイルも移す場合
git stash -u
untrack, gitignoreしているファイルも移す場合
git status -a
stashの内容確認
git stash list
特定のstashの内容確認
git stash show stash@{<N>}
git stash listで,インデックスが参照できる.
untrackは内容見れない.
stashを元に戻す
最新のもの
git stash pop
以下の戻すと削除の組み合わせ
特定のもの
git stash apply stash@{<N>}
stashからコピー
git stash apply
stashからコピーされるだけなので,stashには残ってる.
stashしたファイルを変更すると,コンフリクトが生じる.
stashを一つ削除
git stash drop
特定のstashのみ
git stash drop@{<N>}
別の人のリモートリポを自分のリモートリポにコピーする(フォーク)
相手のGitHubにあるFolkボタンをクリックする.
ローカルにクローンするときは,この自分のリモートリポにフォークしたものをクローンする.
コミットにtag
tag使い方
ドキュメント
idだとわかりづらい.
タグごとでソースファイルをインストールしたりも可能になる.
注釈付きタグと軽量版タグの2種類.
基本は注釈付きみたい.
最新のコミットにタグ付
軽量版
git tag <tagname>
注釈付き
git -a tag <tagname>
過去のコミットにタグ付
軽量版
git tag <tagname> <commitID>
注釈付き
git -a tag <tagname> <commitID>
上書きは不可.-fで強制.
tagを別のコミットに付け直す
git tag -a -f <re-tag>
-aは注釈付き.
-fは強制.
同じ名前のタグはつけられない.d
タグ削除
git tag --delete <tagname>
git tag -d
タグをpushする
git pushしてもタグ情報はpushされない.
git push <remote_ref> <tagname>
git push origin v1.0
全てのタグをpushする
git push <remote_ref> --tags
pushしたタグを削除(非公開)
git push <remote_ref> :<tagname>
タグの状態をfetch
git fetch --tags --all
タグ一覧
git tag --list
git tag -l
git tag -l "v1.8.5*"
ソートとかもできるみたい.
diff
git diff <前tagname> <後tagname>
何かソフト入ってる場合
git difftool <前tagname> <後tagname>
あるタグのブランチを作る
git checkout -b <branchname> <tagname>
あるタグと同じ状態にする
git checkout tags/<tagname>
Github flow: 開発のワークフロー
git-flowというモデルを簡略化したもの
- mainブランチは常にデプロイ可能に.
- featureブランチは常にmainから派生
ローカルでマージはあんまりしない
README.md
そのプロジェクトが行うこと.
なぜこれを使うべきなのか.
どうやって使うのか,インストールなど.
詳細情報はどこで得られるのか.
誰が作って管理してるのか.
chromeのエクステンション
ファイルのツリー構造を見やすく.
Octotree
リモートリポのみ
issueをカンバン(アジャイル開発)として管理
ZenHub