このページでは実務でGitを使用する際のおおまかな流れについて解説しております。
私自身もこの記事を何度も見返して、読み返して、手順に詰まった時は都度読んでいます。
特に、これからプログラマーになる方やプログラマーを目指している、という方にはしっかりと読んでもらいたい記事の1つです。
0.Gitのインストールと初期設定
この部分は最初の1回だけ行うため、この記事では割愛しております。
すでにGitはパソコンにインストールされており、GitHubのアカウントも所有している状態として話を進めていきます。
GitとGitHubの紐付けるにはユーザー名とメールアドレスが必要です。以下のコードをコピペしつつ紐付けしてください。
git config --global [user.name](http://user.name/) "ユーザー名"
git config --global user.email "メールアドレス"
// ユーザー名とアドレスが設定できたか確認
git config --global --list
1.リポジトリ作成
Gitのインストールが完了したら、Gitを作成します。
しかし、実務ではリモートリポジトリからリポジトリをダウンロードすることがほとんどかと思いますので、git initを行うことはほぼ皆無と考えて構いません。
// 自分で作成する場合
git init
// 外部のリポジトリをローカルにダウンロードする場合(sshを使用した接続)
git clone [git@github.com](mailto:git@github.com):ユーザ名/リポジトリ名.git
// httpsを使用した接続方法もあります
git clone [https://User-name@github.com/ユーザ名/リポジトリ名](https://User-name@github.com/%E3%83%A6%E3%83%BC%E3%82%B6%E5%90%8D/%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E5%90%8D)
1−1.リモートリポジトリの作成
このセクションはローカルリポジトリをgit initした場合にのみ行う作業です。
ローカルリポジトリでGitを作成した場合はGitHub上にもリポジトリを作成する必要があります。
作成するリポジトリ名とフォルダ名を統一しておくことで、後々わかりやすくなるので、必ず同じ名前にすることを心がけましょう。
リポジトリを作成する際、「Ripository name」は必須なので入力しますが、「Description」は任意なので空白でも大丈夫です。
PublicとPrivateについては基本的にはPrivateがおすすめですが、多くの人にレビューしてもらいたい場合などはPublicにしてもよいでしょう。
1-2.リポジトリを最新にする
すでにクローンしてある状態の場合は、ローカルのリポジトリが最新かどうかを確認します。
つまり、実務ではほとんどここから開始と言っても過言ではありません。
git log
リポジトリが最新かどうかを確認するには、「github」 → 「プロジェクトをクリック」 →「commitをクリック」 したあとの一番上に出てくる7桁の英数字とlogで見たときの英数字が同じであれば最新です。
作業を行う前に、ローカルリポジトリが最新でない場合はプル(pull)を行います。
万が一pullをし忘れてしまった場合で、すでに自分がローカルリポジトリを触ってしまった場合はフェッチ(fetch)を行いましょう。
自分のローカルリポジトリがリモートリポジトリと比べて最新でない場合、自分が編集中のモノが更新されていた場合はエラーを出してしまいます。
そのため、よく確認しないままpullしてしまうと、すでにローカルリポジトリで修正を行った場合にコンフリクトが発生するリスクがあります。
2.ブランチの作成
ローカルリポジトリとリモートリポジトリを同じ状態にできたら、branchを必ず作成しましょう。
ソフトウェア開発では同時進行で複数の開発が行われており、一つのファイルを更新し続けることは現実的ではありません。
そのため、ブランチを利用して変更する部分だけ切り取って修正し、その後メインにくっつける作業を行っていきます。
[attention]コードを触るときは必ずブランチをしてから行うようにしてください。
master/mainで触ると万が一に備えることができないので、必ずブランチを作成してください。
ブランチの作成は以下のいずれかの方法で作成が可能です。
git branch feature/test
git switch -c user/about/2019/01/01
// -cオプションをつけることで、ブランチを作成すると同時にブランチに移動することが可能です。
git branchはあくまでもブランチを作成するだけのコマンドになるため、新たにブランチを切る(作成する)場合はgit switchを使った方がミスが発生しません。
また、ブランチの移動はgit checkoutと書かれていることも多いですが、現在はgit switchを使用しますので、覚えておいてください。
現在、自分がどこのブランチにいるのかが分からなくなったときは以下のコマンドで確認可能です。
git branch
3.作業
編集等作業を行います。
編集作業中に、どのファイルを変更したのかが分からなくなってしまった場合、以下のコマンドでどのファイルを操作したのかが分かります。
git status
git statusに表示されている内容の見方は以下の通りです。
- modified:修正したファイル
- deleted:削除したファイル
- Untracked files:新規作成したファイル
さらに変更したファイルのソースコードを確認したい場合はgit diffを使用しましょう。
git diff
3-1.バージョン管理しないファイル
webサイトを作成する場合に、バージョン管理をする必要のないファイルも出てきます。
そのようなファイルはセキュリティの面からも、データの面からもバージョン管理から外す(gitで管理しない)ことも大切です。
管理しないファイルを指定するには「.gitignore」を使用します。
4.コミット
コミットはGitにおけるセーブポイントのようなもので、必ず行うべき作業です。
コミットする場合は、一度ステージングエリアにコミットしたいファイルを上げてからコミットします。
4-1.add
addはコミットする前の下準備という段階で、変更したファイルをステージングエリアに移動させます(本当に移動させるわけではなく、編集上での移動です)。
ファイルなどを変更したらgitのステージングエリアに登録しましょう。
git add 変更したファイルなど
// カレントディレクトリのすべての.pyファイルをadd
git add *.py
4-2.git addのオプション
git add -u (git add --update)
トラッキングされている(すでにGitで管理されている)ファイルの変更や削除のみをステージングします。
新規追加されたファイルは含みません。
git add -A (git add --all)
カレントディレクトリ以下のすべての変更をステージングします。
新規ファイル、変更されたファイル、削除されたファイルもすべて含まれます。
git add .
カレントディレクトリ内の新規および変更されたファイルをステージングしますが、削除されたファイルは含みません。
以下では違いについての表を作成しました。
| コマンド | 説明 | 新規ファイル | 変更されたファイル | 削除されたファイル |
|---|---|---|---|---|
git add <ファイル名> |
特定のファイルのみをステージング | ✖️ | ✔️ | ✖️ |
git add *.py |
カレントディレクトリ内のすべての.pyファイルをステージング |
✔️ | ✔️ | ✖️ |
git add . |
カレントディレクトリ内の新規および変更されたファイルをステージング | ✔️ | ✔️ | ✖️ |
git add -A |
カレントディレクトリ以下のすべての変更をステージング(新規、変更、削除を含む) | ✔️ | ✔️ | ✔️ |
git add -u |
トラッキングされているファイルの変更や削除のみをステージング(新規ファイルは含まない) | ✖️ | ✔️ | ✔️ |
git add .とgit add -Aは実務でも非常によく使われます。
4-3.addを間違えた場合
万が一、ステージングしたファイルが間違っていた場合、つまりaddを取り消す場合は以下のコマンドを入力します。
git rm -r --cached
4-4.commitする
ステージングエリアにどのような変更を行ったのか記録しましょう。
git commit -m "変更した内容"
// commit -mでコミットしたい内容にコメントを入力できます。
// commit -aを入力すると、ステージングとコミットを一度にできます。
コミットしたメッセージの修正を行う場合
git commit --amend -m "新しいメッセージ"
メッセージが修正できているか確認する
git log --pretty=oneline --abbrev-commit
4-5.commitを取り消す
commitを取り消す場合は以下のコマンドを入力
git reset --soft HEAD~
commitが削除できたか確認する
git diff HEAD~ --name-only
5.pullする
コミットができたら、pushの前にリポジトリがリモート環境とローカル環境が同じかpullしておきます。
このpullはfetchとmergeを同時に行っており、pushの前にpullしておくことで、最新の状態をローカルに保つことができます。
git pull origin main/master
5-1.ローカルとリモートを紐づけ
※新規で作成した場合のみ
ローカルリポジトリで行った変更をGitHub上のリモートリポジトリに反映する作業を行うために、まずはローカルリポジトリとリモートリポジトリの紐づけを行います。
git remote add origin [https://github.com/[ユーザー名]/[リポジトリ名]](https://github.com/%5B%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E5%90%8D%5D/%5B%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E5%90%8D%5D)
// SSHを用いてgitと通信するためには以下を使用する
git remote set-url origin [git@github.com](mailto:git@github.com):xxxxxxx/[Ripository name].git
このgit remote add originを行わないと、pullやpushを行うことができないので、必ず行いましょう。
6.pushする
紐づけが完了したらリモートリポジトリへ変更したファイルなどを登録して反映させます。
git push origin ブランチ名
// -uをつけることで、リモート名やブランチ名の指定する必要がなくなる
git push -u origin main
以上で初めてGitからGitHubへの登録作業が完了です。
6-1.pushができなかった時
pushをした際に何らか m のエラーをgitが吐くときがあるので解決策についても提示しておきます。
pushした際に発生するエラーは以下の通りです。
failed to push some refs to ・・・
Gitでローカルリポジトリの変更をリモートリポジトリにプッシュしようとしたときに、リモートリポジトリにローカルリポジトリに無いコミットがあるため、発生することがあります。
解決策としては以下の2つの方法があります。
1.強制上書き
ローカルリポジトリのブランチをリモートリポジトリのブランチに強制的に上書きする
git push -f origin ブランチ名
ただし、この方法はリモートリポジトリの履歴を失う可能性があるので、チーム開発の際には使用できません。
2.再度プッシュ
リモートリポジトリの変更をローカルリポジトリに取り込んでから、再度プッシュする
git pull origin ブランチ名
こちらはローカルでの作業のため、リモートリポジトリに影響は及ぼしません。
ただし、ローカルリポジトリでコンフリクトが発生する可能性が高いので、非常に注意してください。
ここからはGitHubで行う操作です
7.プルリクエストを作成
pushがうまくできていれば、github上に自分のブランチ名とcommitの情報が反映されています。
この時点ではメインブランチとは別の状態なので、自分のcommitをチェックしてもらいましょう。
GitHubのPull Requestのタブから、プルリクを作成します。
まだ修正途中でレビューはしてほしくない、でも開発の進捗をチーム内でも見られるようにしたい場合はdoraftを立ててプルリクを作成しましょう。
プルリクエストは以下の手順で作成します。
- まずはプロジェクトをクリック
- 画面真ん中にあるbranchesをクリック
- 緑色ボタン「compare & pull request」または白色ボタン「new pull request」をクリック
- 緑色ボタン「create pull request 」をクリック
- 緑色ボタン「Merge pull request」をクリック
- 緑色ボタン「compare merge」をクリック
7-1.プルリクエストが表示されない
プッシュしてプルリクエストしたにも関わらず、以下のようなエラーが表示されることがあります。
There isn't anything to compare
これは、GitHubでプルリクエストを作成しようとしたときに、ブランチのコミット履歴が異なるために発生します。
このエラーはリモートリポジトリを作成する際に、.gitignoreファイルやREADME.mdファイルなどを自動生成すると、リモートリポジトリにもgitが作成されてしまい、発生するエラーのようです。
そのため、解決の手順としては以下のようになります。
- git init
- git clone
- git add
- git commit
- git push
そのほかにも、ローカルリポジトリのブランチ名を変更してリモートリポジトリのブランチと同じにする方法やローカルリポジトリのブランチを強制的にリモートリポジトリのブランチに上書きする方法もあります。
8.追加修正
追加で修正が必要な場合は修正 レビューしてもらって修正が必要であれば、再びローカルで修正を行い、commit→pushを行います。
9.マージする
mergeはプロジェクトの管理者が行うことが多いですが、プルリクエストの後、修正ががなくなったらメインブランチに自身が作成したブランチが取り込まれて、ここまででGitの一連の流れが完了です。
10.ブランチを削除
メインブランチに取り込まれた時点でリモートのブランチは削除されますが、ローカルのブランチは残っているので、削除しておきましょう。
git branch -d ブランチ名
この時、自分がいるブランチは削除することができません。
そのため、ブランチを削除する場合は一度mainブランチに戻ってからの削除がおすすめです(メインブランチは削除しないため)