-
1. Gitの準備
- 1.1 バージョン管理について
- 1.2 Gitの短い歴史
- 1.3 Gitとは何か?
- 1.4 コマンドライン
- 1.5 Gitのインストール
- 1.6 Gitの初回セットアップ
- 1.7 ヘルプの取得
- 1.8 まとめ
-
2. Gitの基本
- 2.1 Gitリポジトリの取得
- 2.2 リポジトリへの変更の記録
- 2.3 コミット履歴の表示
- 2.4 元に戻す
- 2.5 リモートの利用
- 2.6 タグ付け
- 2.7 Gitエイリアス
- 2.8 まとめ
-
3. Gitブランチ
- 3.1 ブランチとは
- 3.2 基本的なブランチとマージ
- 3.3 ブランチ管理
- 3.4 ブランチワークフロー
- 3.5 リモートブランチ
- 3.6 リベース
- 3.7 まとめ
-
4. サーバー上のGit
- 4.1 プロトコル
- 4.2 サーバー上でのGitの利用
- 4.3 SSH公開鍵の生成
- 4.4 サーバーのセットアップ
- 4.5 Gitデーモン
- 4.6 Smart HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 サードパーティのホスティングオプション
- 4.10 まとめ
-
5. 分散Git
- 5.1 分散ワークフロー
- 5.2 プロジェクトへの貢献
- 5.3 プロジェクトの管理
- 5.4 まとめ
-
6. GitHub
- 6.1 アカウントのセットアップと設定
- 6.2 プロジェクトへの貢献
- 6.3 プロジェクトの管理
- 6.4 組織の管理
- 6.5 GitHubのスクリプト化
- 6.6 まとめ
-
7. Gitツール
-
8. Gitのカスタマイズ
- 8.1 Gitの設定
- 8.2 Git属性
- 8.3 Gitフック
- 8.4 Gitによるポリシー適用例
- 8.5 まとめ
-
9. Gitと他のシステム
- 9.1 クライアントとしてのGit
- 9.2 Gitへの移行
- 9.3 まとめ
-
10. Gitの内側
-
A1. 付録A: 他の環境でのGit
- A1.1 グラフィカルインターフェース
- A1.2 Visual StudioでのGit
- A1.3 Visual Studio CodeでのGit
- A1.4 IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMineでのGit
- A1.5 Sublime TextでのGit
- A1.6 BashでのGit
- A1.7 ZshでのGit
- A1.8 PowerShellでのGit
- A1.9 まとめ
-
A2. 付録B: アプリケーションへのGitの組み込み
- A2.1 コマンドラインGit
- A2.2 Libgit2
- A2.3 JGit
- A2.4 go-git
- A2.5 Dulwich
-
A3. 付録C: Gitコマンド
- A3.1 セットアップと設定
- A3.2 プロジェクトの取得と作成
- A3.3 基本的なスナップショット
- A3.4 ブランチとマージ
- A3.5 プロジェクトの共有と更新
- A3.6 検査と比較
- A3.7 デバッグ
- A3.8 パッチ適用
- A3.9 メール
- A3.10 外部システム
- A3.11 管理
- A3.12 配管コマンド
3.5 Gitブランチ - リモートブランチ
リモートブランチ
リモートリファレンスとは、リモートリポジトリ内のブランチやタグなどを含む参照(ポインタ)のことです。git ls-remote <remote>
コマンドを使用するか、git remote show <remote>
コマンドでリモートブランチに関する詳細情報を明示的に取得することで、リモートリファレンスの完全なリストを取得できます。しかし、より一般的な方法は、リモートトラッキングブランチを利用することです。
リモートトラッキングブランチは、リモートブランチの状態への参照です。これらは、あなたが動かすことのできないローカルな参照であり、Gitがネットワーク通信を行うたびに、リモートリポジトリの状態を正確に反映するように自動的に移動させます。リモートリポジトリのブランチが最後に接続したときにどこにあったかを思い出させるブックマークだと考えてください。
リモートトラッキングブランチの名前は<remote>/<branch>
の形式を取ります。例えば、最後に通信した時点でのorigin
リモート上のmaster
ブランチがどのような状態だったかを確認したい場合は、origin/master
ブランチをチェックします。パートナーとある課題に取り組んでいて、彼らがiss53
ブランチをプッシュした場合、あなたは自分自身のローカルなiss53
ブランチを持っているかもしれませんが、サーバー上のブランチはリモートトラッキングブランチのorigin/iss53
によって表されます。
これは少し分かりにくいかもしれませんので、例を見てみましょう。あなたのネットワーク上にgit.ourcompany.com
というGitサーバーがあるとします。ここからクローンすると、Gitのclone
コマンドは自動的にそれをorigin
と名付け、すべてのデータをダウンロードし、そのmaster
ブランチがある場所へのポインタを作成し、ローカルでorigin/master
と名付けます。また、Gitはorigin
のmaster
ブランチと同じ場所から始まるあなた自身のローカルなmaster
ブランチを作成するので、そこから作業を開始できます。
注記
|
「origin」は特別ではない
ブランチ名「master」がGitにおいて特別な意味を持たないのと同様に、「origin」も特別な意味を持ちません。「master」が |

