もくじ
Git Guiクライアント
ユーザが多くて情報が得られやすいのでSourcetreeを選択。
Gitまとめ
チーム開発しぐさ
VS Codeでコーディングしながら、SoucetreeでGitの操作をする。Gitについてコマンドでも良いがGUIで確認しながらの方が間違いにくい、早い。
- originからpullする
$ git pull origin master
→conflictしていたらローカルを修正してマージする。
新人であれば自分のコードより他のメンバーを優先させる形でマージする。 - 開発する
- ステージングにファイルをあげる
$ git add <指定ファイル> - コミットする
$ git commit <指定ファイル> - originからpullする
$ git pull origin master - オリジンにpushする
$ git push origin master
ローカルをリモートと同期させるしぐさがチーム開発では大切。
開発しているブランチにmasterの最新を取り込む
①GitLab上でissueを作成する
#999
Add hoge API
②GitLab上でブランチを作成する
issueの名前に合わせる
594-Add-hoge-API
このブランチで作業する
→ブランチの開発が終わった。
③ローカル作業
作業ブランチにmasterの最新を取り込む
$ git checkout master $ git pull
ブランチを切り替え
$ git checkout 999-Add-hoge-API
masterをマージする
$ git merge master
これで作業ブランチにmasterの状況がmergeされた。
作業中のファイルはそのままです!
ブランチの使い分け
- feature
開発用ブランチ - develop
表示や動作確認 - maser
本番
Gitlab-flowを採用。複数のfeatureブランチで開発して、developにマージリクエストを送る流れ。
git revert
resetではなく、revertを利用する。
- 最新のものに対して消すというコミットを行う
- リモートにやっても良い
厳禁 git reset
- リモートにあげたものには絶対にresetを行ってはいけない。
※ローカルだけにする
- hardは危険。
working directoryも消してしまう。使ってはいけない。
working directoryは選択しないほうが良い
コミットログがあれば戻せるが、hardを行ってしまうと戻せなくなる。怖い怖いなのだ。
ローカルルールで禁止されているコマンド
- git rebase
- git reset
- git cherry-pick
履歴がわかりづらくなるから利用しない。
チーム開発でコンフリクトしたらどうする?
チーム内の権力が重要。自分はどこにいるのか?
- 自分がメンバーかつ新人
他のメンバーやリーダーのコミット内容を優先 - 自分がリーダやレビューする役割
自分が優先
HEADに戻す
$ sudo git reset --hard HEAD
チェリーピック
他のブランチのコミットをマージしたい
$ git cherry-pick <コミットID>
Sourcetreeの場合は右クリックから指定のコミットを取り込む
branch開発
●developブランチ
developブランチの作成 $ git branch develop developブランチに移動 $ git checkout develop ・・・作業する ローカルにコミット $ git add . $ git commit -m "Done!" Githubにpush! $ git push origin develop
●masterブランチ
masterブランチに移動する $ git checkout master developブランチの作業をmasterブランチにマージする $ git merge develop
ローカルのdevelopブランチを削除
$ git branch -d develop
通常はこれでOK
消せない場合は下記で
$ git branch -D develop
※git merge developでのエラー
$ git merge develop Updating 917d991..ab4ca75 error: Your local changes to the following files would be overwritten by merge: schemaspy/diagrams/summary/relationships.real.compact.dot ・・・ schemaspy/tables/users.html Please commit your changes or stash them before you merge.
masterにコミットして
$ git add . $ git commit -m "schemaspy" $ git merge develop
リモートリポジトリmasterブランチにpushする
$ git push origin master
ひやりはっと戻す
ローカルリポジトリをある地点まで戻したい
$ git checkout <ハッシュ値>
ローカルリポジトリをある地点まで戻し、リモートリポジトリも戻す※劇薬
$ git checkout <ハッシュ値> $ git reset --hard <ハッシュ値> $ git push -f origin HEAD^:master
コミットをまとめる
$ git log --graph --oneline * 653a6fc (HEAD -> master, origin/master) SNSログイン修正4 * e2bcc40 SNSログイン修正3 * bd23f32 SNSログイン修正2 * 5e84824 SNSログイン修正1 * 972790b いったんコミット
$ git rebase -i 6787c39 pick 9767b45 自分が既に押しているいいねは赤く表示する #22 r3 -pick 6787c39 自分が既に押しているいいねは赤く表示する #22 -pick 0e94891 自分が既に押しているいいねは赤く表示する #22 r5 -pick 3b5e121 r6 -pick 919d4f1 いいね対応 + s 6787c39 自分が既に押しているいいねは赤く表示する #22 + s 0e94891 自分が既に押しているいいねは赤く表示する #22 r5 + s 3b5e121 r6 + s 919d4f1 いいね対応
1つ以上pickを残してまとめたいコミットをsに変える
これで何事もなければ、
$ git push -f origin master
リモートリポジトリにpushして完了
※エラーが出た場合
error: cannot 'squash' without a previous commit You can fix this with 'git rebase --edit-todo' and then run 'git rebase --continue'. Or you can abort the rebase with 'git rebase --abort'.
git rebase –continueでコンフリクトしたファイルが見れるので修正する。VS Codeだとここらへんの修正が楽。
それからgit add -AしてリモートにpushでOK
$ git add -A $ git push -f origin master
なんか操作してミスしてりとかだったらrebaseの作業を破棄することで戻れる
$ git rebase --abort
issue機能
issue#<番号>でイッシュー用のブランチを作成し作業する
$ git branch issue#1 $ git checkout issue#1
commitする時にissue番号を入れるとリンクが作成される。
$ git add . $ git commit -m "Done! Review.phpのgetList() 全件取得時のキャッシュ機能が抜けている #1" $ git push origin issue#1
issueでcommit番号のハッシュ値を張ることで、リンクが出来る。
masterにも反映させる
masterブランチに移動 $ git checkout master masterにissue#1をマージ $ git merge issue#1 masterのリモートリポジトリ(GitHub)にもpushする $ git push origin master
issue#1ブランチの削除
$ git branch -D issue#1
untrackedファイルを削除する
リポジトリに管理されていないファイル = 追跡対象外ファイル = untrackedファイル
フレームワークを利用していると自動生成されることがあり、なかなかお世話になるコマンド。
追跡対象外のファイルを確認(削除実行はしない)
$ git clean -n
追跡対象外のファイルを削除
$ git clean -f
追跡対象外のファイルとディレクトリを削除
$ git clean -df