ブランチが1つだけのリポジトリ(master
)があります。私は私のレポへの唯一の貢献者です。
最近、ローカルおよびGitHubにプッシュされたtag
を追加しました。私が最後の必要なコミットであったものを作った後、今、私はもう1つの変更/コミットを行うべきであることに気付きました。
だから私が持っているのは:
commit 124
commit 125
commit 126 <-- tag v1.0
commit 127
v1.0
タグを次のコミット、つまり127
にローカルおよびGitHubの両方で移動したいと思います。
どうやってやるの?
メンバー全員が同じエディションの「今週の本」を使用しないブッククラブに行ったことはありますか?悪夢ですよね?タグを移動すると、基本的に同じ状況になります。
リポジトリをプロジェクトの進捗状況を記録した本と考える場合、タグを章の見出しと考えることができます。
共有後にタグを別のコミットに移動することは、ブッククラブのすべての仲間に伝えるようなものです
みんな知ってる?これまでに使用してきた本の版は現在廃止されています。これは、第8章が126ページではなく128ページから始まることを単に決定したからです。
良くない。タグの移動は履歴の書き換えの一種であり、共有された履歴を書き換えるべきではありません。これは、コラボレーターを怒らせる最も確実な方法です。その上、あなたは書く
私は私のレポへの唯一の貢献者です[...]
現時点ではそうかもしれませんが、GitHubリポジトリにアクセスできる他の人(パブリックの場合など)の場合、一部の人は既にフォークまたはクローンを作成している可能性があります(ただし、 way があります)そして、あなたが歴史を書き直すならば、あなたはそれらを怒らせる危険を冒します。
とにかくそのタグを移動することを100%確信している場合、Gitはそれを許可します。ここでは、使用できます
git tag --force v1.0 <ID-of-commit-127>
そして、そのタグを強制的にプッシュする必要があります
git Push --force --tags
しかし、先に進む前に、もう一度考えてください...
私は答えを再検討する必要があると感じています...
長年にわたり、一部の人々は、すでに公開されているタグを移動しないという私の差し止め命令に対するコメントに反対しています。もちろん、このアドバイスは普遍的なものではなく、文脈的なものです。公開されたタグを移動するための良いケースが存在することを疑いません。ただし、公開されたタグを移動する決定は、原則として慎重にかつ細心の注意を払って行われるべきであるという信念に固執しています。
最近の例が思い浮かびます。 Go 1.11は、バージョン管理のためにGitタグに大きく依存する モジュールシステム の実験的サポートを追加しました。 (GitHubで)公開されているGoモジュールでタグを移動すると、悲惨な結果が生じます。
そうすることで、Goのモジュールシステムが提供しようとしている保証を無効にするため、あなた(モジュールの作者)とユーザー(あなたのモジュールに依存する人)との間に確立された契約を破ります。
モジュールは、正確な依存関係の要件を記録し、再現可能なビルドを作成します。
それは人々を怒らせる1つの確実な方法です。
この例は、少なくともいくつかのケースでは、公開されたタグを不注意に移動してはならないことを納得させるのに十分かもしれません。ケースを休ませます。
タグの移動は、Gitの高度に分散された性質により問題を引き起こす可能性があるため、一般的には推奨されません。考慮してください:
v1.0
をプッシュabcd123
v1.0
にローカルabcd123
タグを追加しましたv1.0
を移動してcccc222
をコミットし、プッシュします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
タグを削除してから再作成することもできますが、これには履歴の書き換えは必要ありません。
(番号 Push --force
)
ローカルおよびリモートを削除する
git tag -d <tag_name>
git Push Origin :refs/tags/<tag_name>
再作成
git tag <tag_name>
git Push --tags