【保存版】Gitコマンド一覧と基本的な使い方まとめ

<a href="https://sunsuntech.my.canva.site/lp">
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072651/75d258e1-b269-4499-8acf-c960f970b030.png" width=100%>
</a>

<table>
  <caption>Gitコマンド一覧</caption>
  <thead>
    <tr>
      <th>目的（リンク押下で詳細を確認）</th>　<th>コマンド</th>
    </tr>
  </thead>
  <tr>
    <td><a href="#git-init">作業ディレクトリでGitを使う</a></td>
    <td> git init </td>
  </tr>
  <tr>
    <td><a href="#git-clone">Gitリポジトリをクローン</a></td>
    <td>git clone [URL]</td>
  </tr>
　<tr>
    <td><a href="#git-add">変更をステージング</a></td>
    <td>git add [ファイル名]</td>
  </tr>
  <tr>
    <td>
        <a href="#git-commit">コミット（変更を記録）する</a><br><br>
        <a href="#git-commit">直前のコミット内容やメッセージを修正する</a>
    </td>
    <td>
        git commit -m "[メッセージ]"<br><br>
        git commit --amend -m "[修正したコミットメッセージ]"  
    </td>
  </tr>
  <tr>
    <td><a href="#git-status">現在の状態を確認</a></td>
    <td>git status</td>
  </tr>
  <tr>
    <td>
        <a href="#git-diff">変更の差分を確認</a><br><br>
        <a href="#git-diff">ステージングされた変更と最後のコミットの差分表示</a><br><br>
        <a href="#git-diff">現在の作業状態と最新のコミットとの差分表示</a>
    </td>
    <td>
        git diff<br><br>
        git diff --staged<br><br>
        git diff HEAD
    </td>
　</tr>
  <tr>
    <td>
        <a href="#git-log">コミット履歴を見る</a><br><br>
        <a href="#git-log">各コミットを1行で表示</a><br><br>
        <a href="#git-log">ブランチの流れを視覚的に表示</a><br><br>
        <a href="#git-log">各コミットでの変更差分も表示</a><br><br>
        <a href="#git-log">指定した作者のコミットのみ表示</a><br><br>
        <a href="#git-log">過去2日間のコミットだけ表示（自然言語OK）</a>
    </td>
    <td>
        git log<br><br>
        git log --oneline<br><br>
        git log --graph<br><br>
        git log -p<br><br>
        git log --author="名前"<br><br>
        git log --since="2.days"
    </td>
  </tr>
  <tr>
    <td>
        <a href="#git-remote-add-origin">リモートリポジトリを登録</a>
    </td>
    <td>
        git remote add origin [URL]
    </td>
  </tr>
  <tr>
    <td>
        <a href="#git-push">リモートにpush</a><br><br>
        <a href="#git-push">初回の push（ローカルとリモートを関連付け）</a><br><br>
        <a href="#git-push">2回目以降の push（-u 省略可）</a>
    </td>
    <td>
        git push origin main<br><br>
        git push -u origin main<br><br>
        git push
    </td>
  </tr>
  <tr>
    <td>
        <a href="#git-pull">リモートからpull</a><br><br>
        <a href="#git-pull">明示的に origin/ブランチ名 を指定して取得＋マージ</a><br><br>
        <a href="#git-pull">マージではなくリベースで取り込む</a>
    </td>
    <td>
        git pull<br><br>
        git pull origin ブランチ名<br><br>
        git pull --rebase
    </td>
  </tr>
  <tr>
    <td>
        <a href="#git-branch">ブランチを作成</a><br><br>
        <a href="#git-branch">ブランチ一覧を表示</a><br><br>
        <a href="#git-branch">ブランチを削除</a><br><br>
        <a href="#git-branch">強制的に削除</a>
    </td>
    <td>
        git branch [ブランチ名]<br><br>
        git branch<br><br>
        git branch -d ブランチ名<br><br>
        git branch -D ブランチ名
    </td>
  </tr>  
  <tr>
    <td>
        <a href="#git-switch">ブランチを切り替える</a><br><br>
        <a href="#git-switch">新しくブランチを作って、そのまま切り替え</a>
    </td>
    <td>
        git switch [ブランチ名]<br><br>
        git switch -c ブランチ名
    </td>
  </tr>
  <tr>
    <td>
        <a href="#git-checkout">ブランチを切り替える</a><br><br>
        <a href="#git-checkout">新しいブランチを作成＆切り替え</a><br><br>
        <a href="#git-checkout">ファイルの変更を取り消す（ステージ前の状態に戻す）</a><br><br>
        <a href="#git-checkout">過去のコミット状態に一時的に切り替える（閲覧目的）</a>
    </td>
    <td>
        git checkout [ブランチ名]<br><br>
        git checkout -b ブランチ名<br><br>
        git checkout -- ファイル名<br><br>
        git checkout コミットID
    </td>
  </tr>  
  <tr>
    <td><a href="#git-merge">マージする（ブランチを統合）</a></td>
    <td>git merge [ブランチ名]</td>
  </tr>
  <tr>
    <td>
        <a href="#git-restore">ローカルの変更を元に戻す</a><br><br>
        <a href="#git-restore">すべてのファイルを元に戻す</a><br><br>
        <a href="#git-restore">ステージングした変更（git add）を取り消す</a>
    </td>
    <td>
        git restore [ファイル名]<br><br>
        git restore .<br><br>
        git restore --staged 
    </td>
  </tr>
  <tr>
    <td>
        <a href="#git-reset">ステージングの変更を外す</a><br><br>
        <a href="#git-reset">最後のコミットを取り消したい（変更は残したい）</a><br><br>
        <a href="#git-reset">ステージングだけを取り消したい（デフォルト動作）</a><br><br>
        <a href="#git-reset">すべての変更を完全に取り消す（注意！）</a>
    </td>
    <td>
        git reset HEAD [ファイル名]<br><br>
        git reset --soft HEAD^<br><br>
        git reset --mixed HEAD<br><br>
        git reset --hard HEAD
    </td>
  </tr>
