Bagaimana cara memaksa push reset ke repositori jarak jauh?

94

Cabang master jarak jauh kami entah bagaimana menjadi kacau balau. Kode pengembangan saat ini ada di cabang master bersama dengan komit terbaru. Jelasnya, kode pengembangan belum siap untuk cabang master.

Jadi di repositori lokal saya, saya melakukan reset ke tag terbaru git reset --hard (Tag),. Cabang master sekarang sudah benar di repositori lokal saya. Sekarang ketika saya mencoba untuk mendorong perubahan ke repositori jarak jauh git push origin master,, saya mendapatkan kesalahan:

To (REMOTE GIT REPOSITORY LOCATION)
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to '(REMOTE GIT REPOSITORY LOCATION)'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again.  See the
'Note about fast-forwards' section of 'git push --help' for details.

Jadi setelah melihat-lihat saya menemukan --forceopsi. Jadi saya melakukan push paksa ke repositori jarak jauh git push --force origin master, dan saya masih mendapat kesalahan:

Total 0 (delta 0), reused 0 (delta 0)
remote: error: denying non-fast-forward refs/heads/master (you should pull first)
To (REMOTE GIT REPOSITORY LOCATION)
 ! [remote rejected] master -> master (non-fast-forward)
error: failed to push some refs to '(REMOTE GIT REPOSITORY LOCATION)'

Saya tidak bisa melakukan pull on master, karena mengandung kode pengembangan yang tidak bisa di master.

samwell
sumber
3
Menurut saya pesan tersebut berarti Anda tidak memiliki hak untuk melakukan dorongan non-percepatan-maju.
svick
3
Anda benar, terima kasih. Dalam file konfigurasi untuk repositori di remote denyNonFastforwards = true,. Saya mengubahnya menjadi salah, mendorong perubahan saya dan kemudian mengubahnya kembali menjadi benar. Sekali lagi terima kasih semuanya, atas bantuannya.
samwell
2
@samwell tolong tandai jawaban svick sebagai diterima
hultqvist
@ Samwell apakah jawaban svick bekerja untuk Anda atau tidak?
Songo
Bagi mereka yang membutuhkan detail tentang cara menonaktifkan denyNonFastForwards seperti yang dilakukan samwell, instruksi lebih lanjut dapat ditemukan di sini: stackoverflow.com/a/43721579/2073804
ron190

Jawaban:

152

Pesan tersebut berarti Anda tidak diizinkan untuk melakukan push non-fast-forward.

Repositori jarak jauh Anda kemungkinan besar ada denyNonFastforwards = truedi konfigurasinya. Jika Anda mengubahnya, git push --forceseharusnya berhasil.

Untuk mengubah setelan, Anda memerlukan akses ke mesin dengan repositori jarak jauh. Dari sana, lakukan git config receive.denynonfastforwards false.

svick
sumber
1
Bisakah Anda melakukan git configuntuk server? Atau mungkin Anda menggunakan itu secara metaforis. Untuk bermain dengan ide-ide ini saya membuat repo percobaan di /opt/git(ruang server git saya) dan kemudian saya mengubah pengaturan ini di /opt/git/the_repo/the_repo.git/config. Tapi setelah selesai git push --force origin SHA:branchbekerja sesuai kebutuhan.
HankCa
4
Pesan kesalahan akan memiliki baris yang dimulai dengan "error: gagal mendorong beberapa referensi ke <repositori Anda>" di mana <repositori Anda> adalah jalur yang diakhiri dengan .git yang merupakan direktori yang berisi file bernama "config". File "config" ini adalah tempat Anda dapat menyetel denyNonFastforwards = false
amril
1
Komentar @ emery sangat berharga. Terkadang folder di server memiliki asal yang disetel ke sesuatu seperti /srv/git/repo.git. Ini adalah konfigurasi yang menyetel denyNonFastForwards, bukan folder aplikasi.
Elijah Lynn
1
@hsalimi Jika Anda tidak memiliki akses ke server maka Anda perlu menghubungi admin server dan meminta mereka mematikannya untuk sementara sehingga Anda dapat memaksa push dan kemudian menyalakannya kembali. Namun, kecil kemungkinannya sebagian besar berada dalam posisi untuk melakukan ini. Ini mungkin lebih umum terjadi di lingkungan internal dengan tim hosting Anda sendiri.
Elijah Lynn
1
Ini awalnya membuat frustasi, tetapi keindahannya adalah: remote sepenuhnya dilindungi secara default, dan jika Anda sebagai pengembang dengan sengaja dan benar melakukan rebases, Anda dapat mengganti konfigurasi ini untuk memungkinkan perilaku berbahaya. Rebasing adalah sesuatu yang harus diketahui setiap pengguna git - dan tahu kapan tidak boleh melakukannya. doc1 doc2
moodboom
15

Remote tidak memungkinkan non-fast-forward.

Pilihan terbaik Anda adalah melakukan git revertsemua komitmen yang seharusnya tidak ada dan lebih berhati-hati di masa mendatang.

git revert [commit]akan membuat komit baru yang membatalkan apa pun yang [commit]dilakukan.

richo
sumber
Itu adalah beberapa pengaturan pada repositori jarak jauh yang memblokir semua perubahan non-fast-forward.
samwell
Jika Anda melakukan ini dan perlu menerapkan kembali komit, riwayat tidak dihapus dalam pengembalian hanya perubahan kode, dan Anda tidak akan dapat memilih komit atau menggabungkannya
mtpultz
12

Langkah-langkah untuk secara permanen mengaktifkan dorongan paksa dengan gaya berikut

git push -f myrepo my-branch

Edit file bernama "config" di folder yang diakhiri dengan ".git" di repositori jarak jauh Anda

Dalam keluaran baris perintah git dari dorongan yang gagal, cari baris yang mengatakan sesuatu seperti:

error: failed to push some refs to 'ssh://[email protected]/srv/git/myrepo.git

kemudian

ssh [email protected]
cd /srv/git/myrepo.git
vi config

Setel "denyNonFastforwards" ke false

Dalam "config", setel

[receive]
        denyNonFastforwards = false

Sekarang Anda dapat melakukan push dari mesin lokal Anda dengan -f

git push -f myrepo my-branch
amril
sumber
Bagaimana melakukan ini tanpa akses ke SSH ke git repo telanjang?
Vladimir Vukanac
Mungkin menggunakan perintah git revert seperti yang disarankan richo? Jika Anda mencadangkan status repo saat ini terlebih dahulu, Anda masih dapat menggabungkan kode Anda untuk maju.
ampelas
git revertagak rumit jika Anda memiliki penggabungan. Untuk lebih rumitnya kasus saya memiliki 3 penggabungan, yang satu dengan yang sangat tua ~ 20 komit menyimpang dari pengembangan, kedua adalah jenis gabungan dari master - jelek sekali.
Vladimir Vukanac
1
Mungkin solusinya adalah mengatur ulang ke keadaan yang diinginkan, membuat cadangan (simpanan), menarik lagi, dan menerapkan cadangan (simpanan).
Vladimir Vukanac
1
mrW Anda masih dapat menggabungkan basis kode yang Anda inginkan di atas basis kode yang dikembalikan / ditarik
amril
11

Coba gunakan -fbendera dan letakkan setelah nama cabang jarak jauh.

git push origin master -f

Chris Ledet
sumber
1
Tidak, itu juga tidak berhasil. Saya juga mencoba git push -f origin masterdan hasil yang sama. Kedua kali saya mencobanya, saya mendapat versi kedua dari pesan kesalahan.
samwell
2

Anda tidak diizinkan melakukan git push yang tidak dipercepat.

  1. Jika remote-nya adalah GitHub, buka https://github.com/$USER/$REPO/settings/branchesdan batalkan perlindungan cabang yang dimaksud.

    masukkan deskripsi gambar di sini

    Anda harus menjadi admin repo untuk melakukan itu.

  2. Jika remote adalah server git Anda sendiri, jalankan di git config receive.denynonfastforwards falsesana.

filiph
sumber
Ketahuilah bahwa untuk instance Git Hub Enterprise, pengiriman ke cabang default (biasanya "master") dapat dinonaktifkan di tingkat instance. Ini berarti bahwa meskipun "master" tidak dilindungi, dan meskipun Anda adalah admin situs, Anda tidak akan dapat melakukan dorongan paksa ke cabang default. Dengan asumsi Anda memiliki izin, Anda dapat mengatasi masalah ini untuk sementara dengan mengalihkan cabang default ke yang lain, melakukan dorongan paksa, dan kemudian beralih kembali.
Christopher Hunter
2

Cara terbaik untuk mengatasinya adalah dengan menghapus cabang jarak jauh dan mengirimkannya kembali:

git push origin master --delete
git push origin master
Danilo Souza Morães
sumber
0

Masalahnya terjadi karena cabang saat ini tidak dikonfigurasi dengan benar untuk PULL . Pertama, periksa apakah cabang upstream dikonfigurasi dengan benar untuk penarikan menggunakan - git remote show origin. Anda dapat menemukannya di bawah bagian - cabang lokal dikonfigurasi untuk 'git pull': . Jika tidak, konfigurasikan menggunakan:

git config branch.MYBRANCH.merge refs/heads/MYBRANCH

Berikan nama cabang yang sesuai untuk placeholder - MYBRANCH

Sudheesh.MS
sumber
0

Saya menggunakan grup perintah ini untuk mengatur ulang repo jarak jauh saya, ini akan menginisialisasi ulang repo lokal Anda dan menautkan ulang dengan repo jarak jauh Anda kemudian memaksa mendorong pembaruan.

Saya pikir cara ini tidak akan berhasil dalam kasus Anda, tetapi mungkin berguna untuk orang lain

buka folder sumber lalu jalankan perintah: perhatikan bahwa https://github.com/*.gitlink repo jarak jauh Anda

git init
git remote add origin https://github.com/*.git
git add .
git commit -m "initial commit"
git push origin master -f
git push --set-upstream origin master

**Note: this will clear all your git history on your master branch**

Khaled AbuShqear
sumber
0

Bagi saya, petunjuk @svick menunjuk ke arah yang benar. Karena server git yang ingin saya modifikasi sebenarnya adalah kotak saya, saya masuk ke dalamnya dan melakukan git config --global receive.denynonfastforwards falseuntuk mengubah semua repo untuk menerima dorongan non-ff paksa. Tidak berhasil di luar kotak. Apa yang saya temukan adalah bahwa dalam konfigurasi itu sudah ada receive.denynonfastforwards=true, dan itu tidak dapat dihapus dengan git config --global --unset receive.denynonfastforwards. Melakukan edit di repo secara manual ( vi config) berhasil.

jglathe.dll
sumber
0

Saya menyelesaikannya dengan menghapus cabang master dari protected dan juga default yang lebih dari aturan cabang yang dilindungi dalam pengaturan repositori.

dasra khadka
sumber