- 投稿日:2020-06-23T21:44:31+09:00
Gitで上流ブランチを取得する第3の方法
概要
git pull
した時にマージされるブランチ、いわゆる「上流ブランチ」が何かを知りたい時、git status -sb
の出力を読んだり、ファイル.git/config
の中身を読めばわかるのですが、そんなことしなくても、$ git rev-parse --abbrev-ref @{u}すれば、わかるんです。
git status -sb
-s
はshort formatで出力するためのオプション、-b
はshort formatにおいてブランチ情報を出力するためのオプションで、出力の一行目にブランチの情報が現れます。上流ブランチが設定されてない場合にはローカルブランチ名だけが出力されます。
$ git status -sb | head -1 ## master上流ブランチが設定されている場合にはローカルブランチ名の後に"..."、そのあとに上流ブランチ名が出力されます。
$ git status -sb ## master...origin/master上流ブランチと同期されてない場合には、上流ブランチ名の後に、ローカルブランチと上流ブランチがコミットいくつ分離れているかが出力されます。上流ブランチより遅れている場合は
$ git status -sb ## master...origin/master [behind 7]のように出力され、この状態で
git pull
すると origin/master のコミット7つがfast-forwardでマージできます。$ git log --oneline master...origin/master|wc -l 7逆に手元のブランチの方が進んでいる場合は
$ git status -sb ## master...origin/master [ahead 1]と出力され、この場合は git push するとローカルブランチと上流ブランチが同期されます。
一方、ローカルブランチと上流ブランチが分岐している場合、つまり
git pull --ff-only
が失敗し、git pull
でマージコミットが生成される状況では$ git status -sb ## master...origin/master [ahead 1, behind 7]のように、ローカルブランチと上流ブランチの、共通の祖先を経由した距離が出力されます。
$ git log --oneline master...origin/master|wc -l 8また、設定された上流ブランチが削除されるなどして存在しなくなった場合には、
$ git status -sb ## feature...origin/feature [gone]のようにgoneと出力されます。
.git/config
master の上流ブランチが origin/master である場合、
.git/config
には以下の内容が記載されています。[branch "master"] remote = origin merge = refs/heads/masterこの値は以下のようにしても読み出せます。
$ git config branch.master.remote origin $ git config branch.master.merge refs/heads/masterここで branch.master.merge の値 refs/heads/master はリモートリポジトリでの表現であり、ローカルリポジトリでは refs/remotes/origin/master で表現されることに注意が必要です。
@{u}
gitrevisions(7) に説明があるように、
@{u}
もしくは@{upstream}
で上流ブランチを参照できます。$ git rev-parse --abbrev-ref @{u} origin/master $ git rev-parse --abbrev-ref @{upstream} origin/master先に説明した二つの方法では上流ブランチの表現を得るには出力を加工する必要がありましたが、この方法だとそのまま出力してくれるので簡単です。
- 投稿日:2020-06-23T12:35:50+09:00
[Git] ファイルがどのbranchに含まているか検索する
謎のmigrationがあるためgit log全体を検索
対象のファイルが含まれるコミットを発見$ git log --all -- 'db/migrate/2020323*' commit d178513009038b0d6473de95a685c9402da14123 Author: Cozy <dummy-mail@gmail.com> Date: Fri Mar 27 18:20:29 2020 +0900 〇〇のcolumn名変更あった。glob対応してるのが嬉しいね
git branch
でコミットが含まれるbranchを検索して発見$ git branch -a --contains d178513009038b0d6473de95a685c9402da14123 remotes/origin/feature/dummy-feature-branchこれにて一件落着 ?
- 投稿日:2020-06-23T10:15:56+09:00
Gitのautosquashらへん
- 投稿日:2020-06-23T00:44:40+09:00
チーム開発の流れと注意点(初学者)
チーム開発の主な流れ
チーム開発の流れとしてまず最初に
1.リードプログラマーがプロジェクトのリボジトリを作成2.そのリポジトリを各々がforkしてcloneする
git clone https://github.com/ユーザー名/リボジトリ名.git
3.各プログラマーが各々のリポジトリ先にfork先に追加
git remote add リモート名(originなどの名前) https://github.com/開発の代表者/リボジトリ名.git4.作業用ブランチを作成
git checkout -b (branch名)5.リボジトリで各プログラマーは開発をスタートする。
ここでの注意点
1タスクごとにコミットをしていくgit add フォルダー or ファイル名 git commit -m "タスク名"6.ある程度commitがたまったらpush
git push origin master7.プッシュしたらリードプログラマー宛てにPullRequestを行います
ここでconflictがでた場合下記を参照にしてください
https://help.github.com/ja/github/collaborating-with-issues-and-pull-requests/resolving-a-merge-conflict-on-github8.PullRequestを行う時の注意点
WHAT(どのような実装)WHY (なぜ実装したのか)
といった形でリクエストを送るとよりリードプログラマーに送ります9.リードプログラマーは、送られたきたPullRequestをメッセージを確認した後にマージを行います
注意点
PullRequestを行ってもFork/cloneしたリポジトリは本家にmasterが追従しているわけではありません。
マージした後は各々のマスターブランチ に移動して
コマンド)git fetch upstream
にて更新を行い
コマンド)git checkout master
コマンド)git merge upstream/master
で本家のmasterに追従させることができます。
変更が無い場合には "Already up-to-date." と表示されて終了です!おわり
自分自身最初にgithubを使いチーム開発をした際に手順、注意点を復習としてまとめさせていただきました。
少しでも参考になれば私も嬉しいです