他の人が作業中のブランチにpull Requestを送る

2017年5月9日

いままでずっとやり方をミスっていたのでメモ

前提

Aさんが作業していたfeature/hogeブランチがあるとする
このブランチはmasterよりだいぶ遅れている
このブランチに自分の作業分を足したい

コマンド

  1. いつものコマンド
 git checkout master
 git pull origin master
  1. Aさんが作業しているブランチに切り替える
 git checkout -b feature/hoge origin/feature/hoge
  1. AさんにPull Requestを送るため、ここからさらにブランチを切る
 git checkout -b feature/hoge_fuga

間違っていたこと

2の作業の時に

 git checkout -b feature/hoge

としていた。
これだとブランチの作成とチェックアウトを行ってしまうので、
masterからの遅れが差分として表示されてしまう


9311contribution

Aさんが作業しているブランチに切り替える

 git checkout -b feature/hoge origin/feature/hoge

Aさんに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 を切ってチェックアウトする」コマンドだからです。

89contribution

@uasi さん、コメント、ありがとうございます!!!

(master) $ git checkout -b feature/hoge

は、

(master) $ git checkout -b feature/hoge origin/master

と同義だから、

「現在のブランチ(ここでは master)から feature/hoge を切ってチェックアウトする」コマンド

という理解でいいですかね?

9311contribution

正確にいえば

git checkout -b feature/hoge

git checkout -b feature/hoge HEAD

と同義です。 HEAD は現在チェックアウトされているブランチを指します。今回の状況では直前に

git checkout master
git pull origin master

しているために HEAD, master, origin/master がすべて同一のコミットを指しています。だから「現在のブランチ(ここでは master)から〜」ということになります。

89contribution

@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

9311contribution
git diff origin/master

これは「origin/master を起点としてワーキングツリー1との差分を表示する」コマンドです。別の言い方をすると「origin/master にどのような変更を加えるとワーキングツリーと同じ状態になるか、その変更を差分表示する」ということです。これは求めているのとは逆方向の差分ですね。

表示したいのは「master にどのような変更を加えると origin/master と同じ状態になるか」ですから、正しくは

git diff master origin/master

です。現在の HEADmaster と同じであるとすればこんな風にも書けます:

git diff HEAD origin/master
git diff HEAD..origin/master  # スペースで区切っても .. で区切ってもまったく同じ意味
git diff ..origin/master      # .. で区切る場合 HEAD は省略できる

他の部分は問題ないと思います。

  1. 現在ローカルにチェックアウトされているファイルのこと。未コミットの編集内容も含む。 

9311contribution

それと用語の細かい話をひとつ。読み飛ばしてもらっても大丈夫です。

追跡ブランチ = origin/master

「追跡ブランチ (tracking branch)」という用語は混乱しがちなので、最近の Git のマニュアルでは別の用語を使っています。「リモート追跡ブランチ (remote-tracking branch)」と「上流ブランチ (upstream branch)」です。

追記:以下に書いてあった内容を手直しして別の記事に切り出しました http://qiita.com/uasi/items/69368c17c79e99aaddbf


PAGE TOP
/* 解析ツール Googleアナリティクス */ /* 解析ツール ptengine */