ソースコードやファイルの変更履歴を管理するためのツールとして今日も多くの開発者が利用しているGit(ギット)。
本記事では、Gitにおいてまずは押さえておきたいGitコマンドをカテゴリ別に分けて一挙ご紹介します!
本記事をブックマークに追加しておいて、チートシートとして開発のお供としてご活用ください✊
[ 本記事はこんな人におすすめ ]
・Gitをこれから使い始める
・Gitの基本的なコマンド操作を学びたい
・Gitコマンドのチートシートが欲しい
環境・バージョン
> Swift 5.7.2
> Xcode 14.2
> macOS 13.0 Ventura
GitHubなどで公開されているリポジトリを複製してローカルに持ってくるために使用するgit cloneコマンドです。
コマンドを実行すると、現在の作業ディレクトリに新しいディレクトリが作成され、その中にリポジトリの全てのファイルと履歴が保存されます。
# リポジトリを保存したいディレクトリに移動
$ cd <ディレクトリパス>
# 例) cd /Users/ken/Documents/CodeCandy_Lesson
# 既存リポジトリを複製して取得
$ git clone <リポジトリパス>
# 例) git@github.com:kensuke242424/GitTutorialApp.git
リポジトリパスはGitHubリポジトリ内の以下の場所から参照できます。
ローカルリポジトリ内のブランチの一覧を表示します。
現在作業中のブランチには名前に「*」が付きます。
# ブランチを一覧で確認
$ git branch
ローカルリポジトリ内に新規のブランチを作成します。
# ブランチ新規作成
$ git branch <ブランチ名>
# 例) git branch branch1
指定したブランチに作業ブランチを移動します。
ブランチの新規作成と移動を同時に行うことも可能です。
# ブランチを移動
$ git switch <ブランチ名>
# 例) git switch branch1
# ブランチ作成と移動を同時に実行
$ git switch -c <ブランチ名>
# 例) git switch -c branch2
ローカルブランチを削除します。
現在のブランチを削除することはできないので、その場合は作業ブランチを移動してから削除を実行します。
# ローカルブランチ削除
$ git branch -D <ブランチ名>
# 例) git branch -D branch1
リモートリポジトリ側のブランチを削除します。
# リモートブランチ削除
$ git push --delete origin <ブランチ名>
# 例) git push --delete origin branch1
リモート側では削除されているが、ローカル側には残っているブランチを削除します。
# 削除対象のブランチを確認する
$ git remote prune origin --dry-run
# 幽霊ブランチの削除を実行
$ git remote prune origin
「-u」オプションを付けることで、現在のカレントブランチを追跡ブランチとして設定し、次回以降のpush時に指定しなくてもデフォルトでこのブランチを送信先として使用するように設定します。
# 初回プッシュ時
$ git push -u origin <ブランチ名>
# 例) git push -u origin branch1
# 次回以降
$ git push
「作業ブランチ」と「リモート側のmainブランチ」との差分を、作業ブランチに取り込む方法です。他の開発者によってリモートに何らかの追加や変更がされた場合に、修正状態を合わせるために行います。
以下の手順を踏みます。
$ git add <ファイル名>
$ git commit -m "<コミットメッセージ>"
git add
のときは、修正したファイル名を指定して追加しましょう。関係のないファイルの追加を防止するためにも、今回の修正対象となっているファイル名のみを指定します。
# mainブランチに移動
$ git switch main
# リモートのmainを取り込む
$ git pull origin main
mainブランチに移動し、リモート側のmainブランチの最新状態をローカル側に取り込みます。
元の作業ブランチに戻り、先ほど取得したmainブランチの状態を作業ブランチにmergeします。コンフリクトが発生した場合は修正し、再度addとcommitを実行します。
# 作業ブランチに戻る
$ git switch <作業ブランチ名>
# mainを作業ブランチに取り込む
$ git merge main
$ git fetch origin
$ git reset --hard origin/(上書きしたいブランチ名)
ローカルがよくわからない状態になったときに使えます。指定したブランチの内容で、ローカルを強制的に上書きします。
git addによってステージングエリアに追加された変更内容を確認するにはstatusコマンドを使います。
# ステージングエリア内のソースを確認
$ git status
コミット履歴および作業環境を指定コミット時点の状態までリセットします。
resetコマンドは、指定したコミットより以降の修正変更を取り消します。
# コミットIDの確認
$ git log
# 指定コミット時点の状態まで戻す
$ git reset --hard <コミットID>
【resetコマンドの解説図】
取り消し対象のコミットをすでにリモートへプッシュ済みだった場合、リモート・ローカル間のコミット履歴に不整合が発生するため注意してください。
前項目resetコマンドによる「直前コミットを取り消す」パターンです。
「HEAD^」は最新コミットの一つ手前のコミットを指しています。
作業ディレクトリの状態も一緒に戻す場合はhardオプション、現在の作業状態は残しておきたい場合はsoftオプションを使います。
# 直前のコミットを取り消し、作業状態も戻す
$ git reset --hard HEAD^
# 直前のコミットを取り消すが、作業状態は残しておく
$ git reset --soft HEAD^
取り消し対象のコミットをすでにリモートへプッシュ済みだった場合、リモート・ローカル間のコミット履歴に不整合が発生するため注意してください。
リモートへプッシュ済みの直前コミットを後から取り消したい場合に取る方法です。
ローカル側で直前のコミットを削除してから再度リモートに強制プッシュすることで、コミット履歴の差分を上書きしてリモートの状態を一つ前のコミットの状態に戻します。
※ こちらの方法はリモートへの強制プッシュを用います。使用には十分注意してください。
-f
オプションを用いることでローカルの修正をリモートに強制プッシュします。
# 直前のコミットを取り消し
$ git reset --hard HEAD^
# リモートへ強制プッシュ
$ git push -f origin <ブランチ名>
「zsh: no matches found: HEAD^」のメッセージが出て実行できないときは、次のコマンドを使います。
$ git reset --soft HEAD^
$ git push -f origin <ブランチ名>
強制プッシュは細心の注意を
強制プッシュコマンドは、指定したブランチの最新のコミットを強制的にリモートリポジトリにプッシュし、既存のコミットを上書きします。
強制プッシュは強力な操作であり、自分以外の人の修正内容も含めて、あらゆる変更を強制的に上書きします。つまり、他の人がすでにリモートリポジトリから変更を取得している場合には、彼らの作業が破損する可能性があります。
基本的に強制プッシュコマンドを使用するのは個人開発など、「自分しか利用していないリモートブランチだけ」とするのが望ましいでしょう。使用の際には十分注意してください。
指定したコミットの変更内容を打ち消した新しいコミットを作成します。
「緊急でブランチ内の◯△コミットでの修正内容を取り消す必要が出た」などの場合に活用できます。
オプションを使用すれば「指定コミットの打ち消しのみ行いコミットは作らない」ということも可能です。
#コミットIDの確認
$ git log
# 指定コミットを打ち消した新規コミットの作成
$ git revert <打ち消したいコミットID>
# 直前のコミットの内容を打ち消す場合
$ git revert HEAD
# 打ち消し処理だけでコミットは作らない場合
$ git revert --no-commit
【revertコマンドの解説図】
revertを実行すると、以下のように新規コミットのコメント編集モードが開きます。適切なコメントを付与して保存しましょう。
resetコマンドとの違いとして、revertコマンドは新たなコミットが作成されるだけで過去のコミット履歴を改変しないので、ローカル・リモート間で履歴の不整合が起きてしまうなどのリスクを防ぎながら修正ができます。
また、revertコマンドは指定したコミット“のみ”を打ち消すという点に注意してください。
ローカルでコミットした直後であれば、コミットメッセージをamend
で変更できます。
# コミット直後のコミットメッセージを変更
$ git commit --amend -m "<修正コメント>"
diffコマンドでワーキングツリー(実際の作業ファイル)のソースと直前のコミットとの差分を確認できます。
addによって追加されたステージングエリア内との差分を見たい場合は、cachedオプションを付与します。
# ワーキングツリーと比較
$ git diff
# ステージングエリアと比較
$ git diff --cached
プッシュ前のローカルリポジトリとリモートリポジトリとの差分を見る場合は以下のように実行します。
# リモートリポジトリの最新情報を取得
$ git fetch origin
# リモートブランチと現在のブランチを比較
$ git diff origin/<ブランチ名>
# 例) git diff origin/main ⬅︎ リモートのmainブランチと現在のブランチを比較
作業ディレクトリ内の変更を一時的に退避させておくstash
コマンドです。
例えば、「緊急で他の部分での作業が必要になったが、今進めてた作業はコミットを作るほどではない…」といった場合に、現状の作業内容を一時的に保管しておくような使い方が可能です。
# 現在の作業を一時的に待避
$ git stash save "任意のメッセージ"
#待避したデータの確認
$ git stash list
# 例) stash@{番号}: On <ブランチ名>: <メッセージ>
【stachによる一時待避の様子】
待避データは複数保有することができ、保有している待避データはgit stach listで確認できます。
待避データは複数個の保有が可能です。追加されたデータ順に数字番号が割り振られて「stash@{番号}」という形でリストに保管されます。
stash
によって一時待避された作業データを復旧するにはgit stach applyコマンドを使います。
# 待避データを復旧する
$ git stash apply <復旧したいstash名>
# 例) git stash apply stash@{2}
# stachの指定がない場合、直近の待避データが復旧される
$ git stash apply
【applyによる待避データ復旧の様子】
待避されたデータをapply
で復旧した後も、データは削除されずリスト内に残存します。
待避データを削除するにはgit stash dropコマンドを使います。
# 待避データを削除する
$ git stash drop <削除したいstash名>
# 例) git stash drop stash@{1}
# stachの指定がない場合、直近の待避データを削除
$ git stash drop
また、git stash popコマンドを使えば、「apply」と「drop」コマンドを同時に実行することも可能です。
# 待避データの復旧と削除を同時に実行
$ git stash pop
# 例) git stash pop stash@{1}
指定したブランチを現在のブランチにマージします。
# ブランチを移動(ここで移動したブランチに対してマージをします)
$ git switch <ブランチ名>
# 例) git switch main
# 現在のブランチに指定ブランチをマージ
$ git merge <ブランチ名>
# 例) git marge branch1 ⬅︎ mainに対してbranch1をマージ
マージ実行時にsquash
オプションを使用することで、ブランチ先で行った修正や変更内容の全てが一つのコミットとしてまとまり、現在のブランチのステージングエリアに取り込まれます。(つまりこの時点ではコミットは作成されません)
# マージを実行したいブランチに移動
$ git switch <ブランチ名>
# 例) git switch main
# ブランチの変更を1つのコミットにまとめて、現在のブランチにマージ
$ git merge --squash <ブランチ名>
# 例) git merge --squash branch1
Gitではブランチをマージする時、そのブランチがマージ対象のブランチの履歴を全て含んでいる場合、マージ履歴が残らないFast-Forwardマージがデフォルト設定でONになっています。
Fast-Forwardマージを無効化して、マージコミットを作成する場合は--no-ff
オプションを使います。
# マージ時にマージコミットを作成
$ git merge --no-ff <ブランチ名>
Fast-Forwardマージは簡単かつ迅速にマージを行うことができますが、「マージによる変更を後から取り消したい」「マージによって変更された部分を後から確認したい」といった場合などに、マージコミットが残っていないと対応が難しくなります。
決してFast-Forwardマージが悪者なわけではありませんが、状況によって適切に使い分けましょう。
デフォルトのFast-forwardマージ設定をOFFにする場合は、以下のようにコマンドを打ちます。
# マージ時にFast-forwardマージを行わないように設定
$ git config --global --add merge.ff false
# pull時にはFast-forwardマージしか行わないように設定
$ git config --global --add pull.ff only
一つ目のコマンドだけだとpull時にもマージコミットが作られてしまうため、二つ目のコマンドでpull時にはFast-forwardマージだけを実行するように設定しています。
マージ実行後にコミットを作成せず、変更内容がステージングエリアに反映された状態でマージを終了します。
# マージを実行後、コミットを作成せずにマージを完了する
$ git merge --no-commit <指定ブランチ名>
これにより、マージ後に変更内容を確認してから、適切なコミットメッセージを付けた上でコミットするなどの対応が可能です。
マージに失敗した場合、--abort
オプションを指定することでマージ処理が中止され、ステージングと作業ディレクトリがマージ前の状態に戻ります。
# マージをキャンセルする
$ git merge --abort
マージ実行時に起きた競合(コンフリクト)を手動で解決した後に、一時停止しているマージ処理を再実行するために使用します。
# マージを再実行
$ $ git merge --continue
git add できないときや管理が上手くいかないときは、キャッシュを削除すると動く場合があります。
# ファイル全体のキャッシュ削除
$ git rm -r --cached .
Gitではコミットに対してタグを付けることができます。
例えばプロダクトの開発バージョンごとにタグを付けておけば、後からソースの閲覧や管理がしやすいなどのメリットがあります。
作成したタグはGitHubのリポジトリ内に以下のように追加され閲覧できます。(リモートにプッシュする必要あり)
ではタグ関連のコマンドを見ていきましょう。
前提として、タグは特定のコミットに対して追加されます。
タグ自身に対してコメントメッセージを付与することも可能です。
特定のコミット指定がない場合、タグは現在の作業ブランチの最新コミット(HEAD)に対して追加されます。
# タグをつける
$ $ git tag <タグ名>
# 例) git tag v1.0
# コメント付きでタグをつける
$ $ git tag -a <タグ名> -m "<タグに関するコメント>"
# 例) git tag -a v1.0 -m "リリースバージョン1.0"
特定のコミットを指定する場合は、コミットのハッシュIDを追加します。
# 指定コミットへのタグ付け
$ $ git tag <タグ名> <コミットID>
# 例) git tag v1.0 abc123def456
$ $ git tag -a <タグ名> <コミットID> -m "<タグに関するコメント>"
# 例) git tag -a v1.0 abc123def456 -m "リリースバージョン1.0"
タグは作成しただけではリモートに反映されません。リモートに反映させるにはタグをプッシュする必要があります。
# 指定タグのプッシュ
$ $ git push origin <タグ名>
# 全てのタグをプッシュ
$ $ git push --tags
# タグの一覧表示
$ $ git tag
# タグの詳細を確認
$ $ git show <タグ名>
# 例) git show v1.0
ローカル側のタグを削除します。
# タグの削除
$ $ git tag -d <タグ名>
# 例) git tag -d v1.0
すでにタグをリモートにプッシュ済みの場合、タグ削除には注意が必要です。下記の「リモートのタグを削除する」へ続きます。
リモートに共有しているタグを削除します。
# リモートのタグを削除
$ $ git push origin --delete <タグ名>
# 例) git push origin --delete v1.0
他の開発者がすでにリモートからタグを取得しているような場合、リモートタグの削除は彼らの作業に影響を与える可能性があります。
どうしてもリモートのタグを変更削除する必要がある場合は、周囲の開発者に事前に通知し、影響を最小限に抑えるように調整することが重要です。
Gitには、各コマンドごとに使用可能なオプションを確認できるヘルプ機能があります。
# コマンドで使用できるオプションのヘルプ表示
$ git <コマンド> -h
# より詳しいオプションヘルプの表示
$ git <コマンド> --help
# 例) git clone -h
【ヘルプの表示例】
本記事で紹介した内容の他にも、コマンドごとに様々なオプションが存在します。
基本操作に慣れてきたら、各コマンドにどんなオプションがあるのかチェックしてみてください👍
以上、Gitの基本コマンドを一挙ご紹介しました!
Gitの操作に慣れるために、空のプロジェクトを作成して、色々なコマンドを試してみることをおすすめします👍
記事中にも記載しているように、自分以外の人も参照しているソースの書き換えが可能なコマンドの使用には特に注意しましょう!
本記事が参考になれば幸いです。
\ SHARE /
アプリ開発が学べる勉強会を開催中!
CodeCandyではアプリ開発を学ぶための勉強会を定期開催しています。
学習する習慣を身につけたい、他の参加者と作業したい、アプリ開発の基本をマスターしたい、という方のために無料で学べる勉強会です。
グループにメンバー登録して頂くと、イベント開催時にメールで通知されます。
徹底した基礎学習からマスターするiPhoneアプリ開発集中オンライン講座開講!
本書「iPhoneアプリ開発集中講座」を執筆している現役エンジニア講師陣が直接に指導!
基礎、課題実習で実践力を鍛えて、オリジナルアプリ公開までチャレンジ!
充実した転職支援もあるので、エンジニアへ転職したい人にもおすすめです!
まずは、現役エンジニアに相談できる無料相談をご利用ください。
2022年2月よりSwift学習を始め、4月からiOSアプリ開発オンラインスクール「CodeCandy」にてアプリ開発を学ぶ。 2023年10月に個人開発アプリ「unico」をリリース。現在はアプリの機能アップデートをしながら、スクール運営の技術ブログの執筆や、出版書籍の入稿チェック・デバッグにも携わる。