Git
https://git-scm.com/images/logo@2x.png
Branch Model
Git-flow
https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F599304%2F5baa1844-4ad0-1389-5743-8bbccc1ef836.png?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&w=1400&fit=max&s=def9b62c8f224886c6734443a89b13ca
GitHub-flow
https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F599304%2F7894a560-1bec-7948-d508-8721e3100a34.png?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&w=1400&fit=max&s=20bcab1318338c4078290e4bb83698a8
個人利用ではこれを使う事が多い
主なブランチ
develop/*
feature/*
hotfix/*
Gitlab-flow
https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F599304%2Fb3a30812-5e6f-5886-484c-edff29c03f39.png?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&w=1400&fit=max&s=4daf723ecef2c061378824336b569c87
main(default、CRUD)
feature/hotfix/develop
pre-production(Lab env)
production
CLI
Config
初期設定
code:bash
NAME=:<put your name>
EMAIL=:<put your email>
# USER(global)に対してgitの設定を行う
git config --global user.name "${NAME}"
git config --global user.email "${EMAIL}"
# 削除する時は--unsetオプションをつける
git config --global --unset user.name
git config --global --unset user.email
# config確認
git config -l
Commit
フォーマット
<Type>(<Kind>): <Emoji> #<Issue Number> <Title>
<Description>
...
branchを切って更新する流れ
code: bash
git clone --recursive ${REPOSITORY} # --recursive付けるとsubmoduleもcloneできる
BRANCH=<put branch name> # ex) feature/index-design
git checkout main
git pull
git checkout -b ${BRANCH}
git add .
git commit -m "${MSG}"
git push origin ${BRANCH}
git checkout main
git branch -D ${BRANCH}
# same procedure for hotfix
直近のメッセージを使用する方法
-C HEADオプション
--date=nowで日付も更新する
code:bash
git commit --amend -a -C HEAD --date=now
# 過去のコミットを指定する
git commit --fixup=HEAD~3 --autosquash
git rebase -i HEAD~3
最新の main ブランチを取り込む
merge or rebase
code: (bash)
git switch main
git pull origin main
git switch feature/erutaef
git merge origin main
Edit
code: (bash)
git reset --soft HEAD^
git rebase -i ${commit_id}
Remove
remove cache
code:bash
git rm -r --cached ${file}
Reset
code: (bash)
git checkout . --
git clean -df
Stash
一時的に変更を退避する時に使うコマンド
code: bash
git stash save # saveは省略可能
git stash list
git stash apply stash@{0}
git stash drop stash@{0}
git stash pop stash@{0}
diff
code:bash
git diff origin/main --name-only --diff-filter=[(A|C|D|M|R|T|U|X|B)...*] git diff origin/main --name-only --diff-filter=A # ADD
log
code:bash
git log --oneline --decorate --graph --all # グラフ化
git log -p # ファイルの差分を表示させる
tag
code: (bash)
git tag -l
git tag -a ${TAG} -m ${COMMENT}
git push origin ${TAG}
submodule
別のリポジトリのコミットを参照してリポジトリに取り入れる
code:bash
# submoduleに追加する(ディレクトリ名を省略すると同じ名前になる)
# .gitmodulesファイルが作成されるだけ
git submodule add git@github.com:ymmmtym/submodule-repository submodule-repository
# .gitmodulesに従って、submoduleを更新(初期化)する
git submodule update --init --recursive
# 追従するbranchを決める
git config -f .gitmodules submodule.roles/ansible-role-dev.branch main
# submodulesをリモートリポジトリの状態に更新する
git submodule update --remote
# submodulesを一括で操作する(それぞれに入って同じ操作を実施する)
git submodule foreach git pull
worktree
リポジトリ内のディレクトリに、同じリポジトリを別ブランチで作成する
Hook
特定のアクションが発生したときに実行されるカスタムスクリプト
.git/hooks ディレクトリに、特定の名前で実行可能ファイルを配置する
git init 時にサンプルとなる Hook が存在する(.sample を外した名前のファイルを配置して使う)
code: (bash)
❯ ls .git/hooks/
applypatch-msg.sample* fsmonitor-watchman.sample* pre-applypatch.sample* pre-merge-commit.sample* pre-rebase.sample* prepare-commit-msg.sample* update.sample*
commit-msg.sample* post-update.sample* pre-commit.sample* pre-push.sample* pre-receive.sample* push-to-checkout.sample*
クライアントサイドフック
コミットワークフローフック
コミットプロセス(git commit)に対して起動するフック
pre-commit
コミットメッセージが入力される前に実行される
git commit --no-verify でスキップできる
prepare-commit-msg
commit-msg
コミット時に実行される
コミットメッセージを引数にしたスクリプトが実行される
0 以外を返すとコミットは中断される
post-commit
Eメールワークフローフック
git am コマンドに対して起動するフック
applypatch-msg
pre-applypatch
post-applypatch
その他
pre-rebase
post-rewrite
コミットを書き換える時や git rebase を実行した時
post-checkout
post-merge
pre-push
サーバーサイドフック
Git サーバーに設定するフック
pre-receive
update
post-receive
Global な Hook を利用する
gitconfig で core.hooksPath を任意のディレクトリに設定
code: (bash)
git config --global core.hooksPath ~/.config/git/hooks
pre-commit ファイルを追加
_local-hook-exec ファイルを追加
通常 ~/.config/git/hooks の Hook しか実行されないため、git リポジトリの Hook を実行してから Global な Hook を実行するスクリプト
環境変数
GIT_TRACE_ をつけると trace できる
code: (bash)
GIT_TRACE=1 GIT_TRACE_PERFORMANCE=1 git status
Reference
templates of .gitignore
Commit
Hook