はじめに
個人で開発をしている時は、正直 git add
と git commit
, git push
くらいしか使っていなかったのですが、Gitの研修やチーム開発を通してGitに関して様々なことを学びました。そこで、Gitを用いてチーム開発を行うときに、「これは知っておきたかったなー」というものをまとめてみました
流れとしては master
ブランチから develop
ブランチを切り、そこから feature/・・・
という感じで作業ブランチを切り、そこで作業を行なっていきます。
🤔 「他のメンバーがプルリクを出したから、手元で確認してレビューしたい...」
例
自分が feature/fix_top_page_view
ブランチで作業をしているときに、他のメンバーから feature/fix_edit_page_view
ブランチで変更を行なってプルリクを出したからレビューしてほしいと依頼が来た時
1. 一旦は自分のブランチで修正を行なった分をコミット
$ git add hoge.md
$ git commit
コミットできるものは、この段階でコミットしておく
2. stashを使ってその他変更した部分を一旦退避
$ git stash -u
u
オプションをつけることによって、untrackファイルも含めて全てstashしてくれる
3. リモートリポジトリの最新情報をローカルリポジトリに持ってくる
$ git fetch
git pull
のようにファイルが更新される訳ではない
4. 一応ブランチを確認したあと、レビュー対象のブランチに切り替え
$ git branch -a
$ git checkout remotes/origin/feature/fix_edit_page_view
レビュー対象のリモートブランチに切り替えてレビューする
5. レビュー後、自分が作業していたブランチに戻る
$ git checkout -
6. 退避させていたコードを戻す
$ git stash pop
先ほど退避させておいたコードを元に戻す
🤔 「マージしようとしたらコンフリクトが発生していてマージできない...」
例
自分が feature/fix_top_page_view
ブランチでの作業を終え、pushし、プルリクを送った後にコンフリクトが発生していた場合
$ git pull origin develop
pull
してくるとコンフリクトが起きるので、エディタ上でコンフリクトを解消し、再度 add
してcommit
して push
😭 「Gitで管理したくないファイル・フォルダをpushしてしまった」
例
Gitで管理する必要のない .vscode
フォルダを push
してしまった...
// フォルダの場合rオプションが必要
$ git rm -r --cached .vscode
$ echo '.vscode/' >> .gitignore
😭 「マージを取り消したい」
例
コンフリクトを解消するために色々変更とかしたけど、編集内容もマージも取り消したい
$ git reset --hard HEAD~
-
reset
- インデックスを、指定した状態にリセット
- HEADを指定したcommitに移動
-
「HEAD~」「HEAD^」
~(チルダ)を後ろに付け加えることで何世代前の親かを指定することができます。^(キャレット)は、ブランチのマージで親が複数ある場合に、何番目の親かを指定することができます。
引用:サルでも分かるGit入門
その他
前回分のコミットメッセージと統合したい場合
$ git add .
$ git commit --amend
前回のコミットメッセージを書き換える。git graph
を使って履歴を確認してみると前回のコミットメッセージが変更されている
revertとは
コミットを打ち消すコマンド。コミットを打ち消すのではなく、新たにコミットを追加することによってコミットを取り消している。
- resetコマンド→コミットを取り消した形跡が残らない
- revertコマンド→コミットを取り消した形跡が残る
間違ってresetしてしまったのでreset前の状態に戻したい
$ git reset --hard ORIG_HEAD
ORIG_HEAD:resetを実行する直前のコミット
rebaseでコンフリクトを解消した後どうすればいいの
rebaseで、コンフリクトを解消後はコミットではなく、--continueオプション
を指定して実行
$ git rebase --continue
rebaseの作業を中止したい
$ git rebase --abort
直前のコミットと現在のコミットをまとめたい
$ git rebase -i HEAD~~
-
rebase
- 作業が完了したブランチを分岐元のブランチと結合する際に使う(歴史を改変してしまう)
-
-i (interactive)
- 過去のコミットを編集できる
- 指定できるオプション
- squash(コミットメッセージが必要な際に使用)
- etc...
- 指定できるオプション
- 過去のコミットを編集できる
トピックブランチのコミットを1つにまとめて統合ブランチにしたい
$ git merge --squash ブランチ名
特定のコミットを取り出してdevelopブランチに追加する方法
$ git checkout develop
$ git cherry-pick fsdf342 //fsdf342はコミット番号
コンフリクトが起きた場合は修正して、add
して commit