fc2ブログ

Entries

git bundleでコミットを送り合うテスト

タグ: Git

Alice: リポジトリを作る。

alice$ git init
alice$ echo A > alice.txt # 適当にファイルを作ってコミット
alice$ git add alice.txt
alice$ git commit -m "alice's commit A"
alice$ echo B >> alice.txt # 適当に変更を加えてコミット
alice$ git commit -a -m "alice's commit B"
aliceリポジトリ初期状態

Alice: aliceリポジトリのバンドルファイルを作成し、Bobに送る。

alice$ git bundle create ../alice.bundle HEAD 
alice$ git branch bob # バンドルファイルを作ったリビジョンにブランチを作っておく

Bob: 受け取ったバンドルファイルをcloneしてbobリポジトリを作る。

bob$ git clone alice.bundle bob
bob$ cd bob
bob$ git checkout -b master # masterブランチを用意
bob$ git branch alice # alice.bundleの先端にブランチを作っておく
clone直後のbobリポジトリ

Bob: bobリポジトリにコミットを追加する。

bob$ echo A > bob.txt
bob$ git add bob.txt
bob$ git commit -m "bob's commit A"
bob$ echo B >> bob.txt
bob$ git commit -a -m "bob's commit B"
bobリポジトリにコミットを追加

Bob: alice.bundleの先端からの差分バンドルファイルを作成してAliceに送る。

bob$ git bundle create ../bob.bundle alice..HEAD

Alice: AliceはAliceでaliceリポジトリにコミットを追加している。

alice$ echo C >> alice.txt
alice$ git commit -a -m "alice's commit C"
alice$ echo D >> alice.txt
alice$ git commit -a -m "alice's commit D"
aliceリポジトリにコミットを追加

Alice: Bobから受け取ったバンドルファイルをbobブランチにpullする。

alice$ git remote add bob ../bob.bundle
alice$ git checkout bob
alice$ git pull bob HEAD
AliceのbobブランチにBobの変更をpull

Alice: masterブランチにbobの変更を取り込む。

alice$ git checkout master
alice$ git merge bob
AliceのmasterにBobの変更を取り込んだ

Alice: bob.bundleの先端からの差分バンドルファイルを作成してBobに送る。

alice$ git bundle create ../alice.bundle bob..HEAD

Bob: Aliceから受け取った差分バンドルファイルをaliceブランチにpullする。

bob$ git checkout alice
bob$ git pull origin HEAD
BobのaliceブランチにAliceの変更をpull

Bob: masterブランチにaliceの変更を取り込み、作業を再開する。

bob$ git checkout master
bob$ git merge alice
BobのmasterにAliceの変更を取り込んだ

TortoiseGit rebase

タグ: Git TortoiseGit Windows

TortoiseGit 1.6.5(with msysGit 1.7.4)の使い勝手を調べていたときのお話。

tgit_rebase_1.png

この状態から

tgit_rebase_2.png

piyoブランチをmasterブランチのHEADにrebaseしようとしたら

tgit_rebase_3.png

「add piyo.txt」のコミットが消えた。

rebaseの使い方を誤ったのだろうか?
いずれにせよ、このおかしな歴史は元に戻さなければならない。
shift+コンテクストメニューでReflogを出す。

tgit_rebase_4.png
tgit_rebase_5.png

何か表示がおかしい気がするが……

tgit_rebase_6.png

Refを指定したらすっきりした。

tgit_rebase_7.png

piyo{1}を選び、「add piyo.txt」の頃にresetする。
これで無事、rebaseする前の状態に戻ることができた。

さて、この「rebaseするとコミットが消える」現象。
TortoiseGitのIssuesの方にも「時々起こる問題」として何件か上がっているが、最終的には「Issue 512: Git sync lose local commits (remote update, fetch and rebase)」にて

The issue always occurred on single-core machines, or when manually setup affinity mask of TortoiceProc to one core.

「シングルコアのマシンなら確実に起こる」というコメントと共にパッチが上げられていた。
シングルコアとは、なるほど今時のマシンでは発症しにくそうな不具合である。

では、このパッチを適用したバイナリを入れて再度rebaseしてみよう。

tgit_rebase_8.png
tgit_rebase_9.png

今度は期待通りの歴史になることが確認された。

Appendix

タグ

Blog内検索