ローカルのmaster
ブランチで作業をしている間に、他の誰かがgit.ourcompany.com
にプッシュしてそのmaster
ブランチを更新した場合、あなたの履歴は異なる形で進んでいきます。また、origin
サーバーとの連絡を取らない限り、あなたのorigin/master
ポインタは移動しません。

特定のリモートと作業を同期するには、git fetch <remote>
コマンド(この場合はgit fetch origin
)を実行します。このコマンドは、「origin」がどのサーバーであるか(この場合はgit.ourcompany.com
)を調べ、まだ持っていないデータをすべてフェッチし、ローカルデータベースを更新して、origin/master
ポインタを新しい、より最新の位置に移動させます。

git fetch
はリモートトラッキングブランチを更新する複数のリモートサーバーがある場合や、それらのリモートプロジェクトのリモートブランチがどのように見えるかを示すために、スプリントチームの1つが開発専用に使用する別の社内Gitサーバーがあると仮定しましょう。このサーバーはgit.team1.ourcompany.com
にあります。Gitの基本で説明したように、git remote add
コマンドを実行して、現在作業しているプロジェクトに新しいリモート参照として追加できます。このリモートをteamone
と名付けます。これがそのURL全体のショートネームになります。

これで、git fetch teamone
を実行して、リモートのteamone
サーバーが持っているまだあなたが持っていないものをすべてフェッチできます。このサーバーは現在、あなたのorigin
サーバーが持っているデータの一部しか持っていないため、Gitはデータをフェッチしませんが、teamone/master
というリモートトラッキングブランチを設定し、teamone
がmaster
ブランチとして持っているコミットを指すようにします。

