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


20

私は、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

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

回答:


19

この命名方式を絶対に維持したい場合は、次のことを行うことができます。

これらの警告を気にしないと決めてください

つまり、次の事実に満足している場合:

  • git checkout <ref>チェックアウトrefs/heads/<ref>しますrefs/tags/<ref>git-checkoutを参照)
  • 他のコマンドはrefs/tags/<ref>over を使用します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」の周りにラッパーを書く

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

残念ながら、この問題を解決する最も簡単な方法は、ブランチの命名方法を変更することであると思われます。投稿したリンクでは、タグとブランチに異なる命名スキームを使用しています。すでにほとんどの方法を使用している場合は、その命名スキームを採用するのが最も簡単なソリューションかもしれません。


回答ありがとうございます。非常に役立ちます。あなたの最初の箇条書きの状態git checkout:ambigious参照がある場合、分岐上のタグをチェックアウトしますが、しかし、これは私がREF、見ている動作ではありませんgist.github.com/tommarshall/9376724。これはgitのより新しいバージョンで変更されたものですか?gitconfigこの動作を得るために設定できるフラグはありますか?
-tommarshall

あなたは正しい、私はこれを完全に間違った。ごめんなさい!答えを修正し、例を追加しました。
ベンジ14年

10

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

 git checkout refs/heads/v1.5.2

または

git checkout refs/tags/v1.5.2
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.