今回、ハッカソンで初めてのアプリ開発を経験しました。その中で理解したgitコマンドについてアウトプットします。GitHubについて、勉強はしたけど実際に使ったことはないといった方が、少しでもスムーズにチーム開発に取り組めることを目標にしています。
IT未経験のため間違っている点がありましたらご指摘いただけますと幸いです。
まず、ゼロからの開発の場合、リモートリポジトリとローカルリポジトリのどちらにも何もない状態からスタートするかと思います。大まかな流れを箇条書きにしてみます。
<リモートリポジトリ>
・リモートリポジトリを作成する(例: GitHub上でmainブランチとdevelopブランチを作成)
<ローカルリポジトリ>
・ローカルリポジトリにクローンする(git clone)
・新しいブランチを作成して切り替える(git switch -c <ブランチ名>)
・作業内容をステージング(git add)し、コミットする(git commit)
・リモートリポジトリにプッシュする(git push)
<リモートリポジトリ>
・developブランチでマージ
<ローカルリポジトリ>
・git pullでローカルを最新化
<リモートリポジトリ>
・最終的にdevelop→mainへマージして完成
<基本的な操作>
1. リモートリポジトリ→ローカルリポジトリに情報を反映させる
git clone <リモートリポジトリのURL>
リモートリポジトリのURLは、SSH接続の設定をしている場合はSSHのURLを、設定をしていなければHTTPSのURLをコピペします。この際、リモートリポジトリの名前がorigin
に設定されるので、以降のコマンドではURLの部分をorigin
に置き換えることができます。
これでリモートリポジトリの情報が全てローカルリポジトリに反映されます。開発スタートです。
注意したいのが、git clone
をすると、ローカルリポジトリではデフォルトでmainブランチにチェックアウトされます。このブランチで作業をしてしまうと、完成形を作りたいmainブランチがグチャグチャになってしまうので、ブランチを切り替える必要があります。
2. 新しくブランチを作成、切り替える
git switch -c <ブランチ名>
ローカルリポジトリに新しくブランチを作成し、そのブランチに切り替えます。実装予定の機能ごとに開発を進めていくことが多いと思いますので、ブランチの名前は<feature/機能名>といった命名にすると把握しやすいと思います。また、一つのブランチで複数のメンバーが作業をするのは避けたほうが良いです。コンフリクトの原因になります。
この時点では、作成したブランチはローカルリポジトリにのみ存在し、リモートリポジトリにはありません。
3. 実装した内容をステージングエリアにあげる
git add .
作業した内容を全て反映させたい場合のコマンドです。
git add <ファイル名>
作業した内容のうち、一部のファイルのみ反映させたい場合はこちらのコマンドになります。
ステージングエリアって?となりますが、commit
をするための準備と理解すると良いと思います。このコマンドがないと、作業内容の一部だけをcommit
したいという時に困りますよね。
4. 作業内容をローカルリポジトリに確定させる
git commit -m "コメント"
3でステージングエリアにあげたものを確定させます。これで、ローカルリポジトリで滞在しているブランチに点として記録されます。以降になにか問題があった時に、このcommitした地点に戻ってくることができたり、いつ何をしたのかを振り返ることができるようになります。
この時点でも、まだローカルリポジトリでの話であり、リモートリポジトリには何も変化はありません。
git commit
は一つの作業が完了した際に行い、その作業内容をコメントに記載します。
5. リモートリポジトリに作業内容を反映させる
git push origin <ブランチ名>
この段階で、ようやくリモートリポジトリに作業内容が反映されます。
6. developブランチにmerge
する
GitHubアカウントで確認すると、先ほどpush
したブランチが反映されていると思います。これをdevelopブランチにmerge
します。
7. リモートのdevelopブランチの内容をローカルに反映させる
git pull origin develop
これでローカルリポジトリのdevelopブランチが最新の状態に保たれます。
最初はgit clone
でしたが、二回目以降はgit pull
で一部の情報を反映させます。(ここでエラーが出る場合は、コンフリクトが発生している可能性が考えられます。)
以降、2~7を繰り返していくことで、だんだんdevelopブランチが完成に近づいていきます。最終的にリモートリポジトリでdevelop→mainにmerge
することで開発完了です。
<備考>
<備考1>ローカルでブランチを切り替えるには?
git switch <ブランチ名>
<備考2>ブランチを確認するには?
git branch
ローカルリポジトリにあるブランチ一覧を表示します。
git branch -r
リモートリポジトリにあるブランチ一覧を表示します。
<備考3>チェックインしているブランチの履歴を確認するには?
git log
チェックインしているブランチの過去のcommit
の履歴を参照できます。「なぜかgit push
できない!?」なんて時に確認します。
<困った時の対応>
<困った時1>間違ってgit add
してしまった!
git restore --staged .
ステージングエリアにあげた変更を取り消します。それまでの作業内容は消されないので、git add
という行為のみを取り消すコマンドになります。
<困った時2>間違ってgit commit
してしまった!
git reset --soft HEAD~
最新のcommit
を取り消し、git add
をした段階に戻ります。
git reset HEAD~
最新のcommit
を取り消し、git add
する前の段階に戻ります。それまでの作業内容は消えません。
git reset --hard HEAD~
最新のcommit
を取り消し、それまでの作業内容も消去します。一つ前のcommit
の段階に戻ります。
<困った時3>間違ってmain/developブランチで作業してしまい、git pull
できない!
git add .
git commit -m "コメント"
git pull origin <ブランチ名>
とりあえずローカルリポジトリでの変更内容をコミットしてしまい、その上でリモートリポジトリのmain/developブランチをmerge
します。
git stash
git pull origin <ブランチ名>
ローカルリポジトリで加えてしまった変更内容をなかったことにして、リモートリポジトリのmain/developブランチをmerge
します。