-
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 スマート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ツール
- 7.1 リビジョンの選択
- 7.2 インタラクティブステージング
- 7.3 スタッシュとクリーン
- 7.4 作業に署名する
- 7.5 検索
- 7.6 履歴の書き換え
- 7.7 Resetの解明
- 7.8 高度なマージ
- 7.9 Rerere
- 7.10 Gitを使ったデバッグ
- 7.11 サブモジュール
- 7.12 バンドル
- 7.13 置換
- 7.14 認証情報の保存
- 7.15 まとめ
-
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の内側
- 10.1 PlumbingとPorcelain
- 10.2 Gitオブジェクト
- 10.3 Gitリファレンス
- 10.4 Packfile
- 10.5 Refspec
- 10.6 転送プロトコル
- 10.7 メンテナンスとデータ復旧
- 10.8 環境変数
- 10.9 まとめ
-
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 Plumbingコマンド
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」は特別ではない
Gitにおいて、ブランチ名「master」が特別な意味を持たないのと同様に、「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) 1つのリモート上の名前に正確に一致する場合、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コミット「先行」していることがわかります。これは、ローカルに2つのコミットがあり、まだサーバーにプッシュされていないことを意味します。また、master
ブランチはorigin/master
を追跡しており、最新であることもわかります。次に、serverfix
ブランチがteamone
サーバー上のserver-fix-good
ブランチを追跡しており、3コミット先行し、1コミット遅れていることがわかります。これは、まだマージされていないサーバー上の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サーバーは、ガベージコレクションが実行されるまでデータをしばらく保持するため、誤って削除された場合でも、多くの場合簡単に回復できます。