teamone/master
のリモートトラッキングブランチプッシュ
ブランチを公開したい場合は、書き込みアクセス権のあるリモートにプッシュする必要があります。ローカルブランチは、書き込み先のリモートに自動的に同期されません。共有したいブランチを明示的にプッシュする必要があります。そうすることで、共有したくない作業にはプライベートブランチを使用し、共同作業したいトピックブランチだけをプッシュできます。
他の人と共同で作業したいserverfix
というブランチがある場合、最初のブランチをプッシュしたのと同じ方法でプッシュできます。git push <remote> <branch>
を実行します。
$ git push origin serverfix
Counting objects: 24, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (15/15), done.
Writing objects: 100% (24/24), 1.91 KiB | 0 bytes/s, done.
Total 24 (delta 2), reused 0 (delta 0)
To https://github.com/schacon/simplegit
* [new branch] serverfix -> serverfix
これは少しショートカットです。Gitは自動的にserverfix
ブランチ名をrefs/heads/serverfix:refs/heads/serverfix
に展開します。これは「私のローカルのserverfix
ブランチを取り込み、それをプッシュしてリモートのserverfix
ブランチを更新する」という意味です。refs/heads/
の部分については、Gitの内側で詳しく説明しますが、通常は省略できます。また、git push origin serverfix:serverfix
とすることもでき、これは同じことを行います。つまり「私のserverfixを取り込み、それをリモートのserverfixにする」という意味です。この形式を使用して、ローカルブランチを異なる名前のリモートブランチにプッシュできます。もしリモートでserverfix
と呼ばれたくない場合は、代わりにgit push origin serverfix:awesomebranch
を実行して、ローカルのserverfix
ブランチをリモートプロジェクトのawesomebranch
ブランチにプッシュできます。
注記
|
毎回パスワードを入力しない
HTTPS URLを使用してプッシュする場合、Gitサーバーは認証のためにユーザー名とパスワードを求めます。デフォルトでは、この情報はターミナルでプロンプトとして表示され、サーバーがプッシュを許可するかどうかを判断できるようになります。 プッシュするたびにパスワードを入力したくない場合は、「クレデンシャルキャッシュ」を設定できます。最も簡単な方法は、数分間メモリに保持することであり、これは 利用可能なさまざまなクレデンシャルキャッシュオプションの詳細については、認証情報の保存を参照してください。 |
次に共同作業者の誰かがサーバーからフェッチすると、リモートブランチorigin/serverfix
の下に、サーバーのserverfix
バージョンがある場所への参照を取得します。
$ git fetch origin
remote: Counting objects: 7, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 3 (delta 0)
Unpacking objects: 100% (3/3), done.
From https://github.com/schacon/simplegit
* [new branch] serverfix -> origin/serverfix
新しいリモートトラッキングブランチをフェッチして取得しても、そのブランチのローカルで編集可能なコピーが自動的に作成されるわけではない点に注意することが重要です。言い換えれば、この場合、新しいserverfix
ブランチは持っておらず、変更できないorigin/serverfix
ポインタのみを持っていることになります。
この作業を現在の作業ブランチにマージするには、git merge origin/serverfix
を実行します。もし自分で作業できるserverfix
ブランチが欲しい場合は、リモートトラッキングブランチをベースに作成できます。
$ git checkout -b serverfix origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Switched to a new branch 'serverfix'
これにより、origin/serverfix
がある場所から始まる、作業可能なローカルブランチが得られます。
トラッキングブランチ
リモートトラッキングブランチからローカルブランチをチェックアウトすると、自動的に「トラッキングブランチ」が作成されます(そして、それが追跡するブランチは「アップストリームブランチ」と呼ばれます)。トラッキングブランチは、リモートブランチと直接的な関係を持つローカルブランチです。トラッキングブランチにいてgit pull
と入力すると、Gitはどのサーバーからフェッチし、どのブランチをマージするかを自動的に認識します。
リポジトリをクローンすると、通常は自動的にorigin/master
を追跡するmaster
ブランチが作成されます。しかし、必要であれば他のトラッキングブランチを設定することもできます。他のリモートのブランチを追跡するものや、master
ブランチを追跡しないものなどです。簡単なケースは、先ほど見たgit checkout -b <branch> <remote>/<branch>
を実行する例です。これは非常に一般的な操作なので、Gitは--track
という短縮形を提供しています。
$ git checkout --track origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Switched to a new branch 'serverfix'
実際、これは非常に一般的なので、そのショートカットのさらにショートカットがあります。チェックアウトしようとしているブランチ名が(a)存在せず、(b)唯一のリモート上の名前と完全に一致する場合、Gitは自動的にトラッキングブランチを作成します。
$ git checkout serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Switched to a new branch 'serverfix'
リモートブランチとは異なる名前でローカルブランチを設定するには、最初のバージョンを異なるローカルブランチ名で簡単に使用できます。
$ git checkout -b sf origin/serverfix
Branch sf set up to track remote branch serverfix from origin.
Switched to a new branch 'sf'
これで、ローカルブランチsf
は自動的にorigin/serverfix
からプルするようになります。
すでにローカルブランチがあり、それをプルダウンしたばかりのリモートブランチに設定したい場合、または追跡しているアップストリームブランチを変更したい場合は、いつでもgit branch
の-u
または--set-upstream-to
オプションを使用して明示的に設定できます。
$ git branch -u origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
注記
|
アップストリームの短縮形
トラッキングブランチを設定している場合、 |
設定されているトラッキングブランチを確認したい場合は、git branch
に-vv
オプションを使用します。これにより、各ブランチが何を追跡しているか、ローカルブランチが先行しているか、遅れているか、またはその両方かを含む詳細情報とともに、ローカルブランチが一覧表示されます。
$ git branch -vv
iss53 7e424c3 [origin/iss53: ahead 2] Add forgotten brackets
master 1ae2a45 [origin/master] Deploy index fix
* serverfix f8674d9 [teamone/server-fix-good: ahead 3, behind 1] This should do it
testing 5ea463a Try something new
したがって、ここでiss53
ブランチがorigin/iss53
を追跡しており、2つのコミットが「ahead」(先行)していることがわかります。これは、まだサーバーにプッシュされていないコミットがローカルに2つあることを意味します。また、master
ブランチがorigin/master
を追跡しており、最新の状態であることがわかります。次に、serverfix
ブランチがteamone
サーバーのserver-fix-good
ブランチを追跡しており、3つ「ahead」で1つ「behind」(遅延)していることがわかります。これは、まだマージされていないサーバー上のコミットが1つあり、まだプッシュされていないローカルコミットが3つあることを意味します。最後に、testing
ブランチがどのリモートブランチも追跡していないことがわかります。
これらの数値は、各サーバーから最後にフェッチしてからのものである点に注意することが重要です。このコマンドはサーバーにアクセスするわけではなく、これらのサーバーからローカルにキャッシュされている情報について教えてくれます。完全に最新の先行・遅延の数値を知りたい場合は、このコマンドを実行する直前にすべてのリモートからフェッチする必要があります。それは次のように実行できます。
$ git fetch --all; git branch -vv
プル
git fetch
コマンドは、まだ持っていないサーバー上のすべての変更をフェッチしますが、作業ディレクトリを一切変更しません。単にデータを取得し、自分でマージできるようにするだけです。しかし、git pull
というコマンドがあり、これはほとんどの場合、git fetch
の直後にgit merge
が続くものです。前のセクションで示したように、明示的に設定したか、clone
またはcheckout
コマンドによって作成されたトラッキングブランチがある場合、git pull
は現在のブランチが追跡しているサーバーとブランチを調べ、そのサーバーからフェッチし、そのリモートブランチをマージしようとします。
リモートブランチの削除
リモートブランチの作業が完了したとします。つまり、あなたと共同作業者が機能の作業を終え、それをリモートのmaster
ブランチ(または安定したコードラインがある任意のブランチ)にマージしたとします。リモートブランチは、git push
の--delete
オプションを使用して削除できます。サーバーからserverfix
ブランチを削除したい場合は、以下を実行します。
$ git push origin --delete serverfix
To https://github.com/schacon/simplegit
- [deleted] serverfix
基本的には、サーバーからポインタを削除するだけです。Gitサーバーは通常、ガベージコレクションが実行されるまでデータをしばらく保持するため、誤って削除された場合でも、多くの場合簡単に回復できます。