私はマスターブランチにv0.1
というタグをこのように作成しました。
git tag -a v0.1
しかし、その後、リリース0.1のためにmasterにマージするために必要な変更がまだいくつかあることに気付いたので、それを行いました。しかし、今度は私のv0.1
タグが(ポストイットメモを呼び出すために)間違ったコミットで動かなくなります。私はそれがmasterの最新のコミットに固執したいのですが、代わりにmasterの2番目に最近のコミットに固執します。
どうすれば最新のmasterコミットに移動できますか?
-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>
タグをリモートのOriginにプッシュする
git Push Origin master --tags
もっと正確に言えば、あなたはタグの追加を強制しなければならず、そしてオプション--tagsと-fでプッシュする:
git tag -f -a <tagname>
git Push -f --tags
あなたのリモコンが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を使うとき、私はいくつかのことを避けようとします。
内部の知識を使う参照/タグ文書化されたGitコマンドのみを使用し、.gitディレクトリの内部の内容に関する知識が必要なものは使用しないようにします。 (つまり、GitはGit開発者ではなくGitユーザーとして扱います。)
必要でないときは力を加えないでください。
そのため、Git内部の知識がなくても、ローカルとリモートの両方でタグを変更するための私の非暴力的な解決策があります。
ソフトウェアの修正に最終的に問題があり、更新または再リリースが必要な場合に使用します。
git tag -d fix123 # delete the old local tag
git Push github :fix123 # delete the old remote tag (use for each remote)
git tag fix123 790a621265 # create a new local tag
git Push github fix123 # Push new tag to remote (use for each remote)
github
はサンプルリモート名、fix123
はサンプルタグ名、そして790a621265
はサンプルコミットです。
私のニーズに合った、このコマンドの別の形式をここに残します。
移動したいタグv0.0.1.2
がありました。
$ git tag -f v0.0.1.2 63eff6a
Updated tag 'v0.0.1.2' (was 8078562)
その後:
$ git Push --tags --force
あるタグを別のコミットに移動するための別名。
あなたのサンプルでは、ハッシュ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 #"
もう一つの方法:
リモートリポジトリでタグを移動します(必要に応じてHEADを他のものに置き換えます)。
$ git Push --force Origin HEAD:refs/tags/v0.0.1.2
変更を取り戻します。
$ git fetch --tags
注釈付きタグを移動したい場合は、ターゲットを絞ったコミットだけを変更し、注釈メッセージと他のメタデータを保存したままにします。
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 <タグ - 移動> <ターゲット>
上記の関数は teerapap/git-move-annotated-tag.sh を参照して開発されました。