fluid_27’s blog

勉強した内容をアウトプットするためのブログ

Gitあれこれ① git rebase・git stash・その他 Gitコマンドまとめ

エンジニアとして働くことが決まったので、初学者として最もやらかしそうなGitについて復習しました。

 

 

今回、自分が復習して「そうなんだ」と改めて知った部分や、使いそうなコマンドだけ備忘録としてまとめておこうと思います。

間違い、指摘等あれば教えて頂けると助かります。

 

教材 

今回、復習するにあたってUdemyで山浦さんの「Git:もう怖くないGIT! チーム開発で必要なGitを完全マスター」を使用しました。

山浦さんはYoutube動画で、Dockerについて勉強しており丁寧で分かりやすかったので、「Gitに関しても丁寧にまとめてくれているかなぁ」と思い、購入しました。

https://www.udemy.com/share/1021OE3@OIbGYYkkqZHQvJrdSzlcouKyVua8yXftd6YSdtPsjmafERM_3LS6De3YgU4i0-3xcw==/

 

 

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したコミットに関してはやり直してはいけない。