web-dev-qa-db-ja.com

タグを1コミット先に移動する

ブランチが1つだけのリポジトリ(master)があります。私は私のレポへの唯一の貢献者です。

最近、ローカルおよびGitHubにプッシュされたtagを追加しました。私が最後の必要なコミットであったものを作った後、今、私はもう1つの変更/コミットを行うべきであることに気付きました。

だから私が持っているのは:

commit 124
commit 125
commit 126 <-- tag v1.0
commit 127

v1.0タグを次のコミット、つまり127にローカルおよびGitHubの両方で移動したいと思います。

どうやってやるの?

54
Gabriel

メンバー全員が同じエディションの「今週の本」を使用しないブッククラブに行ったことはありますか?悪夢ですよね?タグを移動すると、基本的に同じ状況になります。

リポジトリをプロジェクトの進捗状況を記録した本と考える場合、タグを章の見出しと考えることができます。

enter image description here

共有後にタグを別のコミットに移動することは、ブッククラブのすべての仲間に伝えるようなものです

みんな知ってる?これまでに使用してきた本の版は現在廃止されています。これは、第8章が126ページではなく128ページから始まることを単に決定したからです。

良くない。タグの移動は履歴の書き換えの一種であり、共有された履歴を書き換えるべきではありません。これは、コラボレーターを怒らせる最も確実な方法です。その上、あなたは書く

私は私のレポへの唯一の貢献者です[...]

現時点ではそうかもしれませんが、GitHubリポジトリにアクセスできる他の人(パブリックの場合など)の場合、一部の人は既にフォークまたはクローンを作成している可能性があります(ただし、 way があります)そして、あなたが歴史を書き直すならば、あなたはそれらを怒らせる危険を冒します。


とにかくそのタグを移動することを100%確信している場合、Gitはそれを許可します。ここでは、使用できます

git tag --force v1.0 <ID-of-commit-127>

そして、そのタグを強制的にプッシュする必要があります

git Push --force --tags

しかし、先に進む前に、もう一度考えてください...

補遺(2018/09/26)

私は答えを再検討する必要があると感じています...

長年にわたり、一部の人々は、すでに公開されているタグを移動しないという私の差し止め命令に対するコメントに反対しています。もちろん、このアドバイスは普遍的なものではなく、文脈的なものです。公開されたタグを移動するための良いケースが存在することを疑いません。ただし、公開されたタグを移動する決定は、原則として慎重にかつ細心の注意を払って行われるべきであるという信念に固執しています。

最近の例が思い浮かびます。 Go 1.11は、バージョン管理のためにGitタグに大きく依存する モジュールシステム の実験的サポートを追加しました。 (GitHubで)公開されているGoモジュールでタグを移動すると、悲惨な結果が生じます。

そうすることで、Goのモジュールシステムが提供しようとしている保証を無効にするため、あなた(モジュールの作者)とユーザー(あなたのモジュールに依存する人)との間に確立された契約を破ります。

モジュールは、正確な依存関係の要件を記録し、再現可能なビルドを作成します。

それは人々を怒らせる1つの確実な方法です。

この例は、少なくともいくつかのケースでは、公開されたタグを不注意に移動してはならないことを納得させるのに十分かもしれません。ケースを休ませます。

115
jub0bs

タグの移動は、Gitの高度に分散された性質により問題を引き起こす可能性があるため、一般的には推奨されません。考慮してください:

  • コミット時にタグv1.0をプッシュabcd123
  • あなたの相棒、フレッドと呼んで、フェッチ
  • Fredはv1.0にローカルabcd123タグを追加しました
  • タグv1.0を移動してcccc222をコミットし、プッシュします
  • 次のことが起こります。
    • Fredはフェッチしますが、サーバー上のv1.0タグはローカルのv1.0タグと一致しないため、Fredは何もせずに手動でこの競合を修正する必要があります
    • フレッドは、--tagsオプションでプッシュして、作成した新しいタグsome-tagを追加します。ローカルのv1.0タグとサーバーのv1.0タグが一致しないため、このプッシュはサーバーによって拒否されます

3人以上の開発者では、これはさらに複雑になります。 1人でも自分のローカルタグを更新する手順を踏まない場合は、 行の下のトラブル を取得できます。

タグを移動したいという確信がある場合(おそらくこれは1つの開発者プロジェクトであるか、他の人がタグを取得していないか、他のすべての開発者と通信して、彼らはローカルタグを更新します)あなたはこのような何かをすることができます:

git tag -a -f v1.0 <new-commit-hash>
git Push --tags --force

他の開発者は、タグのローカルコピーを削除して新しいタグを取得することをお勧めします。

git tag -d v1.0
git fetch --tags
20
Chris

タグを削除してから再作成することもできますが、これには履歴の書き換えは必要ありません。
(番号 Push --force

ローカルおよびリモートを削除する

git tag -d <tag_name>
git Push Origin :refs/tags/<tag_name>

再作成

git tag <tag_name>
git Push --tags
1
Jonas Marty