Pembaruan ditolak karena ujung cabang Anda saat ini ada di belakang

156

Saya baru di Git, jadi silakan memperlakukan saya seperti seorang pemula.

Alur kerja kami seperti itu. Kami memiliki cabang devyang bisa saya hubungi origin/dev. Ketika kami melakukan perubahan, kami membuat cabang dari dev:

git checkout -b FixForBug asal / dev

Sekarang saya memiliki cabang bernama FixForBugyang melacak (saya pikir itu kata yang tepat) origin/dev. Jadi, jika saya melakukan git pullitu akan membawa perubahan baru origin/devyang bagus. Sekarang, ketika saya selesai dengan perbaikan saya, saya mendorong ke cabang jauh yang disebut hal yang sama.

Pertama saya tarik ke bawah setiap perubahan dari origin/devdan melakukan rebase:

git pull --rebase

Lalu saya mendorong perubahan ke cabang jauh dengan nama yang sama:

git dorong asal FixForBug

Sekarang, ada cabang di server jarak jauh dan saya dapat membuat permintaan tarik agar perubahan disetujui dan bergabung kembali ke cabang dev. Saya tidak pernah mendorong apa pun pada origin/devdiri saya sendiri. Saya menduga ini adalah alur kerja yang cukup umum.

Pertama kali saya melakukan git push, itu berfungsi dengan baik dan membuat cabang jarak jauh. Namun, jika saya mendorong kedua kalinya (katakanlah saat peninjauan kode, seseorang menunjukkan masalah), saya mendapatkan kesalahan berikut:

kesalahan: gagal mendorong beberapa referensi ke ' https://github.limeade.info/Limeade/product.git ' petunjuk: Pembaruan ditolak karena ujung cabang Anda saat ini berada di belakang petunjuk: mitra jarak jauh. Integrasikan perubahan jarak jauh (mis. Petunjuk: 'git pull ...') sebelum mendorong lagi. petunjuk: Lihat 'Catatan tentang maju cepat' di 'git push --help' untuk detailnya.

Namun, jika saya melakukan git statusitu mengatakan saya di depan origin/devoleh 1 komit (yang masuk akal) dan jika saya mengikuti petunjuk dan lari git pull, katanya semuanya up to date. Saya pikir ini karena saya mendorong ke cabang yang berbeda dari cabang hulu saya. Saya dapat memperbaiki masalah ini dengan menjalankan:

git push -f origin FixForBug

Dalam hal ini, itu akan mendorong perubahan ke cabang jarak jauh, mengatakan (pembaruan paksa) dan semuanya tampak baik di cabang jarak jauh.

Pertanyaan saya:

Mengapa -fdiperlukan dalam skenario ini? Biasanya ketika Anda memaksa sesuatu, itu karena Anda melakukan sesuatu yang salah atau setidaknya bertentangan dengan praktik standar. Apakah saya boleh melakukan ini, atau akankah itu mengacaukan sesuatu di cabang terpencil atau membuat kerumitan bagi siapa pun yang akhirnya harus menggabungkan barang-barang saya menjadi dev?

Mike Christensen
sumber
2
Sepertinya pesan yang Anda terima mengatakan bahwa cabang terpencil FixForBug berada di depan FixForBug cabang lokal Anda. Anda harus menarik perubahan dari cabang jauh itu dan menggabungkannya ke cabang lokal Anda sebelum mendorong.
mhatch
4
@mhatch - Jadi pada dasarnya jalankan git pull origin FixForBugsebelum saya mendorong itu? Ok itu masuk akal. Jangan ragu untuk menambahkan sebagai jawaban!
Mike Christensen

Jawaban:

200

The -f adalah benar-benar diperlukan karena rebase. Setiap kali Anda melakukan rebase, Anda perlu melakukan push force karena cabang jarak jauh tidak dapat diteruskan dengan cepat ke komit Anda. Anda selalu ingin memastikan bahwa Anda melakukan tarikan sebelum mendorong, tetapi jika Anda tidak suka memaksa push to master atau dev dalam hal ini, Anda dapat membuat cabang baru untuk mendorong dan kemudian menggabungkan atau membuat PR .

Keif Kraken
sumber
2
Terima kasih atas jawaban yang sangat membantu ini! :)
AIM_BLB
1
Bisakah Anda mengklarifikasi poin "Anda selalu ingin memastikan bahwa Anda melakukan tarikan sebelum mendorong"? Jelas mengapa "push -f" setelah rebase dari cabang lokal diperlukan. Dalam hal ini, bukankah rebase lokal akan dibatalkan dengan melakukan tarikan pada remote sebelum mendorong?
haripkannan
51

Untuk memastikan FixForBug cabang lokal Anda tidak mendahului FixForBug cabang jarak jauh, tarik dan gabungkan perubahan sebelum mendorong.

git pull origin FixForBug
git push origin FixForBug
mhatch
sumber
2
OP menyatakan mereka sudah melakukan git pull dan mencoba mendorong. Jawaban Anda tidak berlaku untuk pertanyaan OP.
Patrick
1
Itu selalu lebih baik untuk menghindari dorongan gaya. Terima kasih telah berbagi ini!
Ann Kilzer
16

Jika Anda ingin menghindari harus menggunakan -f, maka Anda bisa menggunakan saja

git pull

dari pada

git pull --rebase

Non-rebase akan mengambil perubahan dari origin/devdan menggabungkannya ke FixForBugcabang Anda . Kemudian, Anda akan bisa berlari

git push origin FixForBug

tanpa menggunakan -f.

