Open7

Git/GitHubメモ

アライ リョータアライ リョータ

指定したn個の直近のコミットを表示する

git log -n 2 # 直近のコミット2個を表示する
# 応用:--onelineとの組み合わせ使用
git log -n 2 -- oneline # 直近のコミット2個を1行で表示する

差分を表示する

git diff # ステージングに上げる前の差分を表示
git diff --staged # ステージングに上げた差分を表示

直前のコミットメッセージを修正する

git commit --amend -m "修正後のメッセージ”
git commit --amend # vim上で修正

直前のコミットを上書きする(コミットメッセージは変更しない)

👉 コミットするほどではない軽微な修正時(コミットメッセージはそのままで良い場合)に有用

# 軽微な変更・追加を行ってから
git commit --amend --no-edit # 直近のコミットメッセージはそのままで、コミット内容だけ上書き
アライ リョータアライ リョータ

任意のコミット時点に戻る

git switch --detach [commit hash] # 指定したhashのコミット時点に戻る
git switch - # 直前のブランチに戻る

任意のコミット時点に戻る(戻った地点より後のコミットは失われる)

🚨 基本的にチーム開発時は使用しない

git reset [option] [hash]
# option
# --hard:戻った時点から後のコミットは破棄される
# --soft:戻った時点から後のコミットは破棄されるが、ステージングエリアと元のデータは保持される
# --mixed:戻った時点から後のコミットとステージングエリアは破棄されるが、元のデータは保持される

ステージングとコミットを同時に行う

git commit -am "コミットメッセージ" 
アライ リョータアライ リョータ

ブランチを切り、作成したブランチに移動(2024年時点の推奨コマンド)

git switch -c [ブランチ名] # cはcreateの意

全てのブランチのコミット履歴をまとめて表示するオプション:--all

git log --oneline --all

他のブランチのコミットをマージする(取り込む)

  • マージしたブランチはmainブランチと直線上に並ぶ(Fast-forwordマージ)
    => どこでマージされたかが履歴から分かりづらい
git merge [取り込みたいブランチ名]
  • コミットがマージされたことをわかりやすくする(マージコミット):--no-ffオプション
git merge [取り込みたいブランチ名] --no-ff
# さらに--no-editオプションを付与すると、(HEAD -> main) Merge branch 'add-03'のようにmergeしたことを自動的にメッセージに残してくれる
  • マージされたことがわかりやすい(ただし、個人開発以外は各現場のルールに則って行う)

不要になったブランチを削除する

  • 削除するブランチにいると削除できないため、他のブランチに移動しておくこと
git branch -d [削除したいブランチ名]
アライ リョータアライ リョータ

分岐後にmainブランチ, 作業ブランチにそれぞれコミットがある場合のマージ

mergeコマンドを実行すると、デフォルトでFast-forwordではないマージ(マージコミット)になる

別のブランチで同じ箇所に変更を加えている場合のマージ

状況:mainブランチ, add-03ブランチで同じ行に対して変更及びコミットされている

% git log --oneline --graph --all
* f3f55d1 (HEAD -> main) 03を仮置き # mainブランチで変更したコミット内容
| * 2f9853a (add-03) 03を追加 # add-03ブランチで変更したコミット内容
|/  
* ceea8ea 02のテキストを追加
* ebc74cb 01のテキストを追加
% git merge add-03 --no-edit
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md # コンフリクトが発生
Automatic merge failed; fix conflicts and then commit the result.
# 01
01のテキスト

# 02
02のテキスト

# 03
<<<<<<< HEAD(現在の変更)
近日公開予定
=======
03のテキスト
>>>>>>> add-03(入力側の変更)

マージを中断するコマンド

git merge --abort

コンフリクトを直接修正する

# 03
<<<<<<< HEAD # 衝突箇所をわかりやすくするためのテキストなので削除して問題ない
03のテキスト
近日公開予定
======= # 衝突箇所をわかりやすくするためのテキストなので削除して問題ない
03のテキスト
>>>>>>> add-03 # 衝突箇所をわかりやすくするためのテキストなので削除して問題ない
03のテキスト

アライ リョータアライ リョータ

作成したブランチ名を修正(変更)する

git br -m [修正前のブランチ名] [修正後のブランチ名]

コミットしたブランチをマージ前に削除する

git branch -D [削除したいブランチ名]
アライ リョータアライ リョータ

ブランチの分岐元を付け替える

  • mainブランチから作業用ブランチAを切って機能追加作業を行った。
  • その間に、mainブランチも更新されたため、作業ブランチAをmainブランチの最新コミットに付け替えたい。(コンフリクトを避けるため)

🤔💭 シチュエーションの整理

  • add-03ブランチを分岐した以降に、mainブランチでコミットが発生している
  • add-03でもコミットが行われていて、マージしていない。
% git log --oneline --graph --all
# 現状のままmainでマージするとコンフリクトが発生する
* 48be04e (HEAD -> main) 03を仮置き
| * 95f535c (add-03) 03を追加
|/  
* ceea8ea 02のテキストを追加
* ebc74cb 01のテキストを追加
# 作業用ブランチに移動
git rebase main
# mainとの間で発生したコンフリクトを解消後、コミットし、下記コマンドを実行
git rebase --continue

git rebaseを中断する

git rebase --abort
アライ リョータアライ リョータ

リモート追跡用ブランチを確認する

  • リモートリポジトリの内容を取り込むためのもので、ローカル上でブランチを切り替えたりすることはできない。
git branch -a
git log origin/main --oneline # ログを確認することはできる

リモートリポジトリ上で変更したコミットをローカルに取り込む手順

  • リモートでコミットする
  • ローカルで、リモート追跡用ブランチに取り込む(fetch)
  • ローカルのブランチに、リモート追跡用ブランチの内容をマージする(merge)
git fetch # ローカルのリモート追跡用ブランチに、リモートでのコミット内容を取り込む
git merge origin/main

git fetchとgit pullの違い

  • どちらもリモートリポジトリから更新内容を取得するコマンドだが
    • fetch:リモート上からローカルのリモート追跡ブランチに更新内容を取得する
    • pull:リモート上からローカルに更新愛用を取得してマージする
      -> 直接ローカルの作業ブランチに反映される

リモートの更新内容を取得 + リモートに存在しないブランチの追跡用ブランチを削除する

% git br -a
* add-04
  main
  remotes/origin/add-04 # PRのマージが完了して、リモートでは削除済みのブランチ
  remotes/origin/main
  • --pruneオプション
git fetch --prune

% git br -a # 下記を確認すると、追跡用ブランチが削除されている
* add-04
  main
  remotes/origin/main