Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 16703] ファイルの概要

このコミットは、Goコマンドラインツール(cmd/go)におけるGitリポジトリのチェックアウト処理に関する修正です。具体的には、デフォルトブランチをチェックアウトする際のコマンドが origin/master から master へと変更されています。

コミット

commit a44009ca78b26ffc7ecda006131c424b3e7d9075
Author: David Symonds <dsymonds@golang.org>
Date:   Wed Jul 3 11:56:02 2013 +1000

    cmd/go: git checkout the correct default branch.
    
    origin/master is always a remote branch, and it doesn't make sense to
    switch to a remote branch. master is the default branch that tracks it.
    
    R=adg
    CC=golang-dev, matt.jibson
    https://golang.org/cl/10869046

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/a44009ca78b26ffc7ecda006131c424b3e7d9075

元コミット内容

cmd/go: git checkout the correct default branch.

origin/master is always a remote branch, and it doesn't make sense to
switch to a remote branch. master is the default branch that tracks it.

R=adg
CC=golang-dev, matt.jibson
https://golang.org/cl/10869046

変更の背景

この変更は、cmd/go ツールがGitリポジトリを扱う際に、デフォルトブランチを正しくチェックアウトできるようにするために行われました。以前の実装では、デフォルトブランチとして origin/master を直接チェックアウトしようとしていました。しかし、origin/master はリモート追跡ブランチであり、ローカルで直接チェックアウトして作業する対象ではありません。Gitの一般的なワークフローでは、リモート追跡ブランチ origin/master を追跡するローカルブランチ master をチェックアウトするのが正しい挙動です。

この誤ったチェックアウトコマンドは、go get コマンドなどでGitリポジトリからソースコードを取得する際に問題を引き起こす可能性がありました。例えば、リポジトリをクローンした直後に origin/master をチェックアウトしようとすると、Gitは「リモートブランチを直接チェックアウトすることはできない」というエラーを返すか、または「detached HEAD」状態になり、ユーザーが意図しない挙動となる可能性がありました。

このコミットは、このような問題を解消し、cmd/go がGitリポジトリをより適切に扱えるようにするための修正です。

前提知識の解説

Gitにおけるブランチとリモート追跡ブランチ

Gitには、コードの異なるバージョンや開発の流れを管理するための「ブランチ」という概念があります。

  • ローカルブランチ: 開発者が自分のローカルリポジトリ内で作成し、直接作業を行うブランチです。例えば、masterdevelopfeature/xyz などがあります。
  • リモートリポジトリ: GitHubやGitLabなどのサーバー上に存在するリポジトリです。他の開発者とコードを共有するために使用されます。
  • リモート追跡ブランチ: リモートリポジトリ上のブランチのローカルでの表現です。これらは origin/masterorigin/develop のように、通常 リモート名/ブランチ名 の形式で命名されます。リモート追跡ブランチは、リモートリポジトリのブランチの最新の状態を反映していますが、これらは直接チェックアウトして作業するものではありません。これらは、ローカルブランチがリモートブランチの変更を追跡するための参照点として機能します。
  • git checkout コマンド: 指定されたブランチ、タグ、またはコミットに作業ツリーを切り替えるために使用されます。ローカルブランチ名を指定すると、そのブランチに切り替わり、そのブランチの最新のコミットが作業ディレクトリに反映されます。リモート追跡ブランチを直接指定すると、通常は「detached HEAD」状態になります。これは、特定のコミットを直接参照している状態であり、その状態でコミットを作成すると、どのブランチにも属さないコミットが作成されることになります。

go get コマンド

go get はGo言語のパッケージ管理ツールの一部であり、指定されたGoパッケージのソースコードをダウンロードし、依存関係を解決し、必要に応じてビルドするコマンドです。Gitリポジトリからパッケージを取得する場合、go get は内部的にGitコマンドを呼び出してリポジトリをクローンし、適切なブランチやタグをチェックアウトします。このコミットは、その内部的なGit操作の一部を修正しています。

技術的詳細

このコミットは、Goのソースコード管理システム(VCS)の抽象化レイヤーである src/cmd/go/vcs.go ファイル内の vcsGit 構造体の定義を変更しています。

vcsGit 構造体は、Gitリポジトリを操作するためのコマンドテンプレートを保持しています。この構造体には、タグの同期に関連する2つのフィールドがあります。

  • tagSyncCmd: 特定のタグをチェックアウトするためのコマンドテンプレート。これは checkout {tag} と定義されており、例えば git checkout v1.0.0 のように使用されます。
  • tagSyncDefault: デフォルトでチェックアウトするブランチまたはタグを指定するフィールド。このコミットの変更点はこのフィールドにあります。

変更前は、tagSyncDefault"checkout origin/master" と設定されていました。これは、go get がGitリポジトリをクローンした際に、デフォルトで git checkout origin/master を実行しようとすることを意味します。前述の通り、origin/master はリモート追跡ブランチであり、直接チェックアウトするべきではありません。

このコミットでは、tagSyncDefault の値が "checkout master" に変更されました。これにより、go get はデフォルトで git checkout master を実行するようになります。master は通常、origin/master を追跡するローカルブランチであり、開発者が作業を行うための適切なブランチです。この変更により、go get はGitリポジトリをより自然で期待される方法で扱うことができるようになります。

コアとなるコードの変更箇所

変更は src/cmd/go/vcs.go ファイルの1箇所のみです。

--- a/src/cmd/go/vcs.go
+++ b/src/cmd/go/vcs.go
@@ -102,7 +102,7 @@ var vcsGit = &vcsCmd{
 	\t\t{\"show-ref tags/{tag} origin/{tag}\", `((?:tags|origin)/\\S+)$`},\
 	},\
 	\ttagSyncCmd:     \"checkout {tag}\",\
-\t\ttagSyncDefault: \"checkout origin/master\",\
+\t\ttagSyncDefault: \"checkout master\",\
 \
 \tscheme:  []string{\"git\", \"https\", \"http\", \"git+ssh\"},\
 \tpingCmd: \"ls-remote {scheme}://{repo}\",

コアとなるコードの解説

上記の差分が示すように、vcsGit 構造体の tagSyncDefault フィールドの値が変更されています。

  • 変更前: tagSyncDefault: "checkout origin/master"
    • これは、Gitリポジトリのデフォルトブランチをチェックアウトする際に、git checkout origin/master というコマンドが実行されることを意味していました。
  • 変更後: tagSyncDefault: "checkout master"
    • これは、Gitリポジトリのデフォルトブランチをチェックアウトする際に、git checkout master というコマンドが実行されることを意味します。

この修正により、cmd/go はGitの標準的なワークフローに沿って、リモート追跡ブランチではなく、そのリモート追跡ブランチを追跡するローカルブランチをデフォルトでチェックアウトするようになります。これにより、go get コマンドがGitリポジトリを扱う際の堅牢性と正確性が向上しました。

関連リンク

参考にした情報源リンク