【masterに取り込み、更新】リモートのmasterが更新されたため、ローカルのmasterに単純に取り込みたい
[branch上]
$ git checkout master
[master上]
$ git fetch
$ git merge
[now:masterに更新かかった状態]
[その他]
$ git branch [新しいbranch切る]
$ git branch -D [先程までのいらないbranch]
#【master更新〜ブランチ取り込み】ブランチで開発中、リモートmasterに更新がかかった場合
[ブランチ上]
$ git stash
[master上]
$ git checkout master
$ git fetch
$ git merge
$ git checkout [先ほど作業していたブランチ名]
[ブランチ上]
$ git merge origin/master
$ git stash apply [先程、退避した履歴]
$ git stash drop [先程、退避した履歴]
##ローカルのmasterに更新をかける
-
git stash
:変更の退避(addはしたけど、commitしてないもの)。commitしたくないけど、逃したい場合に有効。
【状態】
・ローカルのmasterと同じ状態
(master→ブランチに切り替えして、一度もcommitしていなければ)
-
git checkout master
:
同じ状態にしてから、masterに切り替える。(そうでないと、ブランチの状態がそのままmasterに反映されるから。)
【状態】
・現在、ローカルのmasterにいます。
-
git fetch
:もしくは、git fetch origin master
。
ここでおさらい。
ここで出てくるmasterの種類は3種類。
①(リモート)origin master
originというリモートブランチのmasterブランチ(デフォルトでは)
②(ローカル)origin/master:
リモートmasterを追跡する、リモート追跡ブランチ。かつ、ローカルmasterの上流ブランチ。
③(ローカル)master:
origin/masterを上流ブランチとする、作業ブランチ。
git fetch
は①→②に取り込むコマンド。
あくまで、ローカルのブランチに引き出すだけ。書き換えられることはない。
【状態】
②(ローカル)origin/masterに、①(リモート)masterの更新がかかった
-
git merge
:もしくは、もしくは git merge origin/master
②→③に取り込むコマンド。
【状態】
③(ローカル)masterに、②(ローカル)origin/masterの更新がかかった。
(これで、masterのリモート〜作業ブランチまで全て同じ状態)
※ git fetch と git mergeを同時に行ったものが、git pullになります。
何をしているかわからずコマンドを打っている段階では、git pull
は使わない方がいいですね。
##ローカルブランチに更新をかける
-
git checkout [先ほど作業していたブランチ名]
:ブランチに、戻ります。
【状態】
・現在、ブランチに移動。ブランチの状態は、リモートのmasterを取り込む前のmasterの状態と同じ
-
git merge origin/master
:すでに、fetchしてあるので、origin/masterをブランチにも取り込みます。
【状態】
・これで、ブランチも最新状態
-
git stash apply [先程、退避した履歴]
:ここで先程退避した、ものを引っ張ってきます。
($ git stash list
で確認してください。)
【状態】
・ブランチは、最新の状態に、現在編集途中のものを取り込んだ状態になります。
-
$ git stash drop [先程、退避した履歴]
:先程逃したものは必要ないので削除しておきます。
完成!!
#【ブランチ取り込みのみ】ブランチで開発中、リモートmasterに更新がかかって取り込みたい場合
$ git stash
$ git fetch
$ git merge もしくは git merge origin/master
$ git stash apply [先程、退避した履歴]
$ git stash drop [先程、退避した履歴]
上の説明と、同じなので省略。
#git pullについて
コマンド | 説明 |
---|---|
pull | fetch + merge |
fetch | ダウンロード |
push | アップロード |
merge | リモートを、ローカルに合流(logに残しにくいが、初心者はコッチ)→checkoutはmaster |
rebase | リモートを、ローカルに合流(logに残しやすいが、ミスしやすい)→checkoutは作業ブランチ |
#注意点
###①コミットが済んでいないのに、checkoutでブランチを切り替えるのはやめましょう。
なぜなら、(例)branch1→masterに切り替え
ブランチで更新した内容がそのままmasterに反映されるから。
###②編集途中の現branchから、別branchに切り替える時
→現branch内容が、別branchにも反映される