</table>

<a href="https://sunsuntech.my.canva.site/">
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072651/fc41e67e-645c-4dee-a4ef-bc75c9c78dff.png" width=100%>
</a>

## git init
作業ディレクトリに.gitフォルダを作成し、そのフォルダ以下をGitで管理できるようにします。
+ 現在のディレクトリに .git フォルダを作成し、Gitのバージョン管理を開始
+ 初回のプロジェクトで「Git管理を開始したい」ときに使用


## git clone
既存のリモートリポジトリをローカルにコピーします。
```bash:例
git clone https://github.com/user/repo.git
```
+ ``origin`` という名前でリモートが設定される


## git add
変更されたファイルを「ステージング領域」に追加します。
```bash:例
（　すべての変更を追加　）
git add .

（　特定ファイルだけ追加　）
git add ファイル名
```
+ ``.``（ドット）は「すべての変更されたファイル」をステージング（準備）する意味
    + ステージングとは「これらのファイルを次のコミットに含めるよ」とGitに伝えること


## git commit
ステージングされた変更をコミット（履歴として記録）します。
```bash:例
（　コミットメッセージをその場で書く（message の略）　）
git commit -m "コミットする"

（　直前のコミット内容やメッセージを修正する　）
git commit --amend -m "修正したコミットメッセージ"  
```
+ ``-m`` オプションは “message” の略
    + コミットには必ずメッセージが必要で、変更内容の概要を記述
+ ``--amend`` オプションは以下のようなことが可能になります
    + コミットメッセージの変更
    + ステージし忘れたファイルの追加・修正
    + テスト的なコミットをきれいにまとめ直す

## git status
作業ディレクトリの現在の状態（変更・ステージングの有無など）を確認します。
+ どのファイルが変更されたか、ステージされているか、まだコミットされていないかを確認
+ よくある使い方の流れ：
1\.ファイルを編集する
2\.``git status`` で変更を確認する
3\.``git add`` → ``git commit`` と進める


## git diff
ワーキングツリー（作業ディレクトリ）の変更内容を表示します。
+ ステージングされていない変更の差分（diff）を表示
+ どこを編集したのかを確認したいときに便利

```bash:例
（　作業ツリーとステージの差分を表示（未ステージ）　）
git diff

（　ステージングされた変更と最後のコミットの差分表示　）
git diff --staged

（　現在の作業状態と最新のコミットとの差分表示　）
git diff HEAD
```
+ ``--staged`` は、ステージされた内容が「このままコミットして大丈夫か」を確認するときに使う
+ ``HEAD`` は、ステージングされていようがいまいが、作業中の変更すべてをまとめて比較できる


