Close

Git フォーク と アップストリーム:仕組みと役に立つヒント

Nicola Paolucci の顔写真
Nicola Paolucci

開発者アドボケート


プロジェクトをフォークして独自の変更を加えると、自分の貢献を簡単に統合できます。しかし、これらの変更をアップストリームに戻すこと (つまり、親リポジトリに返送すること) をしない場合、変更を追跡できなくなり、自分のリポジトリに分岐行が発生するおそれがあります。すべての貢献者が同じ場所から行を作成していることを確認するには、git のフォークと git upstream の相互作用に関する原則をいくつか知っておく必要があります。このブログでは、基本事項、落とし穴を紹介し、時代を先取りするための役に立つヒントも紹介します。

Git upstream: 最新の状態を維持して貢献する


まず、一般的なセットアップおよび upstream リポジトリとやりとりするための最も基本的なワークフローについて、詳しく説明します。

標準的なセットアップでは、通常 originupstream remote が作成されています。後者はプロジェクトのゲートキーパー、または貢献先となる信頼できる情報源です。

まず、upstream リポジトリ用のリモートと、できれば origin も既にセットアップしてあることを確認します。

git remote -v

origin  git@bitbucket.org:my-user/some-project.git (fetch)
origin  git@bitbucket.org:my-user/some-project.git (push)

upstream のセットアップがまだの場合、remote コマンドを使用するだけで簡単に追加できます。

git remote add upstream git@bitbucket.org:some-gatekeeper-maintainer/some-project.git
データベース
関連資料

Git リポジトリ全体を移動する方法

Bitbucket ロゴ
ソリューションを見る

Bitbucket Cloud での Git の使用方法についてのチュートリアルです。

リモートが正しく追加されたか確認します。

git remote -v

origin    git@bitbucket.org:my-user/some-project.git (fetch)
origin    git@bitbucket.org:my-user/some-project.git (push)
upstream  git@bitbucket.org:some-gatekeeper-maintainer/some-project.git (fetch)
upstream  git@bitbucket.org:some-gatekeeper-maintainer/some-project.git (push)

これで、fetch することにより、upstream リポジトリの最新の変更をまとめて収集できます。更新を入手するたびに、これを繰り返します。

(main にマージされていないタグがプロジェクトに含まれている場合は、git fetch upstream --tags コマンドも実行すべきです)

git fetch upstream

一般的には、ローカルの master ブランチを upstream main の近似ミラーとして保持し、フィーチャー ブランチで任意の作業を行います。なぜなら、これらが後でプル リクエストになる可能性があるからです。

この時点で、merge を使用しても rebase を使用しても、結果は通常同じです。ここでは merge を使用しましょう。

git checkout main
git merge upstream/main

upstream のメンテナーと作業を共有したい場合は、main から分岐してフィーチャー ブランチを作成し、作業が仕上がった段階でリモート リポジトリにプッシュします。

代わりに rebase を使用し、続いて merge することによって、upstream で評価対象のコミット一式 (理想には 1 つ) がクリーンな形になるようにすることができます。

git checkout -b feature-x

#some work and some commits happen
#some time passes

git fetch upstream
git rebase upstream/main

git fork で公開する


上記の手順が終わったら、簡単な push によって作業をリモート フォークに公開します。

git push origin feature-x
git push -f origin feature-x

個人的には、できる限り履歴をクリーンな状態で保持したいので、オプション 3 を選びますが、チームによってワークフローが異なるものです。注意: この操作は自分のフォークで作業しているときのみ実行してください。共有リポジトリやブランチの履歴は決して書き換えてはなりません。

今日のヒント:プロンプトに 先行分 / 遅れ分 の数を表示する


fetch した後、同期している remote ブランチと比較して、先行/遅延しているコミット数が git status に表示されます。忠実なコマンド プロンプトでこの情報を見ることができたらいいと思いませんか? 私もそう思ったので、早速キーボードから bash を打ち込み、ツールを作りあげました。

設定が完了すると、プロンプトで次のように表示されます。

nick-macbook-air:~/dev/projects/stash[1|94]$

これを .bashrc 等に追加してください。機能は 1 つだけです。

function ahead_behind {
    curr_branch=$(git rev-parse --abbrev-ref HEAD);
    curr_remote=$(git config branch.$curr_branch.remote);
    curr_merge_branch=$(git config branch.$curr_branch.merge | cut -d / -f 3);
    git rev-list --left-right --count $curr_branch...$curr_remote/$curr_merge_branch | tr -s '\t' '|';
}
export PS1="\h:\w[\$(ahead_behind)]$"

内部の仕組み

詳細と説明を知りたい人にために、このツールの仕組みを紹介します。

カレント HEAD、すなわちカレント ブランチのシンボル名を取得します。

curr_branch=$(git rev-parse --abbrev-ref HEAD);

カレント ブランチがポイントしているリモートを取得します。

curr_remote=$(git config branch.$curr_branch.remote);

このリモートのマージ先となるブランチを取得します (最後のフォワード スラッシュ [ / ] 以前のすべてを削除する UNIX のちょっとした技を使っています)。

curr_merge_branch=$(git config branch.$curr_branch.merge | cut -d / -f 3);

これで先行しているコミットと遅れているコミットの数を収集するのに必要な材料が揃いました。

git rev-list --left-right --count $curr_branch...$curr_remote/$curr_merge_branch | tr -s '\t' '|';

昔ながらの Unix の tr を使用して、TAB をセパレーターの | に変換しています。

git upstream の使用を開始する


これは git upstream の基本的なウォークスルーです。git upstream のセット アップ、新しいブランチの作成、変更の収集、git fork での公開の方法や、リモート ブランチから先行/遅延しているコミット数に関する便利なヒントです。

Bitbucket Server にはフォーク同期が含まれており、これにより、基本的に、開発者はフォークを最新の状態に保つというすべての負担から解放されます。また、Bitbucket Cloud には簡単な 1 ステップの同期機能があります。是非ご確認ください!

DVCS を使いこなす方法について詳しくは、@durdn で私、または @Bitbucket チームをフォローしてください。

Nicola Paolucci

Nicola is an all-round hacker who loves exploring and teaching bleeding edge technologies. He writes and talks about Git, development workflows, code collaboration and more recently about Docker. Prior to his current role as Developer Instigator at Atlassian he led software teams, built crowd sourcing applications for geo-spacial data, worked on huge e-commerce deployments. Little known facts about Nicola: he gesticulates a lot while speaking (being Italian), lives in Amsterdam and rides a Ducati.


この記事を共有する
次のトピック

おすすめコンテンツ

次のリソースをブックマークして、DevOps チームのタイプに関する詳細や、アトラシアンの DevOps についての継続的な更新をご覧ください。

一面のツールを使ってコラボレーションしている人たち

Bitbucket ブログ

DevOps のイラスト

DevOps ラーニング パス

Demo Den アトラシアン・エキスパートによる機能デモ

Bitbucket Cloud が、Atlassian Open DevOps とどのように連携するか

DevOps ニュースレター購読

Thank you for signing up