- ■ 主の PC環境一覧
- ■ 初めに
- ■ Gitコマンド
- □ status:差分ファイルを表示
- □ log:コミット履歴(ログ)表示
- □ branch:ブランチ操作
- □ remote:リモートリポジトリ間の接続管理
- □ add:コミット対象のファイルをステージング
- □ commit:ステージングした差分情報を履歴として保存
- □ fetch:リモートの最新履歴をローカルへ取得"するだけ"(HEADに保存される)
- □ merge:特定のブランチを結合
- □ rebase:特定のコミット履歴を再構成または変更を修正
- □ cherry-pick:特定のコミットを取り込み
- □ push:ステージングした差分情報をリモートへ更新(アップロード)
- □ pull:リモートの最新実装をローカルへ取得し結合「fetch」+「merge」
- □ checkout:ブランチ切り替え、作成及び切り替え、変更取り消し
- □ stash:ステージング前の差分ファイルを退避
- □ revert:特定のコミットを打ち消し
- □ reset:特定のコミット位置まで巻き戻し
- □ clean:未追跡のファイル(Untracked files)及びディレクトリを削除
- ■ Gitコマンド組み合わせ
- ■ 最後に
■ 主の PC環境一覧
OS:Windows11
CPU:Intel® Core™ i9 13900KF
Memory:64GB
■ 初めに
日々の開発作業で効率的に作業を進めるためには、正しい Gitコマンド及びの組み合わせが重要です。
この記事では、実践的なテクニックやタイムセーバーとなるコマンドの連携について探っていきます。初心者の方からベテランの方まで、シームレスな作業フローの構築をお手伝いさせていただきます。
■ Gitコマンド
□ status:差分ファイルを表示
$ git status
---
### 変更差分なし
# On branch <ブランチ名>
# Your branch is up to date with 'origin/<ブランチ名>'.
#
# nothing to commit, working tree clean
---
### 上部:ステージング済み / 下部:未ステージング
# On branch <ブランチ名>
# Your branch is up to date with 'origin/<ブランチ名>'.
#
# Changes to be committed:
# (use "git restore --staged <file>..." to unstage)
# modified: <該当のファイル名>
#
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git restore <file>..." to discard changes in working directory)
# modified: <該当のファイル名>
□ log:コミット履歴(ログ)表示
コミットログを表示
$ git log
---
# commit xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# Author: noanoachan <example@example.com>
# Date: Sat Aug 26 19:11:48 2023 +0900
# add: xxxxxを追加
コミットログに加え差分を表示
$ git log -p
# 特定の範囲(例:直近3つのコミット)を指定して差分を確認することも可能
$ git log -p HEAD~3..HEAD
---
commit xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx (HEAD)
Author: user <user@example.com>
Date: Thu Aug 29 00:36:10 2024 +0900
add: 3rd commit
diff --git a/workspace/index.tsx b/workspace/index.tsx
index xxxxxxx..xxxxxxx 111111
--- a/workspace/index.tsx
+++ b/workspace/index.tsx
@@ -21,7 +21,7 @@ export default function Footer() {
</ul>
</nav>
<p className={styles.cr}>
- © 2024 before
+ © 2024 after
</p>
</footer>
);
□ branch:ブランチ操作
ブランチ作成
$ git branch <ブランチ名>
ブランチ名を変更
$ git branch -m <旧ブランチ名> <新ブランチ名>
現在のブランチ名を強制的に変更
$ git branch -M <新ブランチ名>
ブランチ削除
$ git branch -d <ブランチ名>
ブランチ強制削除
$ git branch -D <ブランチ名>
□ remote:リモートリポジトリ間の接続管理
リモートリポジトリと紐付け
$ git remote add origin <リモートリポジトリの URL>
リモートリポジトリと紐付いている URLを表示
$ git remote -v
リモートリポジトリと紐付いている URLを変更
$ git remote set-url origin <新しいリモートリポジトリの URL>
□ add:コミット対象のファイルをステージング
全ての差分ファイルをステージング
$ git add .
任意のファイルのみ差分をステージング
$ git add <任意のファイルまたはフォルダ>
□ commit:ステージングした差分情報を履歴として保存
$ git commit
差分情報の履歴にコメント付与
$ git commit -m "<コメント>"
---
# 3行名に詳細を記載する場合
$ git commit -m "<コメント>" -m "<自動的に 2行目は「空行」となり 3行目に挿入される>"
□ fetch:リモートの最新履歴をローカルへ取得”するだけ”(HEADに保存される)
$ git fetch
リモートで削除されローカルに残っているブランチを削除
$ git fetch --prune
---
# From <リポジトリのアドレス>
# - [new] (none) -> origin/<ブランチ名>
# - [deleted] (none) -> origin/<ブランチ名>
# - [deleted] (none) -> origin/<ブランチ名>
□ merge:特定のブランチを結合
$ git merge <ブランチ名>
□ rebase:特定のコミット履歴を再構成または変更を修正
現在のブランチを特定のコミットにリベース
ここでは、作業ブランチを「develop
」とし、統合したいブランチを「main
」とします。
[補足]
特定のリモートブランチの変更の末端に、現在のローカルブランチの差分を統合させる。
端的に言うと、時系列順にコミットを合体させることができるので綺麗にできると表現されることが多い。
※ 私自身、あまり使用したことがなかったので、詳細は「$ git rebase
」に特化した他の記事を参考にしてください。
$ git rebase <統合したいブランチ名>
---
# before
(c) - (d) : develop
/
(a) - (b) - (e) - (f) : main
# after
(a) - (b) - (e) - (f) - (c) - (d) : develop
インタラクティブリベース(各コミット操作 (対話式))
インタラクティブリベースを使用することで、各コミットに対して操作を指定することができる。
※ ここでの操作とは「コミットログの修正」及び「実装修正」、「コミットログの統合」等を指す。
以下に具体的な手順を示します。
# <N> は最新コミットを含めて遡りたい数以上を指定
$ git rebase -i HEAD~<N>
---
# コミットIDを指定することも可能
$ git rebase -i <コミットID>
もっと詳しく
以下のコミットログで「add: 2nd commit
」を修正したい場合は、最新コミット(HEAD)を含めて、遡りたいコミット位置以上を指定すれば良い。
user@DESKTOP-C6CUK25 ~/workspace (develop)
$ git log
commit zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz(HEAD -> develop)
Author: user <user@example.com>
Date: Thu Aug 29 01:31:18 2024 +0900
add: 3rd commit
commit yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
Author: user <user@example.com>
Date: Thu Aug 29 00:36:10 2024 +0900
add: 2nd commit
commit xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Author: user <user@example.com>
Date: Sun Aug 25 10:31:49 2024 +0900
add: 1st commit
上記の例では、2以上を指定すれば良いことになる。
1. インタラクティブリベースにて rebaseコマンドを実行
コマンド実行後、対話が開始されます。
対話形式はエディタを通して行われますが、デフォルトは「nano」です。
※ 私は「nano」エディタを使用したことがないので「vim」に変更しています。
エディタを「vim」へ変更する方法
# core.editor: コミットメッセージの編集など、一般的な Git の操作で使用されるエディタを指定
$ git config --global core.editor vim
# sequence.editor: `$ git rebase -i ~`のような操作中に使用されるエディタを指定
$ git config --global sequence.editor vim
$ git rebase -i HEAD~3
---
pick zzzzzzz add: 3rd commit
pick yyyyyyy add: 2nd commit
pick xxxxxxx add: 1st commit
# Rebase 9452dd3..2b7f90f onto 9452dd3 (3 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup [-C | -c] <commit> = like "squash" but keep only the previous
# commit's log message, unless -C is used, in which case
# keep only this commit's message; -c is same as -C but
# opens the editor
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# . create a merge commit using the original merge commit's
# . message (or the oneline, if no original merge commit was
# . specified); use -c <commit> to reword the commit message
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
~
~
2. 操作したいコミットに特定のコマンドを適応
インタラクティブリベースの指定コマンド種別
pick
- そのままコミットを適応
reword
- コミットメッセージを変更
edit
- コミットを編集(実装の修正やコミットメッセージの修正が可能)
squash
- 前のコミットと結合(コミットメッセージも統合)
fixup
- 前のコミットと統合(コミットメッセージは破棄)
drop
- コミットを削除
2.1. 上記コマンドを実行した CLI上で「i」キーを押下(INSERTモード)
pick zzzzzzz add: 3rd commit
pick yyyyyyy add: 2nd commit
pick xxxxxxx add: 1st commit
<省略>
-- INSERT --
2.2. 変更したいコミットログの「pick」を「edit」へ変更
pick zzzzzzz add: 3rd commit
edit yyyyyyy add: 2nd commit
pick xxxxxxx add: 1st commit
<省略>
-- INSERT --
2.3. エディタを終了するために「esc」キーを押下し、「:wq」と入力して「Enrter」キーを押下
pick zzzzzzz add: 3rd commit
edit yyyyyyy add: 2nd commit
pick xxxxxxx add: 1st commit
<省略>
:wq
user@user ~/workspace (develop|REBASE 2/3)
3. 修正開始
ここでやっとファイルの修正が行えるので、実装の修正を行ってください。
また、これまでの手順は指定したコミットまで戻っただけなので、その時に行ったコミット(差分)は適応されたままです。
そのため、どのファイルを修正したかや差分をエディタ(VSCode 等)で確認することができないので気を付けてください。
ファイル差分を確認したい場合は「$ git diff
」または「$ git show
」、「$ git log
」コマンドで確認することができます。
4. 修正を適応
# 変更をステージング
$ git add .
# リベースを続行
$ git rebase --continue
リベース時のコンフリクト(競合)を解消
リベースを続行
$ git rabase <ブランチ名>
---
# 手動にてコンフリクトを解決した後にステージング
$ git add .
# リベースを続行
$ git rebase --continue
特定のコミットをスキップ
$ git rabase <ブランチ名>
---
# コンフリクトが発生したコミットを適応せずにスキップ
$ git rebase --skip
リベース全体を中止し及び開始前の状態に戻す
$ git rabase <ブランチ名>
---
# リベースを中止し及び開始前の状態に戻す
$ git rebase --abort
□ cherry-pick:特定のコミットを取り込み
$ git fetch --prune
$ git cherry-pick <コミットID>
特定のコミットを取り込むがステージングにはあげない場合
$ git fetch --prune
$ git cherry-pick -n <コミットID>
□ push:ステージングした差分情報をリモートへ更新(アップロード)
$ git push
強制プッシュ
$ git push -f
---
# リモートブランチを指定して強制プッシュをする場合
$ git push -f origin <リモートブランチ名>
まだリモートに存在しないローカルブランチをアップロードする場合
$ git push -u origin <ローカルブランチ名>
□ pull:リモートの最新実装をローカルへ取得し結合「fetch」+「merge」
$ git pull
□ checkout:ブランチ切り替え、作成及び切り替え、変更取り消し
ブランチ切り替え
$ git checkout <ブランチ名>
ローカルで新規ブランチを作成し切り替え
$ git checkout -b <ブランチ名>
ローカルでの差分を取り消し
全て取り消し
$ git checkout -- .
任意のファイルのみ取り消し
$ git checkout -- <ファイル名>
任意のディレクトリ内を全て取り消し
$ git checkout -- <ディレクトリ名>
□ stash:ステージング前の差分ファイルを退避
差分ファイルを退避
全ての差分ファイルを退避
$ git stash
任意の差分ファイルのみを退避
$ git stash <ファイル名>
現在の差分に加え未追跡のファイルも含めて退避
$ git stash -u
現在の差分に加え未追跡のファイル及び無視されたファイルも含めて退避
$ git stash -a
退避時にコメントを付与
# 非推奨
$ git stash save "<コメント>"
# 推奨
$ git stash push -m "<コメント>"
任意のファイルのみ退避
# 特定のファイルのみを退避
$ git stash push -m "<コメント>" -- <ファイルパス>
# 特定のファイル複数を退避
$ git stash push -m "<コメント>" -- <ファイルパス_1> <ファイルパス_2> <ファイルパス_3>
# ワイルドカード(*)を使用して一括退避
$ git stash push -m "<コメント>" -- *.ext
退避リストを表示(最新の退避リスト番号は「0」)
$ git stash list
退避した差分を残したまま元に戻す
# 最新の退避を戻す
$ git stash apply
# 指定した退避リストから戻す
$ git stash apply stash@{リスト番号}
退避した差分を削除して元に戻す
# 最新の退避を戻す
$ git stash pop
# 指定した退避リストから戻す
$ git stash pop stash@{リスト番号}
退避したファイルを参照
# N = 退避リスト番号
git stash show stash@{N}
□ revert:特定のコミットを打ち消し
$ git revert <コミットID>
打ち消し後にコミットを作成しない場合
$ git revert -n <コミットID>
打ち消し時にコミットメッセージを編集しない場合(自動的に記載されたコミットメッセージが採用)
$ git revert --no-edit <コミットID>
打ち消し時のコミットメッセージを編集(デフォルト)
$ git revert -e <コミットID>
□ reset:特定のコミット位置まで巻き戻し
コミットを巻き戻し変更を加えたファイルはそのままステージング状態に戻す
$ git reset --soft <コミットID>
コミットを巻き戻し変更を加えたファイルはそのままステージング状態からも戻す
$ git reset --mixed <コミットID>
コミットを巻き戻し変更を加えたファイル自体も元に戻す (削除したファイルも復活)
$ git reset --hard <コミットID>
上記、コミット取り消しコマンドで使用する上で「コミットID」を使用しない方法
「^
(キャレット)」の数分だけ現在地点から戻すことができる。(コミットIDを使用する方が安全)
※ 現在の最新コミットを含めた分だけ戻ることに注意!
# 直前の状態へ戻す
$ git reset <オプション> HEAD^
# 3つ前の状態へ戻す
$ git reset <オプション> HEAD^^^
誤って巻き戻してしまったコミットを元に戻す場合
$ git reset --hard ORIG_HEAD
□ clean:未追跡のファイル(Untracked files)及びディレクトリを削除
外部で変更された環境を結合する場合や新規ファイル(未追跡)を作成した際、後から不要になって取り消したい場合に使用
追跡対象のファイルやディレクトリであれば「checkout」や「reset」コマンドで取り消しが可能だが、未追跡の場合は『clean
』コマンドを使用
未追跡のファイル(Untracked files)を削除
$ git clean -f
未追跡のディレクトリを削除
$ git clean -df
削除されるファイル及びディレクトリを確認
# 削除されるファイル確認
$ git clean -n
# 削除されるディレクトリ確認
$ git clean -nd
■ Gitコマンド組み合わせ
□ ワークツリーでの差分をリモートにアップロードする場合
名前 | 説明 |
---|---|
ワーキングツリー | 実際に作業している場所(ディレクトリ) |
インデックス | リポジトリにコミットする準備をするための場所 |
ステージング | コミットしたファイルを指定する作業 「ワーキングツリー」から「インデックス」への反映 |
# ステージング
$ git add .
# コミット
$ git commit -m "<コメント>"
# アップロード
$ git push
□ 作業中にリモート上で更新(差分)を取り込まないといけない場合
変更差分を退避
$ git stash
# リモートの最新を結合
$ git pull
# 退避したファイルを戻す(退避データを残す場合)
$ git stash apply
# 退避したファイルを戻す(退避データを削除する場合)
$ git stash pop
□ リモートで作成されたブランチに切り替える場合
# リモートの最新を取得(且つリモートで削除されたブランチを削除)
$ git fetch --prune
# ブランチ確認
$ git branch -a
# ブランチ切り替え
$ git checkout <ブランチ名>
□ 特定のコミットまで巻き戻しリモートを強制的に更新する場合
# コミットログを表示しコミットIDを取得
$ git log
# 特定のコミットID位置まで巻き戻し
$ git reset --hard <コミットID>
# 巻き戻した位置をリモートへ強制的にアップロード(反映)
$ git push -f origin <ブランチ名>
■ 最後に
Gitの力を最大限に活用して、効率的でスムーズな開発を実現しましょう
comment 📝