ちら帳

喉元を過ぎると熱さを忘れる自分の為の、ちら裏メモ帳ブログです。

Gitで作業中のブランチを最新化するときのあれこれ

※過去に自分が他の媒体で書いていた記事を移動してきたものなので、情報が古い可能性があります。ご注意ください。

自分用の備忘録です。

開発環境のdevelopブランチの内容を自分のブランチに取り込みたい

# コミットしていないファイルがあるときは退避
$ git stash

# origin/developの内容を取り込み
$ git pull --rebase origin develop

# 退避したファイルがある場合はもとに戻す
$ git stash pop

プロジェクトの規約などでrebaseが使えない場合はこっち。

# コミットしていないファイルがあるときは退避
$ git stash

# origin/developの内容を取り込み
$ git fetch
$ git merge origin/develop

# 退避したファイルがある場合はもとに戻す
$ git stash pop

git fetch, git merge origin/developとしている部分はgit pull origin developに置き換え可能。

pull --rebaseで他のブランチを取り込もうとしたら、コンフリクトしたので解消したい

# コンフリクトファイルの確認
$ git status
$ git diff [file path]

# a. コンフリクトしている箇所でorigin/developの内容だけを採用したいときはこちら
$ git checkout --ours [file path]

# b. コンフリクトしている箇所で手元のブランチの内容だけを採用したいときはこちら
$ git checkout --theirs [file path]

# c. 両方のブランチの変更を取り入れたいときはmergetoolやエディタでコンフリクト箇所を修正する
$ git mergetool

# git mergetoolを使う以外の方法でコンフリクトを直したら、該当ファイルをaddする
$ git add [file path]

# rebaseを続行
$ git rebase --continue

他のブランチの内容を取り込もうとしたら、Your local changes to the following files would be overwritten by mergeとメッセージが出た

コミットも退避もしていないファイルがあるときに出る。

# 不要な変更であればcheckoutで差分をなかったことにする
$ git checkout [file path]

# 取り込み中はいったん退避するならstash
$ git stash

# 取り込み前にコミットしていいならコミット
$ git add [file path]
$ git commit

もっと細かい単位でaddやcheckoutをおこないたい場合はgit checkout -p [file path]git add -p [file path]を利用する。

git rebase --continueしたら、No Changes - did you forget to use 'git add'?とメッセージが出てrebaseが続行できない

特定のコミットを取り込もうとしたら何も変えるところがなかったため、エラーが出ている。 該当コミットの取り込みをスキップする。

# addしていないコンフリクト解消済みファイルなどないか確認
$ git status
# 今取り込もうとしているコミットをスキップする
$ git rebase --skip

rebaseによる取り込み操作を途中でやめたい

$ git rebase --abort

pull(rebaseなし)やmergeで他のブランチを取り込もうとしたら、コンフリクトしたので解消したい

# コンフリクトファイルの確認
$ git status
$ git diff [file path]

# a. コンフリクトしている箇所でorigin/developの内容だけを採用したいとき(rebaseとは逆になるので注意)
$ git checkout --theirs [file path]

# b. コンフリクトしている箇所で手元のブランチの内容だけを採用したいときは(rebaseとは逆になるので注意)
$ git checkout --ours [file path]

# c. 両方のブランチの変更を取り入れたいときはmergetoolやエディタでコンフリクト箇所を修正する
$ git mergetool

# git mergetoolを使う以外の方法でコンフリクトを直したら、該当ファイルをaddする
$ git add [file path]

# 最後にコミットしてpull/mergeを完了する
$ git commit

rebaseやpull/mergeによる取り込み操作を完了したが、やっぱり取り込み前に戻りたい

# いくつ前の操作に戻ればいいか確認
$ git reflog
# n番目の操作に戻る
$ git reset --hard HEAD@{n}

git merge を使っているときはこちらでも戻れる。

# どのコミットに戻ればいいか確認
$ git log
# merge前の操作に戻る
$ git reset --hard [mergeコミットの一つ前のコミットのハッシュ値]

退避していたファイルを戻したらコンフリクトした

# a. stashの内容を無視する
$ git checkout --ours [file path]

# b. stashの内容でファイルを上書きする
$ git checkout --theirs [file path]

# c. 両方の変更を取り入れたいときはmergetoolやエディタでコンフリクト箇所を修正する
$ git mergetool

# git mergetool以外の方法でコンフリクトを解消したときはgit addする
$ git add [file path]

# コンフリクトを解消したファイルをまだステージしたくないときは取り下げる
$ git reset [file path]

# コンフリクトしたときはstashがdropされないので消しておく
$ git stash drop