回答:
-f
オプションを使用してgit tag
:
-f
--force
Replace an existing tag with the given name (instead of failing)
-f
と一緒に使用して-a
、注釈の付いていないタグの代わりに注釈付きのタグを強制的に作成することをお勧めします。
プッシュする前にリモコンのタグを削除してください
git push origin :refs/tags/<tagname>
最新のコミットを参照するようにタグを置き換えます
git tag -fa <tagname>
タグをリモートの原点にプッシュする
git push origin master --tags
:refs/tag/<tagname>
する必要があります:refs/tags/<tagname>
。
git push -f origin <tagname>
リモートが呼び出されorigin
、master
ブランチで作業している場合をまとめると:
git tag -d <tagname>
git push origin :refs/tags/<tagname>
git tag <tagname> <commitId>
git push origin <tagname>
また、4行目を交換git push origin --tags
して、ローカルの変更からすべての変更をタグでプッシュすることもできます。
@ stuart-golodetz、@ greg-hewgill、@ eedeep、@ ben-hockingの回答、回答の下のコメント、私の回答の下のNateSコメントに基づいています。
で削除git tag -d <tagname>
してから、正しいコミットで再作成してください。
Gitを使用するときは、いくつかのことを回避しようとします。
内部の知識、例えばrefs / tagsの使用。文書化されたGitコマンドのみを使用し、.gitディレクトリの内部コンテンツの知識を必要とするものは使用しないようにします。(つまり、私はGitをGitユーザーとして扱い、Git開発者として扱いません。)
不要な場合の力の使用。
やりすぎ。(ブランチや多数のタグをプッシュして、必要な場所に1つのタグを取得します。)
そこで、Gitの内部についての知識がなくても、ローカルとリモートの両方でタグを変更するための非暴力的な解決策を紹介します。
最終的にソフトウェア修正に問題があり、更新/再リリースする必要がある場合に使用します。
git tag -d fix123 # delete the old local tag
git push github :fix123 # delete the old remote tag (use for each affected remote)
git tag fix123 790a621265 # create a new local tag
git push github fix123 # push new tag to remote (use for each affected remote)
github
はサンプルのリモート名、fix123
はサンプルのタグ名、790a621265
サンプルのコミットです。
もう1つの方法:
リモートリポジトリのタグを移動します(必要に応じてHEADを他のリポジトリに置き換えます)。
$ git push --force origin HEAD:refs/tags/v0.0.1.2
変更を取り戻します。
$ git fetch --tags
1つのタグを別のコミットに移動するエイリアス。
サンプルで、ハッシュe2ea1639を使用してコミットを移動するには、次のようにします。 git tagm v0.1 e2ea1639
。
プッシュされたタグには、 git tagmp v0.1 e2ea1639
。
どちらのエイリアスも元の日付とメッセージを保持します。使用する場合git tag -d
と、元のメッセージが失われます。
それらを.gitconfig
ファイルに保存します
# Return date of tag. (To use in another alias)
tag-date = "!git show $1 | awk '{ if ($1 == \"Date:\") { print substr($0, index($0,$3)) }}' | tail -2 | head -1 #"
# Show tag message
tag-message = "!git show $1 | awk -v capture=0 '{ if(capture) message=message\"\\n\"$0}; BEGIN {message=\"\"}; { if ($1 == \"Date:\" && length(message)==0 ) {capture=1}; if ($1 == \"commit\" ) {capture=0} }; END { print message }' | sed '$ d' | cat -s #"
### Move tag. Use: git tagm <tagname> <newcommit>
tagm = "!GIT_TAG_MESSAGE=$(git tag-message $1) && GIT_COMMITTER_DATE=$(git tag-date $1) && git tag-message $1 && git tag -d $1 && git tag -a $1 $2 -m \"$GIT_TAG_MESSAGE\" #"
### Move pushed tag. Use: git tagmp <tagname> <newcommit>
tagmp = "!git tagm $1 $2 && git push --delete origin $1 && git push origin $1 #"
注釈付きタグを移動したい場合は、ターゲットのコミットのみを変更し、注釈メッセージとその他のメタデータは保持します。
moveTag() {
local tagName=$1
# Support passing branch/tag names (not just full commit hashes)
local newTarget=$(git rev-parse $2^{commit})
git cat-file -p refs/tags/$tagName |
sed "1 s/^object .*$/object $newTarget/g" |
git hash-object -w --stdin -t tag |
xargs -I {} git update-ref refs/tags/$tagName {}
}
使用法:moveTag <tag-to-move> <target>
上記の関数は、teerapap / git-move-annotated-tag.shを参照して開発されました。
git tag -f -a my_tag
すでに前のメッセージのメッセージを保持しています(gitバージョン2.11.0)。
git push origin :refs/tag/<tagname>
次に、を実行git tag -fa <tagname>
しgit push origin master --tags
ます。そうしないと、リモートのrefsリストに^と{}文字が追加されて、奇妙なものになる可能性があります。これを指摘してくれたcodebasehq.comのDanに感謝します。