他の人が作業中のブランチにpull Requestを送る
いままでずっとやり方をミスっていたのでメモ
前提
Aさんが作業していたfeature/hoge
ブランチがあるとする
このブランチはmasterよりだいぶ遅れている
このブランチに自分の作業分を足したい
コマンド
- いつものコマンド
git checkout master
git pull origin master
- Aさんが作業しているブランチに切り替える
git checkout -b feature/hoge origin/feature/hoge
- AさんにPull Requestを送るため、ここからさらにブランチを切る
git checkout -b feature/hoge_fuga
間違っていたこと
2の作業の時に
git checkout -b feature/hoge
としていた。
これだとブランチの作成とチェックアウトを行ってしまうので、
masterからの遅れが差分として表示されてしまう
Aさんが作業しているブランチに切り替える
git checkout -b feature/hoge origin/feature/hogeAさんにPull Requestを送るため、ここからさらにブランチを切る
git checkout -b feature/hoge_fuga
こうすると結局 origin/feature/hoge
と同じコミットを指す feature/hoge_fuga
ブランチが出来ますが、同じことは1行で
git checkout -b feature/hoge_fuga origin/feature/hoge
と書けます。
git checkout -b feature/hoge
これがうまくいかないのは「現在のブランチ(ここでは master
)から feature/hoge
を切ってチェックアウトする」コマンドだからです。
@uasi さん、コメント、ありがとうございます!!!
(master) $ git checkout -b feature/hoge
は、
(master) $ git checkout -b feature/hoge origin/master
と同義だから、
「現在のブランチ(ここでは master)から feature/hoge を切ってチェックアウトする」コマンド
という理解でいいですかね?
正確にいえば
git checkout -b feature/hoge
は
git checkout -b feature/hoge HEAD
と同義です。 HEAD
は現在チェックアウトされているブランチを指します。今回の状況では直前に
git checkout master
git pull origin master
しているために HEAD
, master
, origin/master
がすべて同一のコミットを指しています。だから「現在のブランチ(ここでは master
)から〜」ということになります。
@uasi さん、ありがとうございます。下記、おかしいところあったら教えて下さい。
- masterブランチ = master
- 追跡ブランチ = origin/master
- 現在いるブランチの最新コミット = HEAD
git checkout master
git pull origin master
をすると、すべて同一のコミットを指す。
fetchとはリモートリポジトリから最新情報をローカルリポジトリに持ってくるコマンド
fetchすると、remote/origin/masterとローカルのorigin/masterが同じものになる
masterブランチとorigin/masterは異なる
差分の確認
git diff origin/master
差分を確認して問題なければmergeする
git merge origin/master
git diff origin/master
これは「origin/master
を起点としてワーキングツリー1との差分を表示する」コマンドです。別の言い方をすると「origin/master
にどのような変更を加えるとワーキングツリーと同じ状態になるか、その変更を差分表示する」ということです。これは求めているのとは逆方向の差分ですね。
表示したいのは「master
にどのような変更を加えると origin/master
と同じ状態になるか」ですから、正しくは
git diff master origin/master
です。現在の HEAD
が master
と同じであるとすればこんな風にも書けます:
git diff HEAD origin/master
git diff HEAD..origin/master # スペースで区切っても .. で区切ってもまったく同じ意味
git diff ..origin/master # .. で区切る場合 HEAD は省略できる
他の部分は問題ないと思います。
- 現在ローカルにチェックアウトされているファイルのこと。未コミットの編集内容も含む。 ↩
それと用語の細かい話をひとつ。読み飛ばしてもらっても大丈夫です。
追跡ブランチ = origin/master
「追跡ブランチ (tracking branch)」という用語は混乱しがちなので、最近の Git のマニュアルでは別の用語を使っています。「リモート追跡ブランチ (remote-tracking branch)」と「上流ブランチ (upstream branch)」です。
追記:以下に書いてあった内容を手直しして別の記事に切り出しました http://qiita.com/uasi/items/69368c17c79e99aaddbf
ディスカッション
コメント一覧
まだ、コメントがありません