~nabeken/diary/

Gentoo Linux(6年くらい)とFreeBSD(1年くらい)とOpenBSD(新参者)を使う日々。


IHANet BGP peering overview

git rebase せよ

Posted on Sat May 17 14:33:41 +0900 2008 by nabeken

Hina も形になってきました。記事も push すると公開されるところまでこぎつけたので、ペースが上っています。

各マシンでそれぞれブランチを切って、日記を書きはじめるわけですが、その間にも、ブランチを切って、じっくり書きたいネタも出てきます。その逆もまたあり、じっくり書きたいネタに取りかかりつつ、日々の日記を書くこともあります。

Timeline
========
| (branch: master)
|
| - git pull (日記を書く前にpullして最新の状態にする)
|
| - git checkout -b diary (日記用のブランチを切る)
|
` _____ 
|      `
|      | (branch: diary)
|      |
|      |  - vi Articles/Diary/20080509 
|      |       今日覚えた git 関連をメモろう
|      |  - git commit -a
|      |       一旦、ここまでの作業をコミットする
|      |  - git checkout -b git-tips master
|      |       masterからgit-tipsブランチを切る
|      |
`---------------- 
|      |         `
|      |         | (branch: git-tips)
|      |         |
|      |         | - vi Articles/Sysadmin/git-4 (この記事)
|      |         |      眠いので、とりあえず、今日は日記を書き上げて寝る
|      |         | - git add git-4 && git commit
|      |         |      また、そとで続きができるように、外のリポジトリへpushする
|      |         | - git push origin git-tips
|      |         |      日記に戻る
|      |         | - git checkout diary
|      |
|      | - vi Articles/Diary/20080509
|      |      書き上げたので、コミットする
|      | - git commit -a
|      |      この状態では master は更新していないので、そのままマージ(Fast forward)してしまう
|      | - git checkout master && git merge diary
|             マージした日記を公開するため、push する
|
| - git push
|      この時点で diary ブランチは役目を終えた(masterに行ったから)ので削除
| - git branch -d diary
|
| ここで、これ以後は別のマシンで作業することにする
|
| - git pull
|      master と git-tips ブランチが更新される
| - g checkout -b diary
|      ふたたび日記でも書く
|
`_____
|     `
|     | - vi Articles/Diary/20080510
|     | - git add Articles/Diary/20080510 && git commit
|     | - git checkout master && git merge diary
|
| - git push && git branch -d diary
|
| ここで、最初のマシンへ戻る
|
| - git pull
|      master が更新される。
|      そして、ここからですが、ふたたび git-tips ブランチで作業を行います。
| - git checkout git-tips
|
`_____
|     `
|     | このとき、 git-tips の branch 元は最初にブランチを切ったときの master です。
|     | したがって、最新の変更をこのブランチへ加えるには git merge master をする必要があります。
|     | しかし、これを行ってしまうと、最後、git-tipsブランチを master へマージするときに、さきほどのマージが
|     | 履歴として残ってしまいます。
|     | 
|     | マージではなく、まず、git-tipsブランチの head を master の head へ持っていき、
|     | 次に、加えた変更をパッチとして当てていきます。こうすることで、履歴は1つのまま作業を続けることができます。
|     | この作業を行うのが git rebase です。
|     |
|     | - git rebase master
|     |      First, rewinding head to replay your work on top of it...
|     |      HEAD is now at 7ea553b... BitlBee
|     |      
|     |      Applying ブランチを切る
|     |      
|     |      Adds trailing whitespace.
|     |      .dotest/patch:30:` _____
|     |      Adds trailing whitespace.
|     |      .dotest/patch:34:|      |  - vi Articles/Diary/20080509
|     |      Adds trailing whitespace.
|     |      .dotest/patch:42:|
|     |      Adds trailing whitespace.
|     |      .dotest/patch:43:`----------------
|     |      Adds trailing whitespace.
|     |      .dotest/patch:49:|                |
|     |      warning: squelched 1 whitespace error
|     |      warning: 6 lines add whitespace errors.
|     |      Wrote tree 0a895bbbfdd76bcf6298826588e209fd86f7a548
|     |      Committed: 85930442cc505c130c010bbb042206f5cf10488b
|     |
|     | - vi Articles/Sysadmin/git-4
|     |     途中でコミットして寝る
|     | - git commit -a
|     |     そして、次は push ですが、 rebase によって、以前 push したときとは親が異なっていますので、そのまま push 
|     |     はできません。したがって、一旦、削除する必要があります。
|     | - git push origin :git-tips && git push origin git-tips
|
|
.... 以下、繰り返し

rebase はブランチを切ったときの親を更新します。これはつまり、履歴を改変することと同義です。

  • ブランチを切ったものを push する
  • それを誰かが pull する
  • あなたが rebase したものを push する
  • pull した人から見ると履歴が連続的にならず、 fast-forward にならない (強制 no fast forward になる)

したがって、rebaseするブランチを push する時は履歴を改変することを予め告知しておく必要があるでしょう。

なお、作業を中断して、コミットせずに他のブランチで作業を行いたい場合は git-stash というのもあります。

参考文献

  • man 1 git-rebase

更新履歴

  • 参考文献と git-stash について言及 (Sat, 17 May 2008 14:33:41 +0900)
  • pullした人の記述を修正 (Sat, 17 May 2008 14:25:18 +0900)
  • git-4: 初稿 (Sat, 17 May 2008 14:21:55 +0900)
  • pushする前にブランチを消す (Sat, 17 May 2008 14:15:28 +0900)
  • rebaseのところまで (Sat, 17 May 2008 14:15:28 +0900)
  • ブランチを切る (Sat, 17 May 2008 14:15:28 +0900)