2012-12-27 6 views
6

これは私のGitのレポが今ある方法の例です:設定マスターブランチ

v1.0 v1.1 v1.2 
    |  |  | 
    a - b - c 
    |    | 
master   HEAD 

私は通常、タグをコミットし、このようにタグをプッシュ:

git commit -a -m "Commit msg" 
git tag -a v1.3 -m "Tag msg" 
git push --tags 

私が持っている主な問題は、マスターブランチが最新のタグに移動しないので、私はいつもDetached HEADの状態にあるということです。これを修正する方法はありますか?マスターブランチは常に最新のプッシュタグを指していますか?

+2

あなたのワークフローは?なぜあなたはいつも分離HEAD状態にいるのですか?なぜあなたは支店で働いていないのですか?私はこれが他の何よりもあなたのワークフローに大きな問題だと思います。 – jszakmeister

+1

タグを直接チェックアウトしないと、これは起こりません。 *ブランチをチェックアウトした後にのみ新しいコミットを行い、*タグは決して使わない。 – cdhowie

+0

リポジトリにパッケージファイルを生成できるようにするには、それらにタグを付ける必要があります。そうでなければ、 'a3fsr2'になります。なぜタグを使用する必要があるのでしょうか? – Peter

答えて

7

は、私は次のことをしなければならなかった:最も最近のタグがあるので

1)まず、HEADが指している最新のタグ()を指すようにmasterブランチを設定します。これを行うには、私は新しいブランチを作成し、それにマスターをマージしました。

:私たちは元の場所にマスターを持っていたら、私たちは新しいコミットを行うたびマスターとタグの両方をプッシュする必要があります)

v1.0 v1.1 v1.2 
    |  |  | 
    a - b - c 
        | 
       HEAD 
        | 
       master 

2:

git branch -b exp 
git merge -s ours master 
git checkout master 
git merge exp 

は今、最新のタグと同じであるマスター

git commit -a -m "Commit msg" 
git tag -a v1.4 -m "Tag msg" 
git push master --tags 

この方法で、分離ヘッドモードとマスターブランチが更新されます。

+0

私の答えよりも面白いフィードバックです。 +1 – VonC

+1

'git checkout -B master HEAD'はステップ1を直接実行します。 – jthill

2

ブランチはタグを参照しません。
タグは、を固定して、をコミットします。

あなたがgit checkout masterである限り、あなたはdetached HEAD modeではありません。
これでコミットとタグ付けができます。タグは、現在のブランチのLATESTに作成されます。

デタッチされたHEADモードの場合は、「Git: How can I reconcile detached HEAD with master/origin?」を参照して、デタッチされたコミットとブランチをさまざまに調整してください。

+0

現在のマスターブランチは古くなっているので、チェックアウトするとv1.1とv1.2に適用された変更が失われています。 – Peter

3

物事をこの方法をしないする理由について、すでに与えられた様々な答え/コメントに、しかし、ここであなたは、この特定のシナリオを修正する方法は次のとおりです。

git checkout -b tmpbranch  # creates a branch called tmpbranch at HEAD 
git checkout master    # switch back to master branch 
git merge --ff-only tmpbranch # fast-forward merge master to tmpbranch, fail if not possible 
git branch -d tmpbranch   # delete tmpbranch, it's not needed anymore 

次に、今後、を除いて、タグをチェックアウトしていませんこの方法:

git checkout -b somebranch refs/tags/tagname # creates a new branch starting at tag 

そのように、あなたはデタッチHEAD状態になりません、そして、新しいコミットはあなたが望むものであるように思われ、問題のタグから始まる追加されます...コミット行った後右の点に追加タグを作成するには、git tag newtagを使用します。この特定のケースで

+0

このソリューションの問題点は、私がレポに持っているすべてのタグのブランチを持っていることです。 – Peter

+0

@Peterあなたのタグがすべて開発の別の行にある場合にのみ、それは表示されませんが、元の質問の場合です。あなたは 'master'のような1つのブランチを持ち、そのブランチ上の最近のコミットを指し示すタグ' v2.0'と、それ以前のタグ(例えば 'v1.9'、' v1.8' ....)を指しますその同じブランチ上の以前のコミットに移動します。ブランチは、「私が作る次のコミットの親となるものは何か」を指すことになっています。上記の 'checkout'コマンドは、古い(-er)タグをチェックアウトして、現在の開発ではなくバグ修正を準備する必要がある場合に使用します。 – twalberg