web-dev-qa-db-ja.com

Gitブランチのタグを別のコミットに移動するにはどうすればいいですか?

私はマスターブランチにv0.1というタグをこのように作成しました。

git tag -a v0.1

しかし、その後、リリース0.1のためにmasterにマージするために必要な変更がまだいくつかあることに気付いたので、それを行いました。しかし、今度は私のv0.1タグが(ポストイットメモを呼び出すために)間違ったコミットで動かなくなります。私はそれがmasterの最新のコミットに固執したいのですが、代わりにmasterの2番目に最近のコミットに固執します。

どうすれば最新のmasterコミットに移動できますか?

707
eedeep

-f にはgit tagオプションを使用します。

-f
--force

    Replace an existing tag with the given name (instead of failing)

注釈なしタグの代わりに注釈付きタグを強制作成するには、おそらく-f-aと一緒に使用したいでしょう。

  1. プッシュする前に、リモコンのタグを削除してください

    git Push Origin :refs/tags/<tagname>
    
  2. 最新のコミットを参照するようにタグを置き換えます

    git tag -fa <tagname>
    
  3. タグをリモートのOriginにプッシュする

    git Push Origin master --tags
    
989
Greg Hewgill

もっと正確に言えば、あなたはタグの追加を強制しなければならず、そしてオプション--tagsと-fでプッシュする:

git tag -f -a <tagname>
git Push -f --tags
234
Daniel

あなたのリモコンがOriginと呼ばれていて、あなたがmasterブランチに取り組んでいるなら、まとめると:

git tag -d <tagname>
git Push Origin :refs/tags/<tagname>
git tag <tagname> <commitId>
git Push Origin <tagname>
  • 1行目はlocal envのタグを削除します。
  • 2行目はremote envのタグを削除します。
  • 3行目は、タグを異なるコミットに追加します
  • 4行目は変更をリモートにプッシュします

4行目をgit Push Origin --tagsに交換して、ローカルの変更からのタグですべての変更をプッシュすることもできます。

@ stuart-golodetz、@ greg-hewgill、@eedeep、@ ben-hockingの回答、回答の下のコメント、および私の回答の下のNateSのコメントに基づいています。

126
Vive

git tag -d <tagname>で削除してから正しいコミットで再作成してください。

83
Stuart Golodetz

Gitを使うとき、私はいくつかのことを避けようとします。

  1. 内部の知識を使う参照/タグ文書化されたGitコマンドのみを使用し、.gitディレクトリの内部の内容に関する知識が必要なものは使用しないようにします。 (つまり、GitはGit開発者ではなくGitユーザーとして扱います。)

  2. 必要でないときは力を加えないでください。

そのため、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はサンプルコミットです。

12
user3070485

私のニーズに合った、このコマンドの別の形式をここに残します。
移動したいタグv0.0.1.2がありました。

$ git tag -f v0.0.1.2 63eff6a

Updated tag 'v0.0.1.2' (was 8078562)

その後:

$ git Push --tags --force
11
Nakilon

あるタグを別のコミットに移動するための別名。

あなたのサンプルでは、​​ハッシュ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 #"
7

もう一つの方法:

リモートリポジトリでタグを移動します(必要に応じて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 を参照して開発されました。

1
vossad01