web-dev-qa-db-ja.com

gitでは、削除されたブランチと同じ名前のタグを作成するのは悪い考えですか?

nvieのgit-flow のモデルにほぼ従うgit分岐モデルのプロジェクトがあります。

私たちのリリースブランチは SemVer 形式で名前が付けられています。 v1.5.2

リリースブランチに本番用の信号が表示されたら、ブランチをマスターにマージし、タグを適用して、ブランチを削除することにより、ブランチを閉じます。

リリースブランチをすぐに削除するため、ブランチのタグ付けには同じ識別子を使用しています。 v1.5.2

リリースブランチを閉じるために使用するコマンドは次のとおりです。

$ git checkout master
$ git merge v1.5.2
$ git tag -a v1.5.2 -m "Version 1.5.2 - foo bar, baz, etc"
$ git branch -d v1.5.2
$ git branch -dr Origin/v1.5.2
$ git Push Origin :v1.5.2
$ git Push
$ git Push --tags

これはほとんどの場合に機能するようですが、gitリポジトリの別のインスタンス(別の開発マシン、ステージング環境など)がv1.5.2ブランチのローカルチェックアウトを持っているシナリオで問題を引き起こしています。

git Push Origin :v1.5.2コマンドはリモートのブランチを削除しますが、ブランチのローカルバージョン(存在する場合)はすべてのリポジトリで削除しません。

これは、チェックアウトを試みるときにあいまいな参照につながりますv1.5.2これらのリポジトリ内:

$ git checkout v1.5.2
warning: refname 'v1.5.2' is ambiguous.

これは、ブランチに別の構文を使用せずに回避できますか? release-v1.5.2、またはv1.5.2-rc

それとも避けられないので、削除されたブランチと同じ名前のタグを作成することは根本的に悪い考えですか?

21
tommarshall

この命名方式を維持したい場合は、次のようにします。

これらの警告を気にしないことを決定します

つまり、次の事実に満足したら、

  • git checkout <ref>refs/heads/<ref>よりrefs/tags/<ref>をチェックアウトします( git-checkout を参照)
  • 他のコマンドはrefs/tags/<ref>よりもrefs/heads/<ref>を使用します( gitrevisions を参照)

たとえば、このテストリポジトリでは、v1.5.2ブランチはコミットBをポイントしていますが、v1.5.2タグはコミットAをポイントしています。

% git log --oneline --decorate
8060f6f (HEAD, v1.5.2, master) commit B
0e69483 (tag: v1.5.2) commit A

git checkoutはブランチ名を優先します:

% git checkout v1.5.2
warning: refname 'v1.5.2' is ambiguous.
Switched to branch 'v1.5.2'
% git log --decorate --oneline -1
8060f6f (HEAD, v1.5.2, master) commit B

ただし、git logはタグ名を使用します。

% git log --decorate --oneline -1 v1.5.2
warning: refname 'v1.5.2' is ambiguous.
0e69483 (tag: v1.5.2) commit A

これは紛らわしいかもしれません。

新しいタグが表示されたときにローカルブランチを削除するように人々を訓練する

これは、組織の規模によっては困難/扱いにくい場合があります。

「git pull」と「git fetch」のラッパーを記述します

つまり、ブランチ名を隠すタグがあるかどうかをチェックし、それらのブランチについて警告(または削除)するラッパーを記述します。これは苦痛に聞こえ、シャドウされたブランチが現在チェックアウトされている場合は望ましくない可能性があります。

残念ながら、この問題を解決する最も簡単な方法は、ブランチの名前の付け方を変更することかもしれません。投稿したリンクでは、タグとブランチに異なる命名規則が使用されています。既にその方法をほとんど使用している場合は、その命名規則を採用するのが最も簡単な解決策です。

20
benj

フルネームを使用して、ブランチまたはタグが必要かどうかを明示的に指定できます。

 git checkout refs/heads/v1.5.2

または

git checkout refs/tags/v1.5.2
11
mastahu