gitコマンドの使い方
概要
- 厳密には
git
とgithub
は異なり、gitを実装したサービスがgithubなのであるが、githubの機能についてもこのページに記す - 最近では人権の観点からmasterからmainなど呼称が変更されたものもある
インストール
debian, ubuntu
$ sudo apt install git
macOS
$ brew install git
windows
$ scoop install git
チーム開発のフロー
- 自分コードをmainから分離するためにbranchを作る(1)
- branchで開発を進め、pull requestを送る前に、mainからpullして差分を取り込む(2)
- pull requestを送る(3)
- 差分を確認し、レビューする(4)
(1)ブランチを作成する
$ git branch <my-dev-name>
$ git checkout <my-dev-name> # ブランチを切り替え
(2)mainから差分を取り込む
(<my-dev-name>)$ git fetch
(<my-dev-name>)$ git rebase origin/main
(<my-dev-name>)$ git pull
(3)pull requestを送る
- gitのweb画面から
create pull request
のボタンを押す
(4)差分を確認し、レビューする
https://github.com/<team>/<project-name>/pull/10
というURLがpull requestのときhttps://github.com/<team>/<project-name>/pull/10.diff
と末尾につけると差分をdiffコマンドの出力の様に確認できる- なにか気になる点、修正すべき点があれば、pull requestのコメント欄に書き込む
コミットメッセージのプラクティス
- コミットメッセージとコードの変更は対応しているべきである
- コミットメッセージはレビュワーの負荷にも関係する
- コミットメッセージに絵文字を使用する文化もあり、絵文字により変更の内容を示すものである
- 絵文字の例
- 🐛
:bug:
バグ修正 - 👍
:+1:
機能改善 - ✨
:sparkles:
機能追加 - 🔥
:fire:
不要な機能の削除 - 👕
:shirt:
lint修正 - ⚡
:zap:
パフォーマンス改善 - 👮
:cop:
セキュリティ対応 - 🎨
:art:
スタイリングの追加・修正 - 📝
:memo:
ドキュメントの追加・修正 - ✅
:white_check_mark:
テストの追加・修正 - ライブラリ関連
- ➕
:heavy_plus_sign:
ライブラリの追加 - ➖
:heavy_minus_sign:
ライブラリの削除 - ⬆️
:arrow_up:
ライブラリのアップデート - ⬇️
:arrow_down:
ライブラリのダウングレード
- ➕
- 🐛
- 絵文字と役割を示したテキストファイルを用意し、テンプレートに登録するとやりやすい
git config --global commit.template <filename>
設定
- /git-config/に記載
基本的なコマンド
git clone
リモートレポジトリをローカルにコピーする
$ git clone git@foo:bar/project
リモートレポジトリをローカルの指定のディレクトリ名でコピーする
$ git clone git@foo:bar/project <target-directory>
git commit -m "foobar"
(コミットメッセージ)の修正
以下のコマンドを打つとeditor(vim等)にて編集できる
$ git commit --amend
commit前のファイルの編集を取り消す
$ git restore ${FILENAME}
単体ファイルをリセット(HEADの状態に)する(単体ファイルをrevertする)
$ # gitレポジトリのトップで実行する必要がある
$ git checkout HEAD -- ${FILEPATH_FROM_TOP_DIR}
- 様々なファイルを変更したが特定のファイルだけ、HEADの状態に戻したいとき
--
は続く引数はファイル名として扱うという意味
現在の編集を取り消して特定のcommid idへ戻す
- 誤って必要なファイルを消したとき
- commitを放棄してもいいからもとに戻したいとき
commit id
はgit log
から確認できる
$ git reset ${COMMIT_ID}
https
をssh
へ変更
$ git remote set-url origin ${SSH_PROTOCOL_PATH}
- 二段階認証等を導入するとsshでしか操作を受け付けなくなる
リモートのURLを確認
$ git config --get remote.origin.url
- 対象のgitプロジェクト内部で実行する
コミット前のファイルの差分を確認
$ git diff ${FILENAME}
コミット後のリモートブランチとの差分の確認
$ git fetch origin master
$ git diff origin/master -- ${FILENAME}
git add
で全部追加
$ git add --all
git directory
.git/
のディレクトリのこと- git directoryはすべての変更や履歴を含んでいる
stageとcommit
- stageはファイルを今編集している状態(git statusで変化が見える状態)
- commitはcommitした状態
git config -l
git config -l
で今の操作しているレポジトリの設定一覧を見るとが可能
git log
- gitのcommitログ
git revert HEAD
- ロールバックのこと
- もとに戻す
- もとに戻すための新規commitが生成される
master(main) branch
- よく動くことを担保したい
- その他は実験という位置づけ
git branch
- 今いるbranch
git branch hoge
でhoge branchを作る
git checkout ${BRANCH_NAME}
- 特定のbranchに切り替える
git checkout -b ${BRANCH_NAME}
で存在しないbranchでも切り替えられる
git merge
- 同時にmasterと他のbrachのhashが同じ値を指すことになる
- master branchにて、
git merge ${TARGET_BRANCH}
するとmergeになる
git remote update
- マージせずに現在のbranchをリモートからローカルにアップデート
git remote show origin
- リモートの情報を見るのに使う
git fetch
- branchのデータをリモートからローカルに引っ張ってくる
explicit merge
- 新たなマージコミットを作成するタイプのマージ
git pull
- 自動マージ
pull request
- web UIで作る
- pull requestsのコメントはテンプレがある
リモートブランチのURLを知る
$ git config --get remote.origin.url
project コーディネータにとって重要なこと
- pull requestの即時応答
- accept内容の理解
- issue trackerを正しく追う
CI/CD
- CI: 自動テスト的なやつ
- CD: ローリングリリース的なやつ
- 既存のプルリクエストをアップデートするにはそのままcommitを刻めば良い
pull requestの編集差分をみる
pull requestのURLから差分を確認する
https://github.com/weppos/whois/pull/90
というURLがあるときhttps://github.com/weppos/whois/pull/90.diff
と末尾につけると差分をdiffコマンドのplane textで確認できる
リモートのmain以外のブランチに切り替える
git branch -a
でリモートを含めたブランチ一覧の確認git switch
でリモートの任意のブランチに切り替える(ローカルの内容もリモートと同期される)
$ git branch -a # ブランチの一覧の確認
* master
remotes/origin/HEAD -> origin/master
remotes/origin/dev
remotes/origin/master
$ git switch remotes/origin/dev # リモートのブランチに切り替える
センシティブなデータをgitのremoteに反映してしまった時の対応
- 作業の流れ
- remoteとlocalを同期する
git-filter-repo
でlocalのレポジトリの履歴からセンシティブなデータを取り除く- remote urlが失われるので再設定
- force pushでリモートを上書き
- 参考
git-filter-repoをインストール
ubuntu, debian
$ sudo apt install git-filter-repo
センシティブなファイルを削除(履歴からも消える)
$ git filter-repo --invert-paths --path <target-file-or-dir>
remote urlを再設定
$ git remote add origin <git-url>
強制的にpushする
$ git push origin --force --all