ラック
Home > ブログ > 記事 > 2018年1月 > gitで過去のコミットにタグを付けたりブランチをマージした話

gitで過去のコミットにタグを付けたりブランチをマージした話

カテゴリ: 開発環境

経緯

あるプロジェクトで2つのブランチを持ったリポジトリを運用していました。

  • master(大本)
    • master (大本そのまま)
    • branch1 (バリエーション1)

ここで、branch1ブランチにさらに改造を加えました

  • master(大本)
    • master (大本そのまま)
    • branch1 (バリエーション1) → (機能変更・改造版)

また、branch1_featureにタグ付けを行いました。

  • master(大本)
    • master (大本そのまま)
    • branch1 (バリエーション1) → branch1_feature*タグ付け (機能変更・改造版)

しかし、pushしたのはブランチ的にはbranch1上なので、branch1 (バリエーション1)を参照したいときはコミットの中から探すことになります。「しまった、branch1にもタグを付けておけば良かった」とここで思い当たりました。

過去のコミットにタグ付け

ということでタグを付けます。

$ git tag branch1 <コミットID(コミットのハッシュ値/8桁くらい)>

後はこのタグをpushするだけ……と思ったのですが。

$ git push -u origin branch1
error: src refspec branch1 matches more than one.
error: failed to push some refs to 'https://GIT.PROJECT/REPOSITORY.git'

という感じで怒られてしまいました。branch1がたくさんある?

ここでは別にすべてのタグをpushしても問題なかったので

$ git push origin --tags

で回避。タグ付けてpushできました。

  • master(大本)
    • master (大本そのまま)
    • branch1タグbranch1付け (バリエーション1) → branch1_featureタグ付け (機能変更・改造版)

これで良いのか分かりません(良くない気がする)が……。

参考

ブランチをマージ

ついでに、もうmasterから開発を進めることはないことが分かったのでマージもしようと思いました。

$ git merge --no-ff branch1
warning: refname 'branch1' is ambiguous.
Already up to date.

なんですと?

調べたところ、ブランチ名とタグ名が同じ名前の時に「どっちのことを言っているのか分からないよ」ということだそうです。ああ、ブランチ名と同じ名前のタグを付けてしまったのは失敗だったか。

仕方ないのでタグを消してリネームすることにします。

$ git tag -d branch1
$ git tag branch1_tag <コミットID(コミットのハッシュ値/8桁くらい)>
$ git push origin --tags

……しまった。これだとリモートリポジトリ上のbranch1が消えない。これを消さないと。

この記事にある方法(次のコマンド)だと、今回はタグとブランチの名前が同じなのでまずいですね。専用の方法がありそう。

$ git push --delete origin TAGNAME
$ git push --delete origin BRANCHNAME

この記事の方法で良さそうですね。というか、最初のエラーメッセージ

error: src refspec branch1 matches more than one.
error: failed to push some refs to 'https://GIT.PROJECT/REPOSITORY.git'

は元々これを指していたのですね。調べずに適当にやった結果、回り道をしていたようです。そして、回り道をしてようやく最初のエラーに対する正しい対処法も分かったという。

$ git push origin :refs/tags/branch1

これで重複した名前のうち、タグの方を削除。

  • master(大本)
    • master (大本そのまま)
    • branch1タグbranch1_tag付け (バリエーション1) → branch1_featureタグ付け (機能変更・改造版)

これでようやくマージできます。

$ git merge --no-ff branch1
Already up to date.

ん?あ、もしかしなくても逆でした。

$ git checkout master
$ git fetch
$ git merge
$ git merge --no-ff branch1
$ git push -u origin master

こうですかね。

  • master(大本)
    • master (大本そのまま) → branch1をマージ
    • branch1タグbranch1_tag付け (バリエーション1) → branch1_featureタグ付け (機能変更・改造版)

これで本来やりたかったことが達成できたので良しとします。

参考

タグ: Git

 



関連する記事一覧