web-dev-qa-db-ja.com

特定のコミットでタグを作成し、元にプッシュするにはどうすればよいですか?

私のgerritの現在のログは次のようになっているとします:

  • commit10(マスター)
  • commit9
  • コミット8
  • commit7
  • commit6 v1.72.0
  • commit5
  • commit4 v1.71.0
  • commit3
  • commit2
  • commit1

私の目標は、commit8とcommit9を含む新しいタグ(v1.73.0)を作成し、Originにプッシュすることです。最新の安定したタグに基づいて新しいローカルブランチを作成し、必要なコミットをチェリーピックしてタグ付けするように言われました。ただし、タグをマスターにプッシュするのに問題があります。

私がやったことは次のとおりです。

  • 最新のタグに基づいてローカルブランチを作成します:git checkout -b branchforv1.73.0 v1.72.0
  • cherry-pick commit8およびcommit9
  • 新しいタグを作成:git tag v1.73.0

...では、v1.73.0をマスターにプッシュするにはどうすればよいですか?

結果:

  • commit10(マスター)
  • commit7
  • commit9 v1.73.0
  • コミット8
  • commit6 v1.72.0
  • commit5
  • commit4 v1.71.0
  • commit3
  • commit2
  • commit1
21
aznmunkey

タグの仕組み

Gitでは、各タグは(1つの、単一の)コミットを「指す」と言われます。実際、ブランチについても同じことが言えます。ブランチ名alsoは1つのコミットを指しているだけです。

この機能を実現しているのは、次の2つのことです。

  • 各コミットは別のコミット(または複数のコミット)も指します。
  • ブランチの場合(およびonlyブランチの場合)、ブランチが指すコミットは自動的に「前方に移動」します。つまり、新しいコミットを追加するとき、いくつかの方法で、それはほとんどすべてgitが行います。古いStar Trek TNGシリーズのBorgのような集合に新しいコミットを追加します。新しいコミットを指すように再調整されます。

したがって、ブランチとタグの主な違いは、タグが移動しないことです。

これがどのように機能するかを確認するには、3つのコミットのみを含む単純なgitリポジトリーを検討してください。これらのコミットにAB、およびCというラベルを付けましょう。最初のコミット(A)は最初のコミットであるため、何もポイントせず、ブランチmasterAをポイントします。

A   <-- master

2回目のコミットを行うと、gitはBを指すAを作成し、Bを指すようにブランチ名を進めます。

A <- B   <-- master

次に、3番目のコミットを行うと、gitは再び親コミットをポイントし、ブランチを進めます:

A <- B <- C   <-- master

ここでタグを作成すると、そのタグはデフォルトでコミットCをポイントします:

A <- B <- C   <-- master
          ^
          |
   tag: sometag

その後、新しいコミットDを作成すると、gitはbranchを進めますが、タグは進めません。

A <- B <- C <- D   <-- master
          ^
          |
   tag: sometag

特定のコミットを指すタグをいつでも作成または削除できます。

$ git tag -d sometag

タグsometagを削除します。その後:

$ git tag sometag master~2

コミットを指すsometagを追加しますB1

(タグcanが動くことを証明しました。本当の違いは、タグはexpectedではなく、ブランチはそうであるということです; gitは自動的にタグを動かしません。2 ブランチは一般に「順」方向に移動することが期待されます。つまり、masterがコミットを指すのにCを使用し、現在はコミットDを指す場合、通常はCDから開始し、逆方向に作業して見つけることができます。このルールに違反するようにブランチを移動するときはいつでも、「履歴を書き換えている」ことになります。他の記事を参照して、これで問題がなければ、いつ問題が発生するかを確認してください。)

タグを押す

git Pushを使用する場合、実際に実行しているのは、他のgitリポジトリに、使用していない新しいコミットを取得するよう指示し、いくつかの名前(通常はブランチやタグ)を設定することです。結果のコレクション内のいくつかのコミット(それぞれ1つ)を指すようにします。3 これらの名前(ブランチ、タグなど)は一般に「参照」と呼ばれますが、ここでは「ブランチ」と「タグ」を使用します。

git Pushの後の引数は、Push-toにリポジトリを指定します(一般的にはOriginなどの「リモート」名を使用)。省略すると、gitはそれを見つけようとしますが、ブランチ名またはタグ名を追加する場合は、明示的に含める必要があります。最初のWordはリモート名であると想定されるためです。 (つまり、git Push masterは、ブランチ名ではなくリモート名としてmasterを使用しようとします。)

allタグをプッシュするには、--tagsコマンドにgit Pushを追加するだけです。

git Push --tags Origin

specificタグをプッシュするには、名前を付けることができます:

git Push Origin sometag

特定のブランチをプッシュできるように:

git Push Origin master

(実際、4番目の引数はmaster:mastersometag:sometagのような名前のpairですが、ほとんどの場合、両側で同じ名前が使用されます。4

すべての引数を作成する必要がない場合は、Originという名前を省略できます。たとえば、git Push --tagsgit Push --tags Originと同じです(すべてのプッシュがOrigin、とにかく)。

それを一緒に入れて

リモートでタグを設定するには、最初にgit tag namecommit-identifierでローカルに設定します。任意のビューアを使用して、正しく設定されていることを確認してください。次に、git Push Origin nameまたはgit Push --tagsでプッシュします。


1master~2構文は、masterを介して見つかったコミットで開始し、2つのステップをバックアップするようにgitに指示します。代わりに、コミットBの生のSHA-1をここで書くことができます。

2古いバージョンのgit(1.8.4より前)は、プッシュ時に誤ってブランチルールをタグに適用しました(リモート側、つまり、「早送り」であればタグを移動させます)。

3場合によっては、名前を「注釈付きタグ」に向けることができ、名前が「ツリー」または「ブロブ」オブジェクトを指すことを妨げるものは何もありませんが、それは通常のセットアップではありません。

4実際には、ブランチのデフォルトのdst refspecは複雑です。Push.default設定、remote.repository.Push設定があるかどうか、およびアップストリームが設定されているかどうかによって異なります。など。タグの場合、「上流」のようなものがないため、ルールはより単純です。

54
torek

具体例を次に示します。

git add .
git commit -m "some description"
git tag v0.1.9 # or any other text
git Push Origin master # Push the commit
git Push --tags Origin # Push the tags
22
qed

タグを作成したら(完了したように見えます)、単に実行します

git Push --tags Origin
2
Chris