はじめに
git version
| コマンド |
説明 |
git version |
Gitのバージョンを出力する |
git clone
| コマンド |
説明 |
git clone {リポジトリのURL} |
対象リポジトリのデフォルトブランチをクローンする |
git clone --depth {深さ} {リポジトリのURL} |
対象リポジトリのデフォルトブランチを指定したコミット数で切り詰めてクローンする |
git clone -b {ブランチ名} {リポジトリのURL} |
対象リポジトリの対象ブランチをクローンする |
git clone --recursive {リポジトリのURL} |
サブモジュールを含む対象リポジトリのデフォルトブランチをクローンする |
git clone --depth 1 {リポジトリのURL} |
履歴が多いリポジトリをクローンする時間を短縮できます |
git remote
| コマンド |
説明 |
git remote |
リモートリポジトリの一覧を出力する |
git remote add {リモートリポジトリ名} {リポジトリのURL} |
対象リポジトリをローカルのリモートリポジトリに追加する |
git remote rename {旧リモートリポジトリ名} {新リモートリポジトリ名} |
ローカルの対象リモートリポジトリをリネームする |
git remote remove {リモートリポジトリ名} |
対象リモートリポジトリをローカルから削除する |
git branch
| コマンド |
説明 |
git branch |
ローカルブランチの一覧を出力する(チェックアウト中のブランチに * が付く) |
git branch -r |
リモートブランチの一覧を出力する |
git branch -a |
ローカルブランチとリモートブランチの一覧を出力する |
git branch {ブランチ名} |
対象ブランチを新規作成する(チェックアウトしない) |
git branch -d {ブランチ名} |
対象ブランチを削除する |
git branch -f {ブランチ名} |
対象ブランチを強制削除する |
git branch -D {ブランチ名} |
対象ブランチを強制削除する |
git branch -m {旧ブランチ名} {新ブランチ名} |
対象ブランチをリネームする |
git branch --set-upstream-to=origin/リモートブランチ名 ローカルブランチ名 |
ローカルのYYYブランチの追跡するリモートブランチをXXXへ変更 |
git branch -VV |
ローカルブランチ名,状態,追跡するリモートブランチ名を表示 |
git checkout
| コマンド |
説明 |
git checkout {ブランチ名} |
対象ブランチに切り替える |
git checkout -b {ブランチ名} |
対象ブランチを新規作成し、切り替える |
git checkout {ファイルパス} |
ワーキングディレクトリにある対象ファイルの変更を取り消す |
git checkout . |
ワーキングディレクトリにある全ファイルの変更を取り消す |
2.23.0で git switch と git restore コマンドが追加され、git checkout コマンドを使わなくても済むようになりました。
git restore
基本的に指定したファイルの変更を取り消し,最後にコミットされた状態へ戻す.
| コマンド |
説明 |
git restore {ファイルパス} |
ワーキングディレクトリにある対象ファイルの変更を取り消す |
git restore . |
ワーキングディレクトリにある全ファイルの変更を取り消す |
git restore --source {コミットID} {ファイルパス} |
対象ファイルの変更を対象コミットに戻す |
単にステージ(git add)したワーキングディレクトリの変更を取り下げる場合は,オプションに--stagedを用いる.
| コマンド |
説明 |
git restore --staged {ファイルパス} |
対象ファイルのステージングを取り消す |
git restore --staged . |
全てのステージングを取り下げる |
git diff
| コマンド |
説明 |
git diff |
ワーキングディレクトリにあるファイルの差分 |
git diff --ignore-permissions |
ファイルのパーミッション(実行権限など)の変更を無視 |
ブランチ間
| コマンド |
説明 |
git diff [ブランチ名A] [ブランチ名B] |
ブランチA,Bの全てのファイルの差分を表示 |
git diff [ブランチ名A] [ブランチ名B] <filepath> |
filepath について、ブランチA,Bの差分を表示 |
git diff [ブランチ名A] [ブランチ名B] --stat |
ブランチA,Bの差分の行数表示 |
空白を除く
| コマンド |
説明 |
git diff -w |
空白(スペース、タブ、改行など)の変更を無視 |
git diff -w --ignore-blank-lines --ignore-space-at-eol |
空白,空行を全て無視 |
git diff -w --ignore-blank-lines --ignore-space-chang |
|
git diff --ignore-blank-lines |
空行の追加や削除を無視 |
git diff --ignore-space-change |
空白の量の変更を無視。インデントの変更(タブ→スペースの変換など)があっても、差分として表示しない |
備考
-
git diff --cached: インデックスにあるファイルの差分、vscodeの gitビューで見れる
git status
| コマンド |
説明 |
git status |
変更したファイルの一覧を出力する |
git status -s |
git status を短い形式で出力する |
git status -s -b |
短い形式でもブランチとトラッキングを出力する |
git add
| コマンド |
説明 |
git add {ファイルパス1} {ファイルパス2}... |
対象ファイルをインデックス(コミット対象)に追加する |
git add -A |
変更した全ファイルをインデックスに追加する |
git add -p {ファイルパス} |
対象ファイルをハンク単位でインデックスに追加する |
git reset
コミットを取り消す際に用いる.
git reset (option 1) (option 2)
- option1:コミット取り消し後の状態の指定(デフォルトでは --mixed)
- option2:戻る先のコミットの指定(デフォルトでは HEAD の1つ前のコミット)
| コマンド |
説明 |
備考 |
git reset --soft |
最新のコミットを取り消し、その変更をステージングエリアに残す(git add状態は保持) |
git commitにより最新のコミットを(新たなコミットとして)復元可能 |
git reset --mixed(デフォルト) |
最新のコミットを取り消し、その変更をワーキングディレクトリに残し、ステージングエリアから外す |
git addからのgit commitにより、最新のコミットを復元可能 |
git reset --hard |
最新のコミットとすべての変更を取り消し、ワーキングディレクトリとステージングエリアを完全にリセットする(変更内容が失われる) |
ワーキングディレクトリの変更が取り消されているためgit add,git commitでは復元できない |
git reset --hard ORIG_HEAD |
直前の git reset 操作を元に戻す(通常、git reset --hard の取り消し) |
|
最新のコミットを取り消すため,共通して最新のコミット以降の変更を間接的に取り消すことに注意.
コミットに作用せずに単にステージングを取り消す(ワーキングディレクトリの変更自体はそのまま)操作を行うにはHEADを付け加える(つまり,git reset --mixed HEAD).
| コマンド |
説明 |
git reset HEAD {ファイルパス} |
ステージングエリアにある対象ファイル(git add {ファイルパス} を取り消す |
git reset HEAD |
ステージングエリアにある全ファイル(git add -A)を取り消す |
`git reset HEAD` と `git restore --staged .`
どちらも機能面では同じ.ただし,ニュアンスが少し異なる.
-
共通点
- ステージングエリアにある変更をワーキングディレクトリに戻す
- コミット履歴には影響を与えない.ステージングされている変更を解除するだけで、ワーキングディレクトリにはその変更が残る
-
微妙な違い
- git reset HEAD
古いGitのバージョンから存在しており,ステージングエリア全体や特定のファイルを扱う場合に使われる.HEADを基準として操作を行うため、直感的には「HEADに対してリセットを行う」という感じ.
- git restore --staged
Git 2.23以降で導入された新しいコマンドで,より明示的な操作を可能する.このコマンドは、ワーキングディレクトリとステージングエリアの変更を独立して操作するために設計されている.
git commit
| コマンド |
説明 |
git commit |
指定したエディタ (.gitconfig の editor) でメッセージを書き、インデックスにある全ファイルをコミットする |
git commit -m "{メッセージ}" |
メッセージを付け、インデックスにある全ファイルをコミットする |
git commit --amend |
直前のコミットを修正する(ファイル追加・メッセージ変更・タイポ修正など) |
git commit --amend --no-edit |
直前のコミットにファイルを追加する(メッセージは変更しない) |
git commit --amend -m "{メッセージ}" |
直前のコミットを修正し、メッセージを指定した内容に変更する |
「指定したエディタ」とは、.gitconfig の editor で指定しているエディタのことです。
git revert
| コマンド |
説明 |
git revert HEAD |
直前のコミットを元に戻すコミットを作成する |
git revert {コミットID} |
対象コミットを元に戻すコミットを作成する |
git push
| コマンド |
説明 |
git push origin {ローカルブランチ名} |
対象ローカルブランチを origin にプッシュする |
git push -d origin {リモートブランチ名} |
対象リモートブランチを origin から削除する |
git push origin {タグ名} |
対象タグを origin にプッシュする |
git push -d origin {タグ名} |
対象タグを origin から削除する |
git push -f (--force) |
強制プッシュする |
git push --force-with-lease |
強制プッシュする(ブランチのアップストリームが変更されている場合などは拒否する) |
git fetch
| コマンド |
説明 |
git fetch origin |
origin から最新の履歴を取得する |
git fetch --prune origin |
リモートリポジトリ上に存在しなくなったブランチなどの参照を削除し、origin から最新の履歴を取得する |
git rebase
| コマンド |
説明 |
git rebase origin/{ブランチ名} |
origin にある対象ブランチを、チェックアウト中のブランチへリベースする |
git rebase --continue |
リベースを続ける |
git rebase --abort |
リベースを強制終了する |
git rebase --quit |
リベースを中止する |
git rebase自体
例えば,
git checkout main && git pull origin main
この時,目的のブランチ(rebased-branch)をmainのブランチから生やし直したいとき,
git checkout rebased-branch && git rebase main
onto
git rebase --onto どこへ どこから どのブランチを
あるブランチがどこから生えているかを変更することができる。
例: (まちがって master から切ってしまった feature_x ブランチを develop に移動する)
git rebase --onto develop main feature_x
git merge
| コマンド |
説明 |
git merge origin/{ブランチ名} |
origin にある対象ブランチを、チェックアウト中のブランチへマージする |
git merge --squash origin/{ブランチ名} |
origin にある対象ブランチのコミットをひとつにまとめ、チェックアウト中のブランチへマージする |
git merge --continue |
マージを続ける |
git merge --abort |
マージを強制終了する |
git merge --quit |
マージを中止する |
git cherry-pick
| コマンド |
説明 |
git cherry-pick {コミットID} |
対象コミットをチェリーピックする |
git cherry-pick {始点の1つ前のコミットID}..{終点のコミットID} |
始点から終点までのコミットをチェリーピックする |
git cherry-pick {始点のコミットID}^..{終点のコミットID} |
始点から終点までのコミットをチェリーピックする |
git cherry-pick --skip |
現在のコミットをスキップして、残りのシーケンスを続ける |
git cherry-pick --quit |
失敗したチェリーピックを取り消す |
git stash
作成
| コマンド |
説明 |
git stash list |
スタッシュの一覧を出力する |
git stash show |
スタッシュの変更を出力する |
git stash -m "メッセージ" |
メッセージを付け、変更をスタッシュにプッシュする |
git stash push -- <filepath> |
filepathのファイルのみ(複数可)をstashに入れる |
git stash branch <branch-name> [stash@{n}] |
スタッシュから新しいブランチを作成し、そこに変更を適用する |
git stash -k (--keep-index) |
ステージングしたファイル以外をstashに入れる |
git stash -u (--include-untracked) |
untrackedも含めてstashに入れる |
削除・適用
| コマンド |
説明 |
git stash apply |
スタッシュの変更をワーキングディレクトリに戻す(スタッシュから消えない) |
git stash apply stash@{n} |
特定のスタッシュを適用する |
git stash pop |
スタッシュの変更をワーキングディレクトリに戻す(スタッシュから消える) |
git stash pop stash@{n} |
特定のスタッシュを適用して削除する |
git stash drop stash@{n} |
n のスタッシュを削除する |
git stash clear |
すべてのスタッシュを削除する |
備考
| コマンド |
説明 |
git stash push -m "メッセージ" |
メッセージをつけてstashを作成。ただし、pushは省略可能
|
git stash save "メッセージ" |
push と同じ |
スタッシュについては、以下の記事が参考になります。
https://qiita.com/chihiro/items/f373873d5c2dfbd03250
git reflog
git reflog(リフログ)は、「参照ログ (reference logs)」の略で、HEADやブランチの先端が過去にどのコミットを指していたかの移動履歴を記録するコマンドです。git resetやrebaseなどで失われたように見えたコミットを救出するための強力な安全網として機能します。
一般的な使い方:
# reflogを表示
git reflog
# 出力例:
# 2a9e3b7 HEAD@{0}: reset: moving to HEAD~1 (← 間違ってresetした操作)
# f5a4e1c HEAD@{1}: commit: 新機能を追加 (← ここに戻りたい)
# c8b2a5d HEAD@{2}: checkout: moving from main to feature
# 戻りたい地点を指定してブランチを復元
git branch <新しいブランチ名> f5a4e1c
表示
| コマンド |
説明 |
git reflog |
HEADの移動履歴を一覧で表示する。git reflog show HEADとほぼ同義。 |
git reflog show <branch> |
特定ブランチの移動履歴を表示する。 |
操作・復元
| コマンド |
説明 |
git reset --hard HEAD@{n} |
n番目の履歴の状態にブランチを強制的に戻す。最も一般的な復元方法。 |
git branch <new-branch> HEAD@{n} |
n番目の履歴が指すコミットから新しいブランチを作成する。安全に状態を復元したい場合に有効。 |
git checkout HEAD@{n} |
n番目の履歴の状態を一時的にチェックアウトする(分離HEAD状態)。中身の確認に便利。 |
git cherry-pick HEAD@{n} |
n番目の履歴が指すコミットを、現在のブランチにコピーする。 |
管理
| コマンド |
説明 |
git reflog delete HEAD@{n} |
指定したn番目の履歴エントリーを削除する(通常はあまり使用しない)。 |
git reflog expire --all |
期限切れの古い履歴をすべて削除する。 |
備考
| ポイント |
説明 |
| ローカルのみの記録 |
reflogは各開発者のローカルリポジトリ内でのみ管理され、リモートリポジトリには共有されない。 |
| 究極の安全網 |
resetやrebaseの失敗など、コミットが失われたように見えるほとんどのケースで、reflogから復旧できる。 |
| 自動的な期限切れ |
履歴は永久には残らず、デフォルトでは90日など設定された期間を過ぎると自動的に削除される。 |
git log 応用
| コマンド |
説明 |
git log --oneline --graph --decorate --all |
Git Graph のようなログツリーをターミナル上で出力 |
git log --graph --name-status --pretty=format:"%C(red)%h %C(green)%an %C(Cyan)%ad %Creset%s %C(yellow)%d%Creset" |
ぼくのかんがえたさいきょうのぎっとろぐ |
HEAD
HEAD
ORIG_HEAD
特定のGit操作(主にgit reset、git merge、git rebaseなど)を行う前のHEADの位置を一時的に保存するポインタ.
- 主な使用法
git resetやgit mergeなどを実行する前の状態に戻りたい場合に使う.
- 例:
git reset → git reset --hard ORIG_HEAD
-
git resetを実行すると、その前のHEADの位置がORIG_HEADに保存される.
- このポインタ(ORIG_HEAD)をもとに、
git reset ORIG_HEADで操作を元に戻すことができる.
- 参考:ORIG_HEADの使用例