公式ドキュメントで学ぶ Git/GitHubの違い(cloneからcommit・push・PullRequestまで)
本記事の目的
「Git ってなんとなく難しそう…」と感じている方へ
リポジトリとは何か、最低限の操作フローはどうなっているか――
その “イメージ” をつかむことをゴールにした入門記事です。
想定する読者
区分 | 対応 | 補足 |
---|---|---|
個人開発の初心者 | ✅ | clone → add → commit → push を体験したい方 |
チーム開発に入門したメンバー | ✅ | Pull Request 前後の流れを知りたい方 |
運用担当(既に大規模リポジトリを管理中) | ❌ | 本記事では深い運用ノウハウは扱いません |
Git をカスタマイズしたい個人開発者 | ✅ |
.gitignore や .gitattributes の基礎も触れます |
Git リポジトリとは?
Git リポジトリは 「プロジェクト一式 + その変更履歴」をまとめて保管する場所 です。
履歴には いつ・誰が・どのように 変更したかが記録されるため、過去の状態へ自由に戻ったり、比較したりできます。
イメージ
プロジェクトフォルダーまるごとが “履歴の見えるフォルダー” になる。
中のファイルを編集すると、その変更がすべて履歴に記録される。
リポジトリの種類
種類 | 保存場所 | 主な用途 |
---|---|---|
ローカルリポジトリ | 自分の PC 内 | 個人の作業・履歴管理 |
リモートリポジトリ | ネット上(GitHub など) | 共有・バックアップ |
代表的なリモートサービス:GitHub / GitLab / Bitbucket
リモートリポジトリの操作イメージ
GitHub などのリモートリポジトリは、
OneDrive・Google ドライブ・iCloud といったクラウドストレージを
“手動で同期 する” ような感覚に近いです。
観点 | クラウドストレージ (OneDrive 等) | GitHub (リモートリポジトリ) |
---|---|---|
同期方法 | ほぼ自動・常に最新版 |
手動 push / pull (CLI / GUI どちらでも可) |
履歴管理 | 最新版が基本 | 全てのコミット履歴 を保持 |
コラボ機能 | 共有・同時編集 | ブランチ / レビュー / CI など開発特化 |
Git 独自の機能
- 変更履歴の完全保存
- ブランチ による並行開発
- Pull Request / Code Review
-
CI/CD(GitHub Actions など)
単なるファイル共有と違い、「開発を安全かつ効率的に進める仕組み」 がそろっています。
以下にGit, GitHubイメージを示します。
Gitのインストールと設定
- ダウンロードリンク
- インストール方法のリンク
-
ユーザー情報の登録(初回のみ)
下記コマンドを実行すると、PC 内のすべてのリポジトリで同じ名前とメールアドレスがコミット署名に使われます(--global オプション)。
GitHub にプッシュする場合は “誰が変更したか” を正しく紐付けるため、GitHub アカウントと同じ user.name / user.email を設定してください。
git config --global user.name "あなたの名前"
git config --global user.email "あなたのメールアドレス"
設定しないと VSCode でどのようなエラーが出る?
設定せずにコミットを行うと「Gitの"user.name"と"user.email"の構成を確認してください」と表示されます。
GitHub へプッシュできない場合
-
原因:
GitHub アカウントの 「Keep my email addresses private(メールアドレス非公開)」 が有効で、自動生成の noreply メールアドレス と user.email が一致していない。 -
対処:
- GitHub の Settings › Emails で表示される xxxx@users.noreply.github.com を設定する。
また、コミット済みの場合は修正する必要があります。
Gitコマンド - email設定git config --global user.email "xxxx@users.noreply.github.com"
- もしくはオプションをオフにして、公開メールアドレスと同じものを user.email に設定する。
- GitHub の Settings › Emails で表示される xxxx@users.noreply.github.com を設定する。
Git操作
操作方法はローカル操作
、クラウド操作
に分けて説明します。
-
ローカル操作
とは自分のPCのローカルリポジトリ
に影響します。 -
クラウド操作
とはGitHubなどのリモートリポジトリ
クラウド上のデータに影響します。
また、Gitを使うにあたって、基本はVSCodeで行います。
なぜ VSCode で Git を扱うのか?
VSCodeは直感的で迷わないGitのGUIを提供しています。また、豊富な拡張機能が提供されているので個人に合わせた使い方ができます。
GUI では扱いにくい複雑な操作も(該当プロジェクトのパスで)ターミナルをすぐに開くことができます。
Git では差分が取れない文字コードでもVSCode
なら変更点を確認できる場合があります。(そのような文字コードはできるだけ使うのをやめた方がいいです。)
また、IDEにもGitをGUIで扱うこともできますが、個人的には自分の使い慣れたクライアントソフトを使うことがおすすめです。
例:
Windows 開発
コード編集Visual Studio 2022
+ Git操作VSCode
Mac 開発
コード編集Xcode
+ Git操作VSCode
VSCodeのインストール
インストール方法のリンク
"VS Code で Git ソース管理を使用する" 公式リンク
VSCode以外のGitGUIアプリケーション
- Git GUI
Gitインストール時に同梱されています。
2. Sourcetree
- GitKraken
Git リポジトリの作成、または取得
Gitを使い始めるにはinit
または、clone
する必要があります。
init(リポジトリの作成 - ローカル操作)
init
とはローカルのファイル(ディレクトリ[LinuxやMacでよく使われる用語でファイルと同じ意味])の中で行う操作です。
この操作を行うとGitリポジトリの作成が行われ、必要な設定やファイルが追加されます。
以下のコマンド使用するとコマンド実行時のパスの中にリポジトリが作成されます。
git init
以下にVSCodeの操作イメージを示します。
clone(リポジトリの取得 - ローカル操作)
リモートリポジトリを自分のPCにローカルリポジトリとしてダウンロードします
git clone <URL>
GitHubからURL取得の画像を示します。
以下にVSCodeの操作イメージを示します。
add(ステージに追加 – ローカル操作)
git add
は 変更したファイルを “ステージ(staged)” 状態に置く コマンドです。
ステージに乗ったファイルだけが、次の git commit
で履歴に保存されます。
コマンド例
# 単一ファイルをステージ
git add src/main.cpp
# 変更されたファイルをまとめてステージ
git add .
# add した場合の取り消し
git restore --staged <file>
以下にVSCodeの操作イメージを示します。
commit(コミット – ローカル操作)
git commit
は ステージされた変更(staged)を 1 つのスナップショットとして履歴に保存するコマンドです。
変更のないファイルは前回コミットの内容を参照するため、差分のみが効率的に記録されます。
スナップショットとは?
その時点で 変更されたファイルの内容 を丸ごと保存すること。
Git はスナップショット同士の差分を内部で計算し、最小コストで履歴を保持します。
基本構文
git commit -m "メッセージ" # インラインでメッセージを付ける
以下にVSCodeの操作イメージを示します。
コミット履歴の閲覧
以下にVSCodeの操作イメージを示します。
Git Graph拡張機能をインストールして表示しています。
branch(ブランチ - ローカル操作)
ブランチは「特定コミットを指し続ける可動ポインタ」
(ファイルのショートカットのようなイメージ)
- まず
main
ブランチで作業中のコミット C があるとします。 -
C の位置で
git branch develop
を実行すると、
develop
ポインタが C を指して誕生します。 - その後
main
が D → E と先へ進んでも、
develop
は引き続き C から枝分かれして独自に進みます。
ブランチはいつ作成する?
ブランチを切るタイミングは 「新しい開発・修正に取り掛かる前」 が原則です。
チーム開発では develop ブランチの履歴が絶えず更新されます。
そこで、作業開始前に develop の最新コミットを基点とした作業ブランチ
(例:feature/login-ui
や fix/err
)を作成しておけば、
- 自分の変更が他人に影響しない
- 他人の変更に作業が阻害されない
という2つのメリットを得られます。
(main) A──B──C──D──E ← main
\
F──G ← develop
merge(マージコミット)
git merge
は 指定したブランチの履歴を、現在のブランチへ統合するコマンドです。
処理の結果、2 つの履歴が 1 本にまとまり、マージコミット が 1 つ生成されます。
このマージコミットにより、分岐していた 2 つの履歴が 1 本にまとめられます。
マージはいつ行う?
開発・修正用ブランチ(例: feature/login-ui
や fix/err
)での作業が完了し、
テストやコードレビュー(プルリクエスト)も通過したら、派生元の develop
ブランチへマージ します。
マージが済んだ作業ブランチは、通常 削除 して役目を終えます。
もし同じブランチで追加作業を続ける場合は、いったん develop
を取り込んで(git merge develop
または git rebase develop
)
最新状態に追従してから作業を再開しましょう。
または、プルリクエスト を出す 直前 に、派生元である develop ブランチを自分の作業ブランチへ取り込み(merge または rebase)、
最新状態でビルド・テストを通してから PR を作成するという手順も有効です。
このようにすることで、レビュー後に想定外のコンフリクトや CI(Continuous Integration) エラーが発生しにくくなります。
main: A──B──C──D ← main
\
develop: E──F ← develop
main: A──B──C──D──────G ← main (G がマージコミット)
\ /
E──F
基本構文
# 例: feature ブランチを現在の main に取り込む
git merge feature
tagをつける(タグ - ローカル操作)
タグは “特定のコミットに名札を付ける” 機能。
リリースやマイルストーンなど ここが大事 をひと目で分かるように残せます。
種類 | 特徴 | コマンド例 |
---|---|---|
軽量タグ (light-weight) | ポインタでメッセージや署名なし | git tag v1.0 |
注釈付きタグ (annotated) | 作成者・日時・メッセージ・署名を保存。リリース用はコレ | git tag -a v1.0 -m "初回リリース" |
# 過去のコミットに軽量タグ
git tag bugfix-2025 3a5c9e2
# 最新コミットに注釈付きタグ
git tag -a v1.0 -m "初回リリース"
push(プッシュ – クラウド操作)
push
は ローカルで commit
した履歴をリモートリポジトリへ送信するコマンドです。
これにより、チームメンバーが git pull
であなたの変更を取り込めるようになります。
git push origin main # main ブランチを送信
git push -u origin feature-x # 初回だけ -u で upstream を登録
以下にVSCodeの操作イメージを示します。
fetch
fetch
は「リモートリポジトリの最新履歴を取得し、リモート追跡ブランチだけを更新する」コマンドです。
作業ツリー(ワークツリー)と現在のブランチは一切書き換えないため、ローカルコードはそのまま。あとで内容を確認し、必要なら自分で merge や rebase を実行します。
git fetch [remote]
pull(プル – クラウド操作)
pull
は リモートリポジトリの最新コミットを取得してローカルブランチへ統合するコマンドです。
内部的には fetch
(履歴取得)+merge
(作業ツリーへ反映)の 2 ステップを一度に実行します。
git pull origin main # origin/main を取り込み
以下にVSCodeの操作イメージを示します。
pull request(プルリクエスト – クラウド操作)
Pull Request(PR) は「リモートリポジトリ上で行う、変更内容のレビュー申請」です。
ブランチで実装したコミットをメインブランチへ統合してもらう前に、差分を提示し、レビュー・テスト・議論を行うためのワークフローを提供します。
pull requestの語源とは - pullとは逆?
「プルリクエスト」という名前は、もともとの Git の分散型ワークフローに由来しています。
※【】はfork後を想定しています。
- 変更を作った人(あなた)は、自分のローカル → clone元【または、自分の公開リポジトリ】 へpush して作業を終えます。
- その時点では、clone元のリポジトリのmainブランチ【または、メイン開発者のリポジトリ】には何も届いていません。
- そこで「あなたのリポジトリから pull(取り込んで)ください」という “お願い” を送る――これが pull request です。
つまり 「プッシュした変更を取り込んでほしい」という依頼=Pull してくださいリクエスト。
GitHub では中央のリポジトリ(origin)に対してボタン 1 つで送る形になったため「自分→中央に push したあと pull request を出す」という順序がやや逆転して見えますが、語源は “相手に pull を頼む” という発想のまま残っています。
以下にforkなしのイメージを示します。
以下にfork後のイメージを示します。
fork(フォーク - クラウド操作)
fork(フォーク) とは、GitHub上の公開リポジトリを
自分のGitHubアカウントに“複製” して独立した開発スペースを作る機能です。
オリジナル(upstream)には書き込み権限がなくても、fork なら自由に push・PR が行えます。
fork後(自分のGitHubアカウントから)cloneして作業を行います。
fork のメリット
目的 | fork を使う理由 |
---|---|
OSS への貢献 | 本家に直接 push せず、自分の fork で安全に開発→Pull Request |
実験的な改造 | 元コードを崩しても upstream に影響なし |
学習用コピー | 公開リポジトリを fork してローカルで好きに試せる |
基本フロー(GitHub)
- GitHub で対象リポジトリを開き、右上の Fork ボタンをクリック
- 自分のアカウント(yourname/sample-app)に fork が作成される
-
git clone https://github.com/yourname/sample-app.git
でローカルに取得 - ブランチを切って開発 → 自分の fork に push
- GitHub 上で Pull Request を作成し、
base(fork元): upstream/main
←compare: yourname/feature-xyz
を指定 - レビューが通れば upstream にマージされる
fork と clone の違い
比較項目 | fork | clone |
---|---|---|
何が作られる? | GitHub 上の新リポジトリ | ローカル PC 上のコピー |
権限 | 自分の fork なので 書き込み可 | ローカルは常に書き込み可 |
目的 | OSS への貢献・安全な開発スペース | 開発作業を手元で行う |
典型操作 | Web で Fork → git clone → PR |
git clone → ブランチ開発 |
💡 ポイント
- fork はあくまで “GitHub 上での複製” であり、Git の概念(コミット・ブランチ)はそのまま持ち越されます。
- 自分の fork を最新に保つには
git remote add upstream …
で元リポジトリを登録し、git pull upstream main
(git fetch upstream
→git merge
orrebase)
を行います。
Git カスタマイズ
追跡除外(ignore の設定)
Git で「履歴に入れたくないファイル」は .gitignore
で指定します。
ビルド成果物・ログ・一時ファイル・OS が自動生成するメタデータなどを除外しておくと、リポジトリがクリーンに保てます。
.gitignore
の 3 つの置き場所
優先度 | ファイル | 適用範囲 | 用途例 |
---|---|---|---|
1 | .git/info/exclude |
そのリポジトリだけ(ローカル限定・Git 管理外) | 個人の IDE 設定、デバッグ用メモ |
2 | プロジェクト直下の .gitignore |
リポジトリ全体(共有) | ビルド成果物、環境依存ファイル |
3 |
グローバル ignore~/.config/git/ignore など |
自分の PC 全リポジトリ共通 | OS が生成する .DS_Store や Thumbs.db
|
.gitignore
は 上から下へ、より近い階層が優先。
ローカル専用の除外は.git/info/exclude
に書くと共有されないので便利です。
よく使うパターン例
# ビルド成果物
/dist/
/build/
# OS / エディタ
.DS_Store
Thumbs.db
*.swp
# Node.js
node_modules/
.env
# Python
__pycache__/
*.py[cod]
バイナリを “テキスト化” して差分を取る方法
.TXT
をバイナリ判定してしまう問題と対処法
Git が MS-DOS の TL;DR
MS-DOS 由来の.TXT
には0x1A
(Ctrl-Z) やNUL
文字が入りやすく、
Git はそれを見て「バイナリ」と誤判定する。
.gitattributes
にtext diff
を付けるか、
textconv
フィルタで制御コードを除去すれば、行差分を正しく表示できる。
なぜ Git はテキストをバイナリと誤判定するのか?
Git の自動判定ロジックは 「ファイルに NUL 文字があるか」 で決めています。
古い MS-DOS のテキストは
- 行末が CR+LF
- 末尾に 0x1A (Ctrl-Z) が混入
- まれに
NUL (0x00)
も入る
このような制御のため Git は Binary files differ と判断してしまう。
.gitattributes
に「これはテキスト」と明示する
解決策 # すべての .TXT を強制的にテキスト扱い
*.TXT text diff
Git で diff が表示できない文字コード とその対策
Git は ASCII 互換(UTF-8 / ISO-8859-1 など)のテキスト を想定しているため、
UTF-16 や Shift-JIS のファイルは標準設定では「バイナリ扱い」になります。
git diff
や GitHub/GitLab の Web UI で内容が見えず
Binary files differ
とだけ表示されるのはこのためです。
なぜ UTF-16 が「バイナリ」判定されるのか?
- Git は NUL 文字 (0x00) を含むファイルをバイナリと見なす
- UTF-16 は 2 バイト単位で文字を表すため、偶数バイト側に 0x00 が頻出
- 結果として diff / blame / grep などテキスト系サブコマンドがスキップされる
解決策 3 パターン
方法 | 使いどころ | メリット | 注意点 |
---|---|---|---|
① working-tree-encoding 属性 |
チーム全員が 最新版 Git を使用 (推奨) | add 時に UTF-16 → UTF-8 へ再エンコード → 以降は普通のテキスト扱い | JGit・libgit2・古い Git は未対応 |
② --text / -a オプション |
その場で一回だけ見たい | 追加設定ゼロで即表示 | 毎回オプションが必要 文字化けの可能性 |
③ textconv フィルター |
混在環境・大規模リポジトリ | diff 時だけ UTF-16 → UTF-8 に変換 |
.gitattributes と gitconfig の両方設定 |
UTF-16 ↔ UTF-8 の往復変換は“理論上ロスレス”──でも絶対保証ではない
Unicode なので文字そのものは失われませんが、BOM(Byte Order Mark)・改行コード・正規化形式など
“付随情報” がずれると Git や iconv
が化けたと判定してしまうケースがあります。
- UTF-16 LE (BOM なし) → UTF-8 → UTF-16 LE (今度は BOM 付き)…など微妙な差
- Windows CRLF ↔ Unix LF が混在し、diff が毎回真っ赤
- macOS の NFD と Linux/Windows の NFC の正規化差
現実的な対策:テキスト比較は VS Code など高機能エディタで行う
理由 | 具体的メリット |
---|---|
エンコーディング自動判定が高精度 | BOM の有無・UTF-16LE/BE を自動検知し、文字化けを最小化 |
エンコーディング強制切替が GUI で容易 | ステータスバーやコマンドパレットから即変更&再読み込み |
改行コード/BOM の可視化プラグインが豊富 | 「ここだけ CRLF」「ここに BOM」が目で分かる |
差分ビューが柔軟 | サイドバイサイド/インライン切替、ホワイトスペース無視などオプション豊富 |
Git 拡張と統合 | ファイル単位で Revert /Stage が出来るため誤コミットを防止 |
💡 実務 tip
- まず VS Code(または IntelliJ, Sublime など)の 差分ビューで
「本当に往復で同一か」「BOM や改行が変わっていないか」を確認。- 問題なければ
git add
。不一致なら VS Code 上で改行/BOM を修正して再チェック。- 可能なら CI で
iconv
round-trip テストを回し、“化けコミット” をブロック。
まとめ
- UTF-16 ↔ UTF-8 自体は文字損失なし → 理論上 ロスレス
- しかし BOM/改行/正規化差で「同一に見えて違う」状態が起こりうる
- Git だけに頼らず VS Code など GUI で差分を確認するのが安全
- 最終防衛線として CI で round-trip 検査 を置くと安心
Gitログの表示
よくわからなくなったらエラーログをコピーしてchatGPTなどに聞いてみましょう。
git log --oneline --graph --decorate
Gitの使用用途
VS Code(Microsoft)
VS Code は Microsoft が開発・公開している大規模なオープンソースソフトウェアです。世界中の開発者が毎日数百件の Pull Request を送り、Fork → PR → CI → Merge という GitHub のワークフローをフル活用しながら機能追加やバグ修正を行っています。
ホワイトハウス
アメリカ連邦政府は公式文書や Web サイトのソースコードを GitHub 上で公開しています。コミット履歴をそのまま公開することで透明性を高め、市民が Issue 経由でフィードバックを送れる仕組みも整えています。このように行政分野でも「ガバメント as Code」として Git が活用されています。
Zenn(技術ブログ)
技術系ブログサービス Zenn の CLI を利用すると、記事や本の Markdown 原稿をローカルで編集し、そのまま GitHub でバージョン管理できます。誤字修正や加筆をコミット単位で追跡できるため、原稿の変更履歴が一目で分かります。ブログ執筆のような個人ユースでも Git は十分に役立つことが分かる事例です。
Discussion