1

devstagingおよびの 3 つのブランチがありmasterます。私が行うと、どのブランチがチェックアウトされてもgit describe結果は変わりません。v0.1

次に、バージョン タグの追加と、この新しいバージョンへdevのマージを変更するワークフローについて説明します。stagingmaster

  1. git checkout dev
  2. いくつかの変更を加える
  3. git add --all&&git commit -m 'just some testing'
  4. git tag -a v0.19.0
  5. git push && git push --tags
  6. git checkout staging
  7. git merge dev
  8. git push
  9. git checkout master
  10. git merge staging
  11. git push

そして今、私describeはすべてのブランチで実行しています:

- git checkout dev && git describe && git describe --abbrev=0

結果:

v0.19.0-1-ge147b2d
v0.19.0

私が期待したこと:

v0.19.0-1-ge147b2d
v0.19.0
  • git checkout staging && git describe && git describe --abbrev=0

結果:

v0.17.0-3-g684216f
v0.17.0

私が期待したこと:

v0.19.0-xxxxx
v0.19.0
  • git checkout master && git describe && git describe --abbrev=0

結果:

v0.17.0-16-g99c19c9
v0.17.0

私が期待したこと:

v0.19.0-xxxxx
v0.19.0

ここに画像の説明を入力

何故ですか?そして、開発でいくつかの変更を加えてから新しいタグを追加し、タグを使用してそれらの変更を他のすべてのブランチに伝播するプロセスをどのように行うことができますか?

4

1 に答える 1

2

状況を十分に正確に説明していないように見えるため、英語を使用しようとするのではなく、実際に実行するすべてのコマンドを記述する必要があります。たとえば、あなたの言い回しは、「merge into」と「merge to」を使用しており、同じことを表している場合とそうでない場合があります。マージの場合、通常は次のようなことを行いますgit checkout some-local-branch && git fetch && git merge origin/some-other-branch。状況全体を自分で確実に理解していない場合は、すべての詳細が重要になる場合があります。また、ssh 接続を介してリモート マシンなどでいくつかのコマンドを実行する場合は、これも指摘してください。

質問から (2021-04-27T14:24:13+00:00 と表現されているように)、プロセス 2 が欠落しているように見えますgit push --tags(またはおそらく)、元のリポジトリ以外git fetchの場所で実行しようとすると(つまり、作業中の実際にはディレクトリにあります)、新しいタグはまったく表示されません。git describe

git show NEWTAG使用しようとしているすべてのワークスペース (または「ブランチ」)から始めることをお勧めします。すべてのワークスペースで同じ SHA-1 を取得する必要があります。git show HEADまた、実行して、現在の HEAD が一致すると思われるものと実際に一致することを確認することもできます。また、実行できる場合は、gitk実行gitk NEWTAG HEADして問題の視覚的な表現を取得したり、gitk --all -n 10000最大 10000 個の最新のコミットまでのすべてのブランチを表示したりすることもできます。

を使用できない場合はgitk、たとえば を実行してみてくださいgit log --oneline --graph --decorate -n 50。別の方法として、DAG からの最新の 50 件のコミットをタイトルなしで一覧表示するために実行することもできますgit log --oneline --graph --decorate -n 50 --format=%h%d。これにより、さらに支援が必要な場合に SO で結果を共有できます。

スクリーンショットを見て更新

ブランチmasterはどのタグとも同じ位置にgit describeないため、特定のタグ名を唯一の出力として出力しないでください。代わりに、v0.2-4-gf5d6ced基本的に「v0.2 と HEAD が "で始まる SHA-1 を指す 4 つのパッチ」を意味するようなものを言う必要がありますf5d6ced。この例の 4 つのパッチは、a5312dc、7dceb15、b4cd4f6、および f5d6ced で、以下には含まれていませんv0.2

これが私が作成した例です:

*   f5d6ced (HEAD -> master) Merge branch 'staging'
|\  
| *   b4cd4f6 (staging) Merge branch 'dev' into staging
| |\  
| | * 1fa7a37 (tag: v0.2, dev) Updated testfile yet again in branch dev
* | |   7dceb15 (tag: test) Merge branch 'staging'
|\ \ \  
| |/ /  
| * |   a5312dc Merge branch 'dev' into staging
| |\ \  
|/ / /  
| | _   
| * 96cd0ac (tag: v0.1) Updated testfile in branch dev
|/  
* d626941 Added testfile in branch dev

上記のテキスト表現のスクリーンショット

v0.1v0.2は注釈付きタグで、は注釈なしのtestタグです。

$ git checkout dev && git describe
Switched to branch 'dev'
v0.2

$ git checkout staging && git describe
Switched to branch 'staging'
v0.2-2-gb4cd4f6

$ git checkout master && git describe
Switched to branch 'master'
v0.2-4-gf5d6ced

$ git checkout master && git describe --tags
Already on 'master'
test-3-gf5d6ced

これは、マージを作成するときに、明らかに独自の SHA-1 識別子を持つ新しいコミットを作成し、タグが常に特定のバージョンを参照するため、既存のタグがマージを指していないことが原因です。

git describe --abbrev=0たとえば、最新のタグから 1 つだけのタグを選択し、特定のマージの最初の親を優先する可能性があるなど、実際に実行していませんか?

特定のブランチに既に含まれているタグを実際に把握しようとしている場合は、次のようなものを実行できます。

$ git checkout master && git tag --merged
Switched to branch 'master'
test
v0.1
v0.2

またはタグが作成された時間で並べ替え、最新のものから:

$ git checkout master && git tag --sort=-authordate --merged
Already on 'master'
test
v0.2
v0.1

そして、最新のタグだけが必要な場合は、実行できます

git tag --list --sort=-authordate --merged | head -n1

詳細については、を参照git help tagしてください。この場合、最新とは、特定のタグのオーサリング タイムスタンプを意味します。タグの場合、作成者のタイムスタンプとコミットのタイムスタンプは同じですが、私が知る限り、これはどこにも強制されていません。違いが重要な場合は、必要なタイムスタンプを決定するのはあなただけです。

特定の「エラー」ケースの詳細な説明:git describe実際には主張したとおりに実行されませんでしたが、最も近いタグgit describe --abbrev=0がリストされています。これは DAG トポロジであり、最新または最新のタグとはまったく異なる場合があることに注意してください。あなたの例では、との両方が ofからの距離が 1 で、 of からの距離が2です。さらに、古いタグは最初の親から取得されるため、応答として取得されます。特定のブランチに含まれる最新のタグが必要な場合は、代わりに使用することをお勧めします。でも、v0.17v0.19HEADstagingHEADmasterv0.17git tag --list --sort=-authordate --merged | head -n1開発ブランチやステージング ブランチのランダム パッチではなく、マスター ブランチ リリースにタグ付けすることを強くお勧めしますgit describe次に、フラグなしで使用できます

于 2021-04-27T14:34:48.543 に答える