## git log
過去のコミット履歴を表示
```bash:例
（　過去のコミット履歴を表示　）
git log

（　各コミットを1行で表示（ハッシュ＋メッセージ）　）
git log --oneline

（　ブランチの流れ（マージなど）を視覚的に表示　）
git log --graph

（　各コミットでの変更差分も表示　）
git log -p

（　指定した作者のコミットのみ表示　）
git log --author="名前"

（　過去2日間のコミットだけ表示（自然言語OK）　）
git log --since="2.days"
```
+ チーム開発中に「誰がいつ何をしたか」を追跡
+ 直前のコミットを確認し、``revert`` や ``reset`` で戻したい


## git remote add origin
ローカルリポジトリにリモートリポジトリを登録します。
+ GitHubで新しくリポジトリを作成したあと、ローカルとつなぐために使う
+ 通常は ``git push`` を使う前に一度だけ設定
```bash:例
git remote add origin https://github.com/ユーザー名/リポジトリ名.git  
```
+ ``remote add`` は、リモートリポジトリを追加するコマンド
+ ``origin`` は、リモートリポジトリに付ける名前（慣習的に "origin" を使う）
+ [URL] は、リモートリポジトリのURL（GitHub等で表示されるHTTPS/SSH URL）


## git push
ローカルリポジトリの変更をリモートリポジトリに反映（プッシュ）します。
```bash:例
（　初回の push（ローカルとリモートを関連付け）　）
git push -u origin main

（　2回目以降の push（-u 省略可）　）
git push

（　develop ブランチをリモートに push　）
git push origin develop
```
+ ``-u`` は、初回 ``push`` 時に使用することで、ローカルのブランチとリモートのブランチ（origin/main など）を「ひも付け」する
    + この設定をすると、次回以降は ``git push`` だけで OK になる
+ ``origin`` は、リモートリポジトリの名前（通常は origin）
+ ``main`` や ``develop`` は、プッシュしたいローカルのブランチ名（例：main, develop など）

:::note info
これで GitHub 上のリポジトリにコードがアップロードされ、他の人と共有できるようになります。
:::


## git pull
リモートリポジトリの最新の変更を取得して、ローカルに自動でマージします。
```bash:例
（　トラッキング済みのリモートブランチから取得＋マージ（origin/main など）　）
git pull

（　明示的に origin/main を指定して取得＋マージ　）
git pull origin main  

（　マージではなくリベースで取り込む（履歴をきれいにしたいとき）　）
git pull --rebase
```
+ ``origin`` は、リモートリポジトリの名前（通常は origin）
+ ``main`` は、リモートブランチ名（例：main, develop）

このコマンドは、``git fetch``（リモートから最新情報を取得）と``git merge``（取得した変更をローカルブランチに統合）の処理を一度に行います。

:::note alert
チーム開発中に他の人が push した最新の変更を取り込むときにしようします。
もしコンフリクト（競合）が発生した場合は、手動で解決 → add → commit が必要になります。
:::


## git branch
ブランチを確認・作成・削除するためのコマンドです。
```bash:例
（　ブランチ一覧を表示　）
git branch 

（　新しいブランチを作成（切り替えはされない）　）
git branch ブランチ名

（　ブランチを削除　）
git branch -d ブランチ名

（　強制的に削除　）
git branch -D ブランチ名
```
+ ``-d`` は「delete（削除）」の略
    + すでに他のブランチへマージされたブランチだけ削除できます
    + 未マージのブランチはエラーになります（誤削除防止のため）
+ ``-D`` は「強制削除（force delete）」を意味します
    + -d の厳格チェックを無視して削除します
    + 誤って削除すると復元が面倒なので注意が必要です


## git switch
ブランチを切り替える、または新しく作って切り替えるためのコマンドです（Git 2.23 以降推奨）。
```bash:例
（　既存のブランチに切り替え　）
git switch ブランチ名 

（　新しくブランチを作って、そのまま切り替え　）
git switch -c ブランチ名
```
+ ``-c`` は「create（作成）」の略
    + すでに存在するブランチ名を指定するとエラーになります

:::note info
git checkout に比べて安全でわかりやすいため、初学者にはこちらをおすすめします。
:::


## git checkout
もともとブランチの切り替えや、特定のファイル・コミットの復元に使われていた多機能コマンドです。
```bash:例
（　指定したブランチに切り替え（古い方法）　）
git checkout ブランチ名 

（　新しいブランチを作成＆切り替え（switch -c と同じ）　）
git checkout -b ブランチ名

（　ファイルの変更を取り消す（ステージ前の状態に戻す）　）
git checkout -- ファイル名

（　	過去のコミット状態に一時的に切り替える（閲覧目的）　）
git checkout コミットID
```
+ ``-b`` は「branch（ブランチ）」の略
    + 現在のブランチを元に、新しいブランチを作ってすぐに移動します
    + ``switch -c`` と同じ動作だが、旧バージョンの Git でも使えます
+ ``--``（ダブルハイフン）は「ブランチ名との区切り」を意味します
    + これがないと Git は ファイル をブランチ名と誤認する可能性があります
    + このコマンドは「最新版のファイルを取得して、ローカル変更を破棄」します
    + ファイルを復元する目的なら ``git restore ファイル名`` が推奨されます（Git 2.23～）


:::note warn
Git 2.23 以降では、ブランチ操作は git switch、ファイル復元は git restore を使うように推奨されています。
:::


## git merge
別のブランチで行った変更を、現在のブランチに統合（マージ）します。
```bash:例
（　指定したブランチを現在のブランチにマージする　）
git merge ブランチ名

（　必ずマージコミットを作成する（履歴を明示的に残したいとき）　）
git merge --no-ff ブランチ名
```
+ ``--no-ff`` は、「Fast-forward」にならず、マージコミットを必ず作る（履歴を明示）
:::note info
マージは「複数人・複数ブランチ」での開発に欠かせない重要な操作です。
複雑な開発では「Pull Request（PR）」を通じてマージすることが一般的です（GitHub など）。
:::

<table>
  <caption>マージ時に起こり得ること</caption>
  <thead>
    <tr>
      <th> 状況 </th>　<th> 結果 </th>
    </tr>
  </thead>
  <tr>
    <td> 変更点が重複しない </td>
    <td> 自動でマージされる（fast-forward or 通常マージ） </td>
  </tr>
  <tr>
    <td> 同じ箇所を両方のブランチが変更している </td>
    <td> コンフリクト（衝突）が発生し、手動で解決が必要 </td>
  </tr>
</table>

:::note alert
コンフリクト発生時は、対象ファイルを編集 → 解決 → git add → git commit を行ってください。
:::


## git restore
作業ツリーの変更を取り消して、以前の状態に戻すコマンドです（Git 2.23 以降で追加）。
```bash:例
（　ファイルの変更を元に戻す　）
git restore ファイル名

（　すべてのファイルを元に戻す　）
git restore .

（　ステージングした変更（git add）を取り消す　）
git restore --staged 
```
+ ``.``（ドット）は、カレントディレクトリ以下すべてを対象にする
+ ``--staged`` は、ステージングから外し、作業ツリーには変更を残す

:::note warn
git restore を使うと、変更は完全に失われます。
重要な変更を失わないよう、実行前に git diff などで確認するのが安心です。
:::


## git reset
コミットやステージング（git add）を取り消すためのコマンドです。
```bash:例
（　最後のコミットを取り消したい（変更は残したい）　）
git reset --soft HEAD^

( ステージングだけを取り消したい（デフォルト動作） )
git reset --mixed HEAD

( すべての変更を完全に取り消す（注意！） )
git reset --hard HEAD
```
+ ``HEAD^`` は「直前のコミット」を指します
+ ``--soft HEAD^`` は、コミットは取り消されるが、変更内容はステージされたまま残ります
    + 修正して再コミットする場合などに便利
+ ``--mixed HEAD`` は、git add でステージした変更を「作業ツリーの状態に戻す」
    + ファイル自体は元に戻らず、編集状態はそのまま
+ ``--hard HEAD`` は、コミットもステージも作業ツリーの変更もすべて破棄され、最後のコミットの状態に戻ります
    + 取り消し不可なので慎重に！（変更が完全に消えます）

<table>
  <caption>HEAD の書き方いろいろ</caption>
  <thead>
    <tr>
      <th> 書き方 </th>　<th> 意味 </th>
    </tr>
  </thead>
  <tr>
    <td> HEAD </td>
    <td> 現在の最新コミット </td>
  </tr>
  <tr>
    <td> HEAD^ </td>
    <td> 1つ前のコミット </td>
  </tr>
  <tr>
    <td> HEAD^^ </td>
    <td> 2つ前のコミット </td>
  </tr>
  <tr>
    <td> HEAD~3 </td>
    <td> 3つ前のコミット </td>
  </tr>
</table>