tanaka's Programming Memo

プログラミングについてのメモ。

GitHubの勉強中(2)

GitHub実践入門 ~Pull Requestによる開発の変革 (WEB+DB PRESS plus)

GitHub実践入門 ~Pull Requestによる開発の変革 (WEB+DB PRESS plus)

GitHub実践入門2周目。

checkoutとpull

p71のチェックアウトの説明で混乱した。

$ git checkout -b feature-D origin/feature-D

これの解説が
リモートのfeature-Dブランチをチェックアウトする。
となっていたのが原因。

checkoutとは

まず、http://git-scm.com/docs/git-checkout から、git checkoutは、作業用のフォルダであるワーキングツリーに、特定のバージョンのブランチやインデックスを書き換えるコマンドである。「ブランチを切り替える」というのは、「ワーキングツリーの内容をそのブランチのものにする」を言い換えたもの。

件の例を再確認
$ git checkout -b feature-D origin/feature-D

「-b」オプションが付くと「git checkout」は、「git branch」と「git checkout」をまとめて行うことはp50あたりで述べられているが、「git branch」にリモートリポジトリを指定した際の動作の説明がなかったために理解しきれなかった。実際の流れは以下の通り。

  1. git branch feature-D origin/feature-D
    1. feature-Dというブランチをローカルリポジトリに作成
    2. ローカルのfeature-Dブランチに、リモートのfeature-Dブランチをpullしてくる(http://git-scm.com/docs/git-branch.html)
  2. git checkout feature-D
    1. ワーキングツリーを、ローカルのfeature-Dの内容にする(現在のブランチがfeature-Dになる)


以上から、p72の「git pull--最新のリモートリポジトリブランチを取得」が理解できた。この例では、ローカルリポジトリにすでにfeature-Dというブランチが作成済みであり、現在のワーキングディレクトリがfeature-Dブランチになっているので、branchをする必要もcheckoutする必要もなく、pullだけすればよいということだった。

pullとfetch

これも違いがよく分からなかった。この違いは「サルでも分かるGit入門」さんの解説がとても分かりやすかった。
http://www.backlog.jp/git-guide/stepup/stepup3_1.html

pull

pullは、ローカルリポジトリに、リモートリポジトリの内容をマージして、可能であればコミットする。

fetch

fetchは、リモートリポジトリの内容を読み込んでくるだけで、マージやコミットはしない。取得したブランチはFETCH_HEADで指定できる。FETCH_HEADをマージすると、pullしたのと同じ状態になる。

pull = fetch+marge