エンジニアとして働くことが決まったので、初学者として最もやらかしそうなGitについて復習しました。
今回、自分が復習して「そうなんだ」と改めて知った部分や、使いそうなコマンドだけ備忘録としてまとめておこうと思います。
間違い、指摘等あれば教えて頂けると助かります。
教材
今回、復習するにあたってUdemyで山浦さんの「Git:もう怖くないGIT! チーム開発で必要なGitを完全マスター」を使用しました。
山浦さんはYoutube動画で、Dockerについて勉強しており丁寧で分かりやすかったので、「Gitに関しても丁寧にまとめてくれているかなぁ」と思い、購入しました。
git add・git commit での詳細な処理内容
git add
ワークツリー(手元の作業場)のファイルを
↓
ローカルリポジトリに「圧縮ファイル(blobオブジェクト)」にして作成
↓
ステージに元のファイル名と圧縮ファイルを「ツリーファイル」として保存
git commit
ステージにあるツリーファイルをローカルリポジトリにツリーとして保存し、コミットファイルを作成。
コミットファイルの中身は
・ツリー
・親コミット(直前のコミット)
・作成者
・日付
・コミットメッセージ
*正直、git addで圧縮ファイルが生成されていることやツリーファイルが作られていることは知らなかったです(汗)
git rebase
ざっくり言うと、コミットの履歴をきれいにする(履歴を修正する)コマンド。
git rebaseの注意点
リモートにpushしてあるコミットはリベースしない。
git rebaseのデメリット
コンフリクトが生じた場合、各コミットでの修正が必要。
git rebaseで複数のコミットをやり直す
$ git rebase -i <コミットID>
↓
やり直したいコミットを「edit」にする
↓
やり直したら実行する
$ git commit --amend
↓
次のコミットへ進む
$ git rebase --continue
例)
$ git rebase -i HEAD~3
(2つ前のコミットからやり直すことができる)
↓
pick gh21f6d ヘッダー修正
pick 193054e ファイル追加
pick 84gha0d README修正
↓
(先頭のpickをeditに変更すると、そのコミットをやり直すことができる)
↓
edit gh21f6d ヘッダー修正
pick 193054e ファイル追加
pick 84gha0d README修正
↓
$ git commit --amend
↓
$ git rebase --continue
git rebaseでコミットの順番を入れ替える・削除する
$ git rebase -i <コミットID>
↓
コミットの順番を入れ替えるor削除する
↓
$ git commit --amend
例)
$ git rebase -i HEAD~3
↓
pick gh21f6d ヘッダー修正
pick 193054e ファイル追加
pick 84gha0d README修正
↓
(順番の入れ替えor削除)
↓
pick 193054e ファイル追加
pick gh21f6d ヘッダー修正
git rebaseでコミットをまとめる
$ git rebase -i <コミットID>
↓
コミットをまとめる
pickを「squash」にするとその前のコミットとまとめることができる
例)
$ git rebase -i HEAD~3
↓
pick gh21f6d ヘッダー修正
pick 193054e ファイル追加
pick 84gha0d README修正
↓
(コミットをまとめる)
↓
pick gh21f6d ヘッダー修正
squash 193054e ファイル追加
squash 84gha0d README修正
git rebaseでコミットを分割する
$ git rebase -i <コミットID>
↓
pickを「edit」にしてコミットをやり直す
↓
コミットを取り消し
$ git reset HEAD^
↓
分割したい内容でadd & commit を行いコミットをやり直す
↓
$ git rebase --continue
コミットの指定方法
HEAD 現在の作業場所
HEAD~ 親コミットを指定できる
HEAD~1 HEADの1つ上の親コミット
HEAD~2 HEADの2つ上の親コミット
HEAD^ マージ後の複数ある親の中から指定できる
*HEAD^に関してはこちらの記事が分かりやすかったです。
https://qiita.com/chihiro/items/d551c14cb9764454e0b9
タグ付け
タグの表示
$ git tag
指定したタグの表示
$ git tag -l "指定する文字列"
例)
$ git tag -l "release"
release_20210824
release_20210721
release_20210515
と表示される
タグの作成(注釈付き)
$ git tag -a <タグ名> -m "メッセージ"
例) $ git tag -a 20170501_01 -m "20170501のバージョン01"
タグの作成(軽量版)
$ git tag <タグ名>
例) $ git tag 20170501_01
後からコミットにタグ付けする
$ git tag <タグ名> <コミット名>
例) $ git tag 20170501_01 8a6cbc4
タグデータの表示
$ git show <タグ名>
で
・タグ付した人の情報
・タグ付したにちじ
・注釈メッセージ
・コミット
が表示される。
タグをリモートリポジトリにpushする
$ git push <リモート名> <タグ名>
例) $ git push origin 20170520_01
全てのタグをpushする
$ git push origin --tags
一時避難(stash)
ワークツリーとステージの変更を避難させる。
$ git stash
避難した分を確認
$ 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
その他コマンドまとめ
$ git commit
ステージされたスナップショットをコミット。エディタ上でコミットメッセージを入力する
$ git commit -m
インラインでメッセージを記述し、コミット
$ git commit -v
エディタ上で変更を確認し、コミット
$ git status
変更したファイルの一覧を確認
$ git diff
ステージに追加する前の変更分をソースコードとして確認
$ git diff --staged
ステージに追加した後の変更分をソースコードとして確認
$ git rm <ファイル名>
git、ワークツリー両方からファイルを削除
$ git rm -r <ディレクトリ名>
git、ワークツリー両方からディレクトリを削除
$ git rm --cached <ファイル名>
ワークツリーにはファイルを残すがgit上からは削除
$ git mv <旧ファイル> <新ファイル>
ファイル名の変更
$ git checkout -- <ファイル名>
ファイルの変更を取り消す(ステージの情報をワークツリーに上書き)
$ git checkout -- <ディレクトリ名>
ディレクトリの変更を取り消す
$ git checkout --.
全取消し
$ git reset HEAD <ファイル名>
ステージしたファイルの変更を取り消す(ローカルリポジトリからステージに上書き)
$ git reset HEAD <ディレクトリ名>
ステージしたディレクトリの変更を取り消す(ローカルリポジトリからステージに上書き)
$ git reset HEAD .
ステージした全部の変更を取り消す(ローカルリポジトリからステージに上書き)
$ git commit --amend
直前のコミットをやり直す(今のステージの内容で直前のコミットを修正する)
pushしたコミットに関してはやり直してはいけない。