🐱

Git & Github 基本的な作業の流れと意味

に公開

自分用の備忘録。

毎回忘れて ChatGPT に聞いており、ゼロベースでやっていて積み重ねが無いなと危機感を覚え、一度現状の自分が知っている知識やノウハウをまとめてみることにした。

基本用語

リポジトリとは

以下 2 つを満たすものをリポジトリという

  1. ファイルの保管庫である
  2. 変更履歴含めて保存・管理されている

1 だけだとディレクトリも当てはまるが、2 も含めることでリポジトリのみ当てはまるようになる
→ ディレクトリ上でgit initすると、そのディレクトリに.gitが生成し、リポジトリ化する

ローカルリポジトリとリモートリポジトリ

  • ローカル PC 上に作られたリポジトリをローカルリポジトリという

  • ローカル PC 上でない、別のサーバーや PC 上に集約されたリポジトリをリモートリポジトリという

    • リモートリポジトリの例: Github、Dockerhub、npm、apt

ローカルリポジトリとリモートリポジトリは独立して存在し、それぞれが変更履歴を持っている。そのため、両者を同期させる操作が必要になる

ローカルリポジトリだけでなく、リモートリポジトリも使うことで、

  • ファイルのバックアップができる(パソコンが壊れたときに役立つ)
  • 1 つのディレクトリを複数人が編集した際に、後で整合性を緻密にチェックしながら 1 つにまとめることができる(リモートリポジトリを使うことでチーム開発がスムーズにできる)

といったメリットがある

コンフリクト(衝突)

コンフリクトには大きく分けて 2 種類ある。

  1. リポジトリ間の履歴の衝突(ローカル vs リモート)
  2. ブランチ間の内容の衝突(マージ時)

1. リポジトリ間の履歴の衝突(ローカル vs リモート)

ローカルリポジトリでファイルを編集後、リモートリポジトリに push しようとする際、

  • 既にリモートリポジトリ上で誰かが編集していた
  • あなたが pull 後、リモートリポジトリに誰かが push をしていた

場合は、リモートとローカルの履歴が衝突する

解決策は以下の 2 つ:

  • git pullしてリモートの変更を取り込む(場合によってはマージコンフリクト発生)
  • あるいはgit pull --rebaseでリモートの上に自分の作業を積み直す

2. ブランチ間の内容の衝突(マージ時)

  • ブランチを main にマージする際、ブランチと main の履歴が衝突する

解決策は以下の 2 つ:

  • そもそもブランチを切って編集するファイルは、ほかのブランチで編集しないようにする
  • 履歴が衝突した箇所は、人の手で 1 つずつどちらを採用するか決めていく。コンフリクトが無くなるとマージできるようになる

主な操作の流れ

ローカルで作業開始した場合と、リモートで作業開始した場合とで 2 パターンある。

A. ローカルで作業開始した場合

すでにローカル PC 上で作業を始めているものをリモートリポジトリにアップしたい場合

1. ローカルに Git を初期化

  • まだローカルリポジトリを作成していない場合は、git initを実行して.git/を作る
  • -b mainというオプションの意味は、最初に作られるブランチの名前をmainにするという意。このオプションをつけないと、Git のバージョンによってはmasterがデフォルトになる場合がある
cd ~/projects/myapp   # 自分の作業ディレクトリに移動
git init -b main
  • ここで.gitignoreを作っておくと便利
  • 以下は Python スクリプトを管理する場合の例
__pycache__/
*.pyc
.venv/
.env
.DS_Store

2. リモートリポジトリを作成する

  • GitHub にログイン → New repository でリポジトリを作成

    • 例: myapp という名前にする
    • Initialize with README のチェックは外しておく(既にローカルにファイルがあるので、README.md ファイル作ってしまうと、コンフリクトしてしまう可能性がある)

3. リモートリポジトリを登録する

git remote add origin https://github.com/ユーザー名/myapp.git

4. ローカルリポジトリ上で、今あるファイルのうち、変更履歴管理に加えたいものだけステージングしてコミットする

  • コミットとは?

    • 何をどう変更したか?の記録のこと
    • コミットしないとローカルリポジトリには何も変更履歴が残らない
  • ステージングとは何か?

    • コミット対象にするファイルを選ぶこと
    • git add .とすることで、.gitignoreに記載したディレクトリ・ファイル以外の全てのディレクトリ・ファイルをステージングできる
    • git add ..で全てのファイルをいっぺんにステージングできるためラクだが、チーム開発のときには避けた方がいい。更新されたファイルが全て一緒くたにされてしまうため、コミットの内容ごとに分けた方が見やすいから)
git add .
git commit -m "First commit: add existing project"
  1. リモートリポジトリにプッシュする
  • ローカルリポジトリでのコミット内容をリモートリポジトリに反映・同期する
git push origin main

B. リモートで作業開始した場合

1. リモートの内容をローカルにクローンする

git clone https://github.com/ユーザー名/myapp.git

これでmyapp/ディレクトリが作られ、その中に.git/が含まれる

2. ブランチを切ってから作業した方が良い

  • そのまま作業を始めてしまうと、コミット&プッシュをした際に main ブランチが更新されてしまう
  • ブランチ名はfeature/(機能名)とするのが慣例
cd myapp
git checkout -b feature/awesome

3. ファイルを編集しきって…コミット

git add .
git commit -m "Add awesome feature"

4. リモートにプッシュ

git push origin feature/awesome

5. Github 上でプルリクエストを出してマージ

  • GitHub のリポジトリページを開くと「Compare & pull request」が表示される
  • PR を作成してレビュー依頼
  • レビュー後に main へマージされる

Discussion