IT技術にまつわる実験ノート

「長編を書くより、短編を数多く完成させてください。それが上達への近道です」 by 手塚治虫

git で fetch + rebase してみる

はじめに

git の fetch と rebase コマンドで、リモートブランチの変更をローカルに取り込むことができる。git pull --rebase と同じことが実現できるわけだが、fetch + rebase の場合は、rebase 前にリモートブランチの変更を確認してから rebase することができる。

 

使ってみる

GitHubリポジトリを作成する。

f:id:matt-note:20190711111042p:plain

 

ローカルで GitHubリポジトリを clone する。

  • git clone <your_repository>
  • cd fetch-rebase-sample

 

コミットを作成する。

  • echo "# fetch-rebase-sample" >> README.md
  • git add README.md
  • git commit -m "first commit"

 

このリポジトリに初のコミットが作成されたので、master ブランチが作成される。

  • git branch

 

GitHub のリモートリポジトリ(origin)にローカルの master ブランチを push する。

  • git push origin master

 

これでリモートリポジトリに push できる。

f:id:matt-note:20190711111502p:plain

 

ここでは fetch コマンドを使いたいので、リモートブランチを編集する。GitHub で右にある鉛筆ボタンを押すと、編集画面に移動できる。

f:id:matt-note:20190711111834p:plain

 

リモートブランチでコミットを作成する。

f:id:matt-note:20190711111938p:plain

 

リモートブランチ(origin)のコミットを fetch してみる。明示的にコマンドを実行する場合は、以下のようにする。

  • git fetch origin

 

ローカルブランチとリモートブランチの差分を見てみる。

  • git diff origin/master

f:id:matt-note:20190711112245p:plain

-> ローカルブランチとリモートブランチの差分を表示できた。

 

リモートブランチをリベースする前に、ブランチを作成してローカルにコミットを作成してみる。

  • git checkout -b develop
  • echo "second commit" >> second.md
  • git add second.md
  • git commit -m "second commit in local"

 

これでローカルリポジトリの履歴は以下のようになる。

  • git log --oneline

f:id:matt-note:20190711114827p:plain

 

push する前に、origin/master ブランチをリベースして、リモートのコミットをローカルに取り込む。

  • git rebase origin/master

 

これで origin/master ブランチのコミットをローカルブランチに取り込むことができた。

  • cat README.md

f:id:matt-note:20190711113439p:plain

 

origin/master ブランチを取り込んだローカルブランチの履歴は以下のようになる。

  • git log --oneline

f:id:matt-note:20190711114947p:plain

-> second commit の下に origin/master の変更履歴がリベースされる。

 

あとはローカルの develop ブランチを push すれば良い。

  • git push origin develop

 

GitHub のリモートブランチで pull request を作成して、マージする。

f:id:matt-note:20190711115121p:plain

 

これでローカルブランチのコミットをリモートの origin/master ブランチに取り込むことができた。

 

develop ブランチでリモートブランチでマージしたコミットを取り込んでみる。

  • git fetch origin
  • git rebase origin/master

 

履歴を見てみる。

  • git log --oneline

f:id:matt-note:20190711115539p:plain

-> リモートブランチの変更をローカルの develop ブランチに取り込むことができた。

 

rebase でコンフリクトを起こしてみる

GitHub で README.md を編集して、origin/master ブランチにコミットする。

f:id:matt-note:20190711121627p:plain

 

ローカルで README.md を編集してコミットする。

  • echo "edit in local" >> README.md
  • git add README.md
  • git commit -m "third commit"

 

リモートブランチを fetch して rebase してローカルに取り込む。

  • git fetch origin
  • git rebase origin/master

 

コンフリクトが発生する。

f:id:matt-note:20190711121912p:plain

 

ここでのブランチは以下のようになる。

  • git branch

f:id:matt-note:20190711122002p:plain

 

Atom エディタで README.md を開くと、以下のようにコンフリクトが可視化される。

f:id:matt-note:20190711122235p:plain

 

ここでは下の edit in local を使うことにする。ファイルを変更して保存する。

コンフリクトを解消できたら、変更したファイルを add する。

  • git add README.md

 

リベースを続行して、origin/master ブランチのコミットをローカルに取り込む。

  • git rebase --continue

 

これで元の develop ブランチに戻ることができる。

  • git branch

f:id:matt-note:20190711122705p:plain

 

変更履歴は以下のようになる。

  • git log --oneline

f:id:matt-note:20190711122853p:plain

-> rebase して origin/master ブランチをローカルに取り込むことができた。