Saya mendapatkan kesalahan berikut setelah saya menjalankan langkah-langkah di bawah ini:
To [email protected]:username/repo-name.git
! [rejected] dev -> dev (already exists)
error: failed to push some refs to '[email protected]:username/repo-name.git'
hint: Updates were rejected because the tag already exists in the remote.
- Membuat repositori
- Mengkloning repo pada mesin lokal.
- Memodifikasi file README, melakukan perubahan dan mendorong komit.
- Tag yang dibuat
dev
:git tag dev
- Tag yang didorong:
git push --tags
- Memodifikasi file README, melakukan perubahan dan mendorong komit.
Tag yang dihapus
dev
, membuatnya lagi dan mendorong tag:git tag -d dev git tag dev git push --tags
Mengapa ini terjadi?
Saya di Mac. Teman saya yang menggunakan Linux (Ubuntu) tidak memiliki masalah ini. Saya tahu bahwa saya dapat menggunakan git push --tags -f
untuk memaksa pembaruan tag, tetapi ini berbahaya (misalnya menulis ulang komit yang dibuat hanya karena kesalahan dalam tag, bukan di cabang).
git
repository
git-tag
Luca Boieru
sumber
sumber
git pull --tags
kemudiangit push origin --tags
Jawaban:
Edit, 24 Nov 2016: jawaban ini tampaknya populer, jadi saya menambahkan catatan di sini. Jika Anda mengganti tag di server pusat, siapa pun yang memiliki tag lama — klon mana pun dari repositori server pusat yang sudah memiliki tag — dapat mempertahankan tag yang lama . Jadi, sementara ini memberi tahu Anda cara melakukannya, pastikan Anda ingin melakukannya. Anda akan perlu untuk mendapatkan semua orang yang sudah memiliki "salah" tag untuk menghapus mereka "tag yang salah" dan menggantinya dengan yang baru "tag yang tepat".
Pengujian di Git 2.10 / 2.11 menunjukkan bahwa mempertahankan tag lama adalah perilaku default untuk klien yang berjalan
git fetch
, dan memperbarui adalah perilaku default untuk klien yang menjalankangit fetch --tags
.(Jawaban asli berikut.)
Ketika Anda meminta tag push,
git push --tags
mengirim (bersama dengan komit dan objek lain yang diperlukan dan pembaruan ref lainnya dari pengaturan push) ke remote permintaan pembaruan formulir . (Ya, ia mengirimkan banyak: salah satunya untuk setiap tag.)new-sha1 refs/tags/name
Permintaan pembaruan dimodifikasi oleh remote untuk menambahkan
old-sha1
(atau sekali lagi, satu untuk setiap tag), kemudian dikirim ke kait pra-terima dan / atau perbarui (mana pun kait yang ada pada remote). Kait itu dapat memutuskan apakah akan mengizinkan atau menolak tag buat / hapus / perbarui.The
old-sha1
nilai adalah semua-nol "null" SHA-1 jika tag sedang dibuat. Ininew-sha1
adalah null SHA-1 jika tag sedang dihapus. Jika tidak, kedua nilai SHA-1 adalah nilai nyata dan valid.Bahkan tanpa kait, ada semacam "kait bawaan" yang juga dijalankan: remote akan menolak untuk memindahkan tanda kecuali Anda menggunakan bendera "force" (meskipun "kait bawaan" selalu baik-baik saja dengan keduanya "tambah" dan "hapus"). Pesan penolakan yang Anda lihat berasal dari pengait bawaan ini. (Kebetulan, pengait bawaan yang sama ini juga menolak pembaruan cabang yang tidak maju cepat.) 1
Tapi — inilah salah satu kunci untuk memahami apa yang terjadi —
git push
langkah tersebut tidak tahu apakah remote memiliki tag itu sekarang, dan jika demikian, apa nilai SHA-1 yang dimilikinya. Itu hanya mengatakan "inilah daftar lengkap tag saya, bersama dengan nilai SHA-1 mereka". Remote membandingkan nilainya dan jika ada tambahan dan / atau perubahan, jalankan hooks pada itu. (Untuk tag yang sama, tidak melakukan apa-apa. Untuk tag yang tidak Anda miliki, tag juga tidak berfungsi!)Jika Anda menghapus tag secara lokal, maka
push
, dorongan Anda tidak akan mentransfer tag. Remote menganggap tidak ada perubahan yang harus dilakukan.Jika Anda menghapus tag secara lokal, kemudian membuatnya menunjuk ke tempat baru, lalu
push
, push Anda mentransfer tag, dan remote melihat ini sebagai tag-perubahan dan menolak perubahan, kecuali itu push-paksa.Dengan demikian, Anda memiliki dua opsi:
Yang terakhir adalah mungkin melalui
git push
2 meskipun menghapus tag secara lokal danpush
ing tidak berpengaruh. Dengan asumsi nama remote adalahorigin
, dan tag yang ingin Anda hapus adalahdev
:Ini meminta remote untuk menghapus tag. Ada atau tidaknya tag
dev
di repositori lokal Anda tidak relevan; jenis inipush
, dengan sebagai refspec, adalah dorongan penghapusan murni.:remoteref
Remote mungkin atau mungkin tidak mengizinkan penghapusan tag (tergantung pada kait tambahan yang ditambahkan). Jika memungkinkan penghapusan, maka tag akan hilang, dan yang kedua
git push --tags
, ketika Anda memilikidev
tag lokal yang menunjuk ke beberapa objek repo tag berkomitmen atau beranotasi, kirimdev
tag baru Anda . Pada remote,dev
sekarang akan menjadi tag yang baru dibuat, jadi remote mungkin akan memungkinkan push (sekali lagi ini tergantung pada kait tambahan yang ditambahkan).Push-force lebih sederhana. Jika Anda ingin memastikan untuk tidak memperbarui apa-apa lain selain tag, hanya memberitahu
git push
untuk mendorong hanya itu satu refspec:(catatan: Anda tidak perlu
--tags
jika Anda secara eksplisit mendorong hanya satu ref-spec tag).1 Tentu saja, alasan kait bawaan ini adalah untuk membantu menegakkan perilaku yang diharapkan oleh pengguna lain dari repo jarak jauh yang sama: bahwa cabang tidak diputar ulang, dan tag tidak bergerak. Jika Anda mendorong-paksa, Anda harus memberi tahu pengguna lain bahwa Anda melakukan ini, sehingga mereka dapat memperbaikinya. Perhatikan bahwa "tag tidak bergerak sama sekali" baru diberlakukan oleh Git 1.8.2; versi sebelumnya akan memungkinkan tag untuk "bergerak maju" dalam grafik komit, seperti nama cabang. Lihat catatan rilis git 1.8.2 .
2 Ini sepele jika Anda bisa masuk di kendali jarak jauh. Buka saja repositori Git di sana dan jalankan
git tag -d dev
. Perhatikan bahwa bagaimanapun juga — menghapus tag pada remote, atau menggunakangit push
untuk menghapusnya — ada periode waktu ketika siapa pun yang mengakses remote akan menemukan bahwadev
tag tersebut hilang. (Mereka akan terus memiliki tag lama mereka sendiri , jika mereka sudah memilikinya, dan mereka bahkan mungkin mendorong kembali tag lama mereka sebelum Anda dapat mendorong yang baru.)sumber
1.7.9.5
dan saya tidak punya masalah ini ...git push --tags
hanya mengubah tag secara otomatis di versi git yang lebih lama, tanpa--force
. Saya menguji ini di bawah 1.8.4, dan Anda memang perlu--force
, atau teknik dua tahap pembaruan.Di Mac SourceTree hanya hapus centang pada kotak centang Push all tags :
sumber
Ini cukup sederhana jika Anda menggunakan SourceTree .
Pada dasarnya Anda hanya perlu menghapus dan menambahkan kembali tag yang bertentangan:
sumber
Jika Anda ingin UPDATE tag, katakanlah itu
1.0.0
git checkout 1.0.0
git ci -am 'modify some content'
git tag -f 1.0.0
git push origin --delete 1.0.0
git push origin 1.0.0
DIBUAT
sumber
Tampaknya saya terlambat dalam masalah ini dan / atau sudah dijawab, tetapi, yang bisa dilakukan adalah: (dalam kasus saya, saya hanya punya satu tag secara lokal jadi .. Saya menghapus tag yang lama dan mem-retagnya dengan :
Kemudian:
Itu akan memperbarui semua tag pada jarak jauh.
Bisa berbahaya! Gunakan dengan risiko sendiri.
sumber
Alasan Anda ditolak adalah bahwa tag Anda kehilangan sinkronisasi dengan versi jarak jauh. Ini adalah perilaku yang sama dengan cabang.
sinkronkan dengan tag dari jarak jauh via
git pull --rebase <repo_url> +refs/tags/<TAG>
dan setelah Anda menyinkronkan, Anda perlu mengelola konflik . Jika Anda memiliki diftool diinstal (mis. Berbd)git mergetool meld
gunakan itu untuk menyinkronkan jarak jauh dan menyimpan perubahan Anda.Alasan Anda menggunakan flag --rebase adalah karena Anda ingin meletakkan pekerjaan Anda di atas yang jauh sehingga Anda dapat menghindari konflik lainnya.
Juga, apa yang saya tidak mengerti adalah mengapa Anda menghapus
dev
tag dan membuatnya kembali ??? Tag digunakan untuk menentukan versi perangkat lunak atau tonggak sejarah. Contoh tag gitv0.1dev
,v0.0.1alpha
,v2.3-cr
(cr - kandidat rilis) dan sebagainya ..Cara lain yang bisa Anda selesaikan adalah mengeluarkan a
git reflog
dan buka saat Anda mendorongdev
tag pada jarak jauh. Salin id komit dangit reset --mixed <commmit_id_from_reflog>
dengan cara ini Anda tahu tag Anda telah disinkronkan dengan remote pada saat Anda mendorongnya dan tidak ada konflik akan muncul.sumber
Di Windows SourceTree, hapus centang
Push all tags to remotes
.sumber
Beberapa jawaban bagus di sini. Terutama yang oleh @torek . Saya pikir saya akan menambahkan pekerjaan ini dengan sedikit penjelasan bagi mereka yang terburu-buru.
Untuk meringkas, yang terjadi adalah ketika Anda memindahkan tag secara lokal, itu mengubah tag dari nilai komit non-Null ke nilai yang berbeda. Namun, karena git (sebagai perilaku default) tidak memungkinkan untuk mengubah tag jarak jauh non-Null, Anda tidak dapat mendorong perubahan.
Solusi untuk menghapus tag (dan centang hapus semua remote). Kemudian buat tag yang sama dan tekan.
sumber