Greg Hewgill
sumber
3
Rebase adalah bagian dari alur kerja kami di sini. Saya akan dimarahi jika saya tidak melakukannya.
Mike Christensen
1
@MikeChristensen: Oke, tentu saja ikuti prosedur yang didokumentasikan. Dari apa yang Anda jelaskan, Anda perlu menggunakan -fkarena Anda mengganti komit (s) pada repositori hulu dengan yang berbeda yang memiliki riwayat (rebased) yang berbeda. Jika Anda menggunakan produk seperti Gerrit maka itu mendukung semacam ini alur kerja tinjauan ulang kode tanpa harus menggunakan -fsaat mendorong. Kami menggunakan Gerrit di tempat kerja dengan cara ini dan itu bekerja dengan sangat baik.
Greg Hewgill
15

the tip of your current branch is behind its remote counterpartberarti bahwa ada perubahan pada cabang jarak jauh yang tidak Anda miliki secara lokal. dan git memberitahu Anda mengimpor perubahan baru dari REMOTEdan menggabungkannya dengan kode Anda dan kemudian pushke jarak jauh.

Anda dapat menggunakan perintah ini untuk memaksa perubahan ke server dengan repo lokal ().

git push -f origin master

dengan -ftag Anda akan menimpa Remote Brach codedengan kode Anda.

Talha Rafique
sumber
6

Perintah yang saya gunakan dengan Azure DevOps ketika saya menemukan pesan "pembaruan ditolak karena ujung cabang Anda saat ini ada di belakang" adalah perintah ini:

git tarik master asal

(atau dapat mulai dengan folder baru dan melakukan Kloning) ..

Jawaban ini tidak menjawab pertanyaan yang diajukan, khususnya, Keif telah menjawab ini di atas, tetapi menjawab pertanyaan judul / judul teks dan ini akan menjadi pertanyaan umum bagi pengguna Azure DevOps.

Saya mencatat komentar: "Anda selalu ingin memastikan bahwa Anda melakukan tarikan sebelum mendorong" dalam jawaban dari Keif di atas!

Saya juga menggunakan alat Git Gui selain alat baris perintah Git.

(Saya tidak yakin bagaimana melakukan yang setara dengan perintah baris perintah "git pull origin master" di dalam Git Gui jadi saya kembali ke baris perintah untuk melakukan ini).

Diagram yang menunjukkan berbagai perintah git untuk berbagai tindakan yang mungkin ingin Anda lakukan adalah yang ini:

masukkan deskripsi gambar di sini

Allan F
sumber
4

Ini baru saja terjadi pada saya.

  • Saya membuat permintaan tarik kepada tuan kita kemarin.
  • Rekan saya sedang meninjaunya hari ini dan melihat bahwa itu tidak sinkron dengan cabang utama kami, jadi dengan maksud membantu saya, dia menggabungkan master ke cabang saya.
  • Saya tidak tahu dia melakukan itu.
  • Kemudian saya menggabungkan master secara lokal, mencoba mendorongnya, tetapi gagal. Mengapa? Karena kolega saya bergabung dengan master menciptakan komit tambahan yang tidak saya miliki secara lokal !

Solusi: Tarik cabang saya sendiri sehingga saya mendapatkan komit ekstra. Kemudian dorong kembali ke cabang jarak jauh saya.

apa yang saya lakukan di cabang saya adalah:

git pull
git push
Madu
sumber
3

Inilah bagaimana saya memecahkan masalah saya

Anggaplah cabang hulu adalah cabang yang Anda gunakan untuk bercabang dan asal adalah repo Anda dan Anda ingin mengirim MR / PR ke cabang hulu.

Anda sudah mengatakan sekitar 4 komit dan Anda mulai Updates were rejected because the tip of your current branch is behind.

Inilah yang saya lakukan

Pertama, remas semua 4 komitmen Anda

git rebase -i HEAD~4

Anda akan mendapatkan daftar commit yang picktertulis di dalamnya. (dibuka di editor)

contoh

pick fda59df commit 1
pick x536897 commit 2
pick c01a668 commit 3
pick c011a77 commit 4

untuk

pick fda59df commit 1
squash x536897 commit 2
squash c01a668 commit 3
squash c011a77 commit 4

Setelah itu, Anda dapat menyimpan komit gabungan Anda

Lanjut

Anda harus menyimpan komit Anda

Begini caranya

git reset --soft HEAD~1
git stash

sekarang rebase dengan cabang hulu Anda

git fetch upstream beta && git rebase upstream/beta

Sekarang pop komit simpanan Anda

git stash pop

komit perubahan ini dan dorong mereka

git add -A
git commit -m "[foo] - foobar commit"
git push origin fix/#123 -f
Deepesh Nair
sumber
2

Itu pasti karena komitmen ada di depan dorongan Anda saat ini.

1) git pull asal "nama cabang yang ingin Anda tekan"

2) git rebase

jika git rebase berhasil, maka bagus. Jika tidak, Anda telah menyelesaikan semua konflik penggabungan secara lokal dan tetap melanjutkannya hingga rebase dengan remote berhasil.

3) git rebase --continue

keris
sumber
0

Saya mengalami masalah ini ketika mencoba untuk mendorong setelah rebase melalui Visual Studio Code, masalah saya diselesaikan dengan hanya menyalin perintah dari jendela keluaran git dan menjalankannya dari jendela terminal di Visual Studio Code.

Dalam kasus saya, perintahnya adalah seperti:

git push origin NameOfMyBranch:NameOfMyBranch

HoloLady
sumber
0

Anda harus menambahkan file baru di komit Anda yang belum didorong. Periksa file dan dorong file itu lagi dan coba tarik / dorong itu akan berhasil. Ini bekerja untuk saya ..

Rahul Parab
sumber