はじめに
Git に関してわかっているつもりで色々と抜けている部分があったので、あらためて学習してみた結果をまとめる。
Git 初期設定
git アップデート
git update-git-for-windows
git --version
git 初期設定
# email 設定
git config --global user.email "sawa@sawa.com"
# Git で使用するデフォルトのテキストエディタを Visual Studio Code に設定
git config --global core.editor "code --wait"
# 一覧
git config --global -e
# 自分の例
[user]
email = email@email.com
name = name
[init]
default = branch
defaultBranch = main
[diff]
tool = vscode
[difftool "vscode"]
cmd = "code --wait --diff $LOCAL $REMOTE"
[core]
autocrlf = input
editor = code --wait
[grep]
lineNumber = true
[difftool "vscode"] に関して
あとで diff コマンドが出てくるのだが、この設定があると diff を使うとき diff と同じように difftool も使えるようになる。
Git 基本理解
- 0. git 管理なしの状態
- ↓ git init あるいは git clone [GitHubのURL]
- 1. ローカル環境
- ↓ git add .
- 2. ステージング環境
- ↓ git commit -m "<メッセージ>"
- 3. コミット環境
- ↓ git push origin <ブランチ名>
- 4. リモート環境
- ↓ git pull origin <ブランチ名>
- 1. ローカル環境
git init
:
.git フォルダが作成され git 管理が始まる。.git フォルダを削除すると git 管理をリセットできる。このとき空のフォルダは git 管理に認識されないようである。
git clone <GitHubのURL>
:
GitHub のリポジトリをローカルにクローンしてくるコマンド。リポジトリと一緒に git 管理もクローンしてくる。
git add .
:
ローカル環境からステージング環境に移動(コミット待ち状態になる)。. (ドット) の代わりにファイル名を指定して add もできる。
git commit -m "<メッセージ>"
:
ステージング環境からコミット環境に移動(コミット完了状態になる)。
git push origin <ブランチ名>
:
コミット環境からリモート環境に移動(GitHubにローカルの変更が反映される)。
git pull origin <ブランチ名>
:
リモート環境の変更をローカルに反映(GitHubの変更がローカルに反映される)。
commit に関して
未 commit 状態でブランチを移動しない方がいい。移動先ブランチが移動元の変更内容で上書きされてしまうことがある。
push / pull に関して
ローカルのブランチ名とリモートのブランチ名が一致していることを確認する。ローカルのブランチAからリモートのブランチBに push などはNG。
Git よく使うコマンド
git 状態確認系(オプションは無くてもいい)
# コミットしたかしていないか
git status -s
# コミット履歴
git log --all --decorate --oneline --graph
# コミット履歴+それ以外の更に詳しい履歴
git reflog
# git 管理中のファイル一覧
git ls-files
# そのコミット時に変更した部分
git show <コミットID>
ブランチ間系
- ブランチの 作成 / 移動 / 削除
# 作成
git branch <ブランチ名>
# 移動
git switch <ブランチ名>
# 削除
git branch -d <ブランチ名>
- ブランチのマージ
git merge -m "<メッセージ>" <ブランチ名>
# コンフリクトしてしまったら?
# コンフリクトしているファイルを訂正し、add と commit をする
git add <ファイル名>
git commit -m "<メッセージ>"
# コンフリクトしてしまって途中でやめたいときは
git merge --abort
マージに関して
ブランチ A の変更をブランチ B(ブランチ A からの派生)に反映できるコマンド。
例えばブランチ B にいるときは git merge -m "<メッセージ>" <ブランチA>。
コンフリクトに関して
マージするとブランチ同士の変更が競合することもある。
コンフリクトが起きるのは、マージする2つのブランチがそれぞれ別々に同じファイルを編集して commit したとき。
たとえば main ブランチに example.txt があるとする。main から切った test ブランチが example.txt に「Good morning」と書いて commit。一方そのとき main では「Good evening」と書いて commit。
これでマージすると、git はどちらの変更が正しいのかわからずコンフリクトが起きる。
Git 時々使うコマンド
# rm 系
# ファイルをステージング環境からローカル環境に移動(未 add 状態にする)
git rm --cached <ファイル名>
# ファイルをステージングからもローカルからも消す
git rm <ファイル名>
# mv 系
# AからBに名前変更 & 変更を add
git mv <ファイル名A> <ファイル名B>
# restore 系
# 変更 / 削除をステージング環境からローカル環境に移動(未 add 状態にする)
git restore --staged .
# 変更 / 削除をステージングからもローカルからも消す
git restore .
# checkout 系
# 過去の特定のコミット時の様子を見に行く
git checkout <コミットID>
# 現在に戻る
git checkout <ブランチ名>
# stash 系
# 今やっている作業を一時退避
git stash
# メッセージ付き退避
git stash push -m "<メッセージ>"
# 退避中の作業一覧
git stash list
# 退避した作業の復元
git stash apply stash@{<番号>}
# 退避した作業を削除
git stash drop stash@{<番号>}
stash に関して
「commit に関して」で書いたように、commit せずにブランチ移動はしない方がいい。そのため stash で作業をいったん退避してからブランチ移動をするようにする。戻ったときに作業を復元できる。
# diff 系 変更の差分を確認
# ローカル環境と直前コミットとの差分
git diff
# ステージング環境と直前コミットとの差分
git diff --staged
# コミット間の差分
git diff <コミットID>..<コミットID>
# ブランチ間の差分
git diff <ブランチ名>..<ブランチ名>
git fetch origin
# ローカルとリモートの差分
git diff HEAD..origin/master
# リモートとローカルの差分
git diff origin/master..HEAD
Git あまり使わないコマンド
# revert と cherry-pick
# 特定のコミットで加えた変更を消す
git revert <コミットID>
# 特定のコミットで加えた変更を取り入れる(revert の逆)
git cherry-pick (-n) <コミットID>
# reset 系
# 戻りたい場所のコミットIDを確認
git reflog
# そのコミット時の状態に戻る
git reset --hard <コミットID>
# オプションに関して
--soft: 指定の状態に戻り、そのとき編集中だったことは commit だけ行っていない状態になる
--mixed: 指定の状態に戻り、そのとき編集中だったことは add だけ行っていない状態になる
--hard: 指定の状態に戻り、そのとき編集中だったことは消える
# その他
# 文字列検索 VSCodeが使えない環境で活躍
git grep "<文字列>"
# 特定のコミット時のファイルで文字列検索
git grep "<文字列>" <コミットID>
# ファイルの更新履歴を確認
git blame <ファイル名>
Git よくわからないコマンド
# rebase 系
# 他のブランチのコミット記録を取り込む?(以下参考画像)
# でも main で rebase してはいけないとも聞くので、使わない方が無難そう
関連:Git よく使うファイル
ファイル名 | 内容 |
---|---|
.gitignore | git 管理しないファイルを指定する(.envなど)。 |
.git | 消すと git 管理がリセットされてしまうので触らない。 |
.gitignore に関して
add されたことがないファイル(git 未管理)は .gitignore できる。add 済みファイル(git 管理中)は先に管理を外す。
.gitignore に関して2
gitignore generator でいろいろな言語やフレームワークの .gitignore サンプルが提供されている。
関連:GitHub に関して
-
自分が新しくリポジトリを作る場合の初回 push のやり方
画像に2つコードブロックがあり、ローカルで何も git 管理をしていない場合は上のコードブロックを、ローカルで git init 済みなら下のコードブロックを実行する。
2回目以降は git push origin <ブランチ名> で push できるのだが、初回は git push -u origin mainになっている。-u = --set-upstream らしい。 -
プルリクの使い方
1.プルリク作成
2.そのブランチがどういう意図で作られて、どういう変更を加えたのか、他の人が読んでわかるように書く。(ブランチ名確認!)
3.変更にフィードバックをもらい、問題なければマージ。フィードバックで問題を見つけてもらった場合は、ローカルから訂正して push する。
おわりに
学習を経て、少し自信を持って Git を使えるようになったと思う。これからもわからない動作が出てきたときは自分で調べるようにしたい。あと Git の SSH クローンについてもやり方を再確認したい。
Git の学習を勧めてくださったインターン先の上司 I さんに感謝申し上げます。
参考にさせていただいた記事