git: Cabang Anda di depan dengan komitmen X

379

Bagaimana ini bisa terjadi?

Saya bekerja dalam satu repo sendiri saat ini, jadi ini adalah alur kerja saya:

  1. Ubah file
  2. Melakukan
  3. Ulangi 1-2 hingga puas
  4. Push to master

Lalu ketika saya melakukan git statusitu memberi tahu saya bahwa cabang saya di depan oleh X melakukan (mungkin jumlah yang sama dengan yang saya buat). Apakah karena ketika Anda mendorong kode itu tidak benar-benar memperbarui file yang di-cache secara lokal (di folder .git)? git pulltampaknya 'memperbaiki' pesan aneh ini, tetapi saya masih penasaran mengapa itu terjadi, mungkin saya menggunakan git yang salah?


termasuk cabang apa yang dicetak dalam pesan

Cabang lokal saya ada di depan master

di mana Anda mendorong / menarik cabang saat ini

Saya mendorong ke GitHub dan menarik ke komputer mana pun yang sedang saya kerjakan pada saat itu, salinan lokal saya selalu sepenuhnya terbaru karena saya adalah satu-satunya yang mengerjakannya.

itu sebenarnya tidak memeriksa repo jarak jauh

Itulah yang saya pikirkan, saya pikir saya akan memastikan pemahaman saya tentang hal itu benar.

Apakah Anda memberikan beberapa argumen tambahan?

Bukan yang bisa saya lihat, mungkin ada konfigurasi lucu yang terjadi di ujung saya?

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)
SeanJA
sumber
Bagaimana Anda melakukan pushdan apa pengaturan konfigurasi cabang dan jarak jauh Anda?
CB Bailey
2
itu tidak benar-benar memeriksa repo jarak jauh, Anda perlu melakukan git mengambil mengambil informasi terbaru tentang repo jarak jauh setelah melakukan push, ini akan memperbarui cabang "remote" lokal yang digunakan untuk melacak.
Sekhat
2
@Sekhat: Meskipun git statustidak memeriksa repositori jarak jauh, git pullya. Jika Anda memiliki cabang pelacakan untuk repositori yang Anda dorong, git pushakan memperbarui cabang pelacakan lokal Anda untuk mencerminkan keadaan baru dari cabang jarak jauh jika dorongan Anda berhasil. Inilah sebabnya saya bertanya tentang konfigurasi penanya karena jika tidak terjadi dengan benar mungkin ada kesalahan konfigurasi.
CB Bailey
git status? Betulkah? saya git statustidak pernah memberi tahu saya seberapa jauh ke depan cabang saya .. apakah Anda memberikan beberapa argumen tambahan untuk itu?
Hasen
4
@ telah j: git statustidak pergi ke repositori jarak jauh untuk memeriksa apakah cabang jarak jauh telah diperbarui. Ini memberi tahu Anda seberapa jauh cabang lokal Anda dibandingkan dengan cabang pelacakan jarak jauh yang disimpan secara lokal . Masalahnya adalah bahwa normal git push(serta mengambil dan menarik) harus memperbarui cabang pelacakan jarak jauh dan bagi penanya ini tampaknya tidak berfungsi. Untuk melihat mengapa kita perlu melihat bentuk persis apa git pushyang sedang digunakan dan konfigurasi repositori lokal tetapi karena penanya telah menerima jawaban, saya tidak bisa melihat ini terjadi sekarang.
CB Bailey

Jawaban:

508

Jika Anda mendapatkan pesan ini setelah melakukan git pull remote branch, coba tindak lanjuti dengan a git fetch. (Secara opsional, jalankan git fetch -puntuk memangkas cabang yang dihapus dari repo)

Fetch tampaknya memperbarui representasi lokal dari cabang jarak jauh, yang belum tentu terjadi ketika Anda melakukan a git pull remote branch.

Kaya
sumber
1
Bravo. Itu benar-benar masalah. Saya mulai dengan membuat repositori di kode google. Lalu saya kloning repositori ini di laptop saya dan saya bekerja di sana dan mendorong perubahan, laptop => code.google. Saya biasa mendapatkan pesan ini di server saya di mana saya telah membuat kloning dari repositori kode code.google dan saya biasa menarik perubahan. Saya pikir fetch diperlukan untuk memperbarui basis data lokal.
rjha94
2
Kami memiliki masalah yang sama di sini karena cabang lain (A) menunjuk komit master yang sama. Menarik A dan kemudian menarik tuan menghasilkan situasi yang sama. Ketika git menarik A, komid diperbarui ke yang terakhir, jadi menarik master tidak ada yang benar-benar menarik, jadi git tidak memperbarui komitmen terakhir master dan memperingatkan tentang menjadi "di depan master".
Uberto
8
Terima kasih, meskipun saya memperhatikan satu hal aneh. "git fetch origin master" tidak membantu, tetapi "git fetch origin" tidak. Saya berada di cabang utama, jadi tidak yakin bagaimana "git fetch origin" akan melakukan sesuatu yang berbeda dalam konteksnya.
Parag
2
@Parag lihat stackoverflow.com/questions/26350876/... untuk penjelasan perbedaan antara kedua perintah tersebut, dan bagaimana mungkin memodifikasi file konfigurasi untuk mengubah perilaku sehingga git mengambil cabang jarak jauh juga memperbarui referensi cabang pelacakan jarak jauh, jadi git_status tidak melaporkan 'maju dengan'.
Anatortoise House
2
@ Parag, juga stackoverflow.com/questions/7365415/... jawabannya membahas detail ORIG_HEAD dan FETCH_HEAD yang tidak sinkron, menyebabkan peringatan status, dan kemungkinan koreksi file konfigurasi.
Anatortoise House
138

Menggunakan

git pull --rebase

Opsi --rebase berarti git akan memindahkan komit lokal Anda, menyinkronkan dengan remote dan kemudian mencoba menerapkan komit Anda dari keadaan baru.

Marian Zburlea
sumber
3
Cara yang sangat bagus untuk mencegah penggabungan yang tidak berguna dan memiliki pohon yang lebih bersih!
Hatef
1
Saya mencoba perintah ini, tetapi saya masih memiliki masalah yang sama ...$ git pull --rebase Current branch xyz is up to date. $ git status On branch xyz Your branch is ahead of 'origin/xyz' by 6 commits. (use "git push" to publish your local commits) nothing to commit, working tree clean
bbh
4
Jawaban ini salah: Jika Anda menggunakannya tanpa memahami situasinya, Anda berpotensi menghasilkan masalah untuk beberapa waktu ke depan (sejarah ditulis ulang!). Jika Anda memahami situasinya, ini tidak akan memperbaiki untuk itu. Tolong pikirkan sebelum Anda mengetik saat menggunakan git, dan jangan pernah menulis ulang sejarah tanpa berpikir!
cmaster - mengembalikan monica
80

Gunakan 3 perintah sederhana ini

Langkah 1 :git checkout <branch_name>

Langkah 2 :git pull -s recursive -X theirs

Langkah 3 :git reset --hard origin/<branch_name>

Lebih detail: https://stackoverflow.com/a/39698570/2439715

Nikmati.

Abhishek Goel
sumber
3
Ini adalah satu-satunya jawaban yang benar-benar memperbaiki masalah bagi saya. Perintah-perintah di atas secara aneh menjatuhkannya dari 12 ke 7 komit dan ini akhirnya menghilangkannya
Ieuan
1
Saya setuju bahwa ini menjadi satu-satunya hal yang berhasil untuk saya. Saya yakin GIT terkadang memiliki beberapa gangguan kepribadian.
ksed
11
Seperti @leuan, tidak ada yang bereskan git reset --hard origin/masterbagiku.
Dave Land
Sama di sini, ini adalah satu-satunya langkah yang berhasil untuk saya
Shard_MW
51

Saya pikir Anda salah membaca pesan - cabang Anda tidak di depan master, itu adalah master . Ini di depan origin/master, yang merupakan cabang pelacakan terpencil yang mencatat status repositori jauh dari terakhir Anda push, pullatau fetch. Ini memberi tahu Anda apa yang Anda lakukan; Anda unggul dari jarak jauh dan itu mengingatkan Anda untuk mendorong.

Josh Lee
sumber
22
Ini sebenarnya setelah saya mendorong. Saya harus menarik (atau mungkin mengambil?) Untuk mendapatkannya agar tidak memiliki pesan itu.
SeanJA
26

Seseorang berkata Anda mungkin salah membaca pesan Anda, Anda tidak salah. Masalah ini sebenarnya ada hubungannya dengan <project>/.git/configfile Anda . Di dalamnya akan ada bagian yang mirip dengan ini:

[remote "origin"]
    url = <url>
    fetch = +refs/heads/*:refs/remotes/origin/*

Jika Anda menghapus baris ambil dari file .git / config proyek Anda, Anda akan menghentikan "Cabang Anda di depan 'origin / master' dengan Nkomit." gangguan dari terjadi.

Atau begitulah yang saya harapkan. :)

Kode Palsu Monyet Rashid
sumber
Saya akan memeriksanya lain kali saya melihat ahead by x commitspesan itu. Saya belum melihat pesan dalam beberapa saat.
SeanJA
Saya belum melihat pesan dalam beberapa saat. Saya pikir itu karena saya sudah mulai membuat repo git secara lokal, kemudian mendorongnya ke repo jarak jauh alih-alih sebaliknya ...
SeanJA
Saya mencoba ini, tetapi itu membuat eGit di Eclipse mulai bermunculan dengan "kesalahan internal" ketika saya mencoba melakukan. Git sendiri sepertinya bekerja dengan baik.
user4815162342
18
Apa yang dilakukan garis itu? dan apa yang saya lewatkan dengan menghapusnya? (Terlepas dari gangguan)
John Mee
1
Ini berhasil, tetapi lebih seperti menekan kesalahan. Tambahkan garis kembali dan Anda akan mulai mendapatkan peringatan lagi.
Krishna Pandey
15

Saya memiliki masalah ini di server panggung saya di mana saya hanya melakukan penarikan. Dan hard reset membantu saya untuk membersihkan KEPALA yang sama dengan remote.

git reset --hard origin/master

Jadi sekarang saya punya lagi:

On branch master
Your branch is up-to-date with 'origin/master'.
Anatolii Pazhyn
sumber
Saya pertama kali mencoba tanpa bendera --hard dan berhasil!
kroiz
12

Ini berhasil untuk saya

git reset --hard origin/master

Outputnya harus seperti

On branch dev HEAD is now at ae1xc41z Last commit message

Али Палитаев
sumber
11

Dalam kasus saya itu karena saya beralih ke master menggunakan

 git checkout -B master

Hanya untuk menarik versi baru, alih-alih

 git checkout master

Perintah pertama mengatur ulang kepala master ke komit terbaru saya

Saya menggunakan

git reset --hard origin/master

Untuk memperbaikinya

AxCoder
sumber
9

Saya memeriksa setiap solusi di halaman ini, dan untungnya @ anatolii-pazhyn berkomentar karena solusinya yang berhasil. Sayangnya saya tidak memiliki cukup reputasi untuk mendukungnya, tetapi saya sarankan mencoba solusinya terlebih dahulu:

git reset --hard origin/master

Yang memberi saya:

HEAD is now at 900000b Comment from my last git commit here

Saya juga merekomendasikan:

git rev-list origin..HEAD
# to see if the local repository is ahead, push needed

git rev-list HEAD..origin
# to see if the local repository is behind, pull needed

Anda juga bisa menggunakan:

git rev-list --count --left-right origin/master...HEAD
# if you have numbers for both, then the two repositories have diverged

Semoga berhasil

Ryan Erwin
sumber
4

Saya memiliki masalah yang sama pada mesin Windows. Ketika saya menjalankan git pull origin masterperintah, saya akan mendapatkan peringatan "di depan 'asal / master' oleh X commit". Saya menemukan bahwa jika saya malah berlari git pull origindan TIDAK menentukan cabang, maka saya tidak akan lagi menerima peringatan.

Bapak Kode
sumber
Saya percaya ini efektif di git fetchbelakang layar.
Brian Peterson
"git fetch" tidak menyelesaikan masalah saya, ini berhasil. Saya mendapat daftar cabang yang baru ditambahkan dan pesan ini "Anda meminta untuk menarik dari remote 'upstream', tetapi tidak menentukan cabang. Karena ini bukan remote yang dikonfigurasi secara default untuk cabang Anda saat ini, Anda harus menentukan cabang pada perintah baris." dan perintah "git status" berikutnya tidak menunjukkan peringatan.
Krishna Pandey
2

Itu hanya mengingatkan Anda perbedaan antara cabang saat ini dan cabang yang melakukan trek saat ini. Harap berikan lebih banyak info, termasuk cabang apa yang dicetak dalam pesan dan di mana Anda mendorong / menarik cabang saat ini.

wRAR
sumber
2

Meskipun pertanyaan ini agak lama ... Saya berada dalam situasi yang sama dan jawaban saya di sini membantu saya memperbaiki masalah serupa yang saya miliki

Pertama coba dengan push -fatau opsi paksa

Jika itu tidak berhasil, ada kemungkinan bahwa (seperti dalam kasus saya) repositori jarak jauh (atau lebih tepatnya referensi ke repositori jarak jauh yang muncul git remote -v) mungkin tidak diperbarui.

Hasil di atas adalah push Anda disinkronkan lokal / cabang Anda dengan remote / cabang Anda namun, cache di repo lokal Anda masih menunjukkan komit sebelumnya (dari lokal / cabang ... asalkan hanya komit tunggal didorong) sebagai HEAD.

Untuk mengkonfirmasi klon di atas repo di lokasi yang berbeda dan mencoba untuk membandingkan HEAD lokal / cabang dan HEAD remote / cabang. Jika keduanya sama maka Anda mungkin menghadapi masalah yang saya lakukan.

Larutan:

$ git remote -v
github  [email protected]:schacon/hw.git (fetch)
github  [email protected]:schacon/hw.git (push)
$ git remote add origin git://github.com/pjhyett/hw.git
$ git remote -v
github  [email protected]:schacon/hw.git (fetch)
github  [email protected]:schacon/hw.git (push)
origin  git://github.com/pjhyett/hw.git (fetch)
origin  git://github.com/pjhyett/hw.git (push)
$ git remote rm origin
$ git remote -v
github  [email protected]:schacon/hw.git (fetch)
github  [email protected]:schacon/hw.git (push)

Sekarang lakukan push -fsebagai berikut

git push -f github master ### Perhatikan perintah Anda tidak originlagi!

Lakukan git pullsekarang git pull github master

pada saat git statusmenerima

# On branch master

nothing to commit (working directory clean)

Saya harap ini bermanfaat bagi seseorang karena jumlah penayangan sangat tinggi sehingga mencari kesalahan ini hampir selalu mencantumkan utas ini di bagian atas

Lihat juga gitref untuk detailnya

Vikram
sumber
2

Saya benar-benar mengalami ini ketika saya melakukan pergantian / checkout dengan TortiseGIT.

Masalah saya adalah bahwa saya telah membuat cabang berdasarkan cabang lokal lain. Itu membuat entri "gabungan" /.git/configyang terlihat seperti ini:

[branch "web"]
    merge = refs/heads/develop
    remote = gitserver

Di mana setiap kali saya beralih ke cabang "web", ia memberi tahu saya bahwa saya 100+ berkomitmen sebelum berkembang. Yah, saya tidak lagi berkomitmen untuk berkembang sehingga itu benar. Saya dapat menghapus entri ini dan tampaknya berfungsi seperti yang diharapkan. Itu benar pelacakan dengan remote ref daripada mengeluh tentang berada di belakang cabang mengembangkan

Seperti yang dikatakan Vikram, utas Stack Overflow ini adalah hasil teratas di Google ketika mencari masalah ini, jadi saya pikir saya akan membagikan situasi dan solusi saya.

Dustin Graham
sumber
2

Saya ingin mengulangi hal yang sama seperti yang disebutkan oleh @Marian Zburlia di atas. Itu bekerja untuk saya dan akan menyarankan hal yang sama kepada orang lain.

git pull origin develop

harus diikuti oleh $ git pull --rebase.

Ini akan menghapus komentar yang muncul $ git statussetelah penarikan terakhir.

Partho Chatterjee
sumber
2

git fetch akan menyelesaikan ini untuk Anda

Jika pemahaman saya benar, lokal Anda (dalam cache) origin/mastersudah usang. Perintah ini akan memperbarui status repositori dari server.

Guillaume Racicot
sumber
1
Silakan tambahkan deskripsi
Mathews Sunny
2

Kemudian ketika saya melakukan status git, ia memberi tahu saya bahwa cabang saya di depan dengan komit X (mungkin jumlah komit yang sama dengan yang saya buat ).

Pengalaman saya adalah dalam lingkungan tim dengan banyak cabang. Kami bekerja di cabang fitur kami sendiri (di klon lokal) dan itu adalah salah satu yang git statusmenunjukkan saya 11 berkomitmen di depan. Asumsi kerja saya, seperti penulis pertanyaan, adalah bahwa +11 berasal dari komitmen saya sendiri .

Ternyata saya telah menarik perubahan dari developcabang umum ke cabang fitur saya beberapa minggu sebelumnya - tetapi lupa! Ketika saya mengunjungi kembali cabang fitur lokal saya hari ini dan melakukan git pull origin developnomor melompat ke +41 komit di depan. Banyak pekerjaan yang telah dilakukan developdan cabang fitur lokal saya bahkan lebih maju dari cabang fitur pada originrepositori.

Jadi, jika Anda mendapatkan pesan ini, pikirkan kembali penarikan / penggabungan yang mungkin Anda lakukan dari cabang lain (Anda sendiri, atau orang lain) yang Anda miliki aksesnya. Pesan hanya sinyal Anda perlu git pushmerekapull ed perubahan kembali ke originrepo ( 'pelacakan cabang') dari repo lokal Anda untuk mendapatkan hal-hal disinkronkan up.

FPGA-guy
sumber
1

Jawaban yang menyarankan git pullatau git fetchbenar.
Pesan dihasilkan ketika git statusmelihat perbedaan antara .git/FETCH_HEADdan .git/refs/remotes/<repository>/<branch>(misalnya .git/refs/remotes/origin/master).

File terakhir mencatat HEAD dari pengambilan terakhir (untuk repositori / cabang). Melakukan git fetchpembaruan kedua file ke KEPALA cabang saat ini.
Tentu saja jika tidak ada yang perlu diambil (karena repositori lokal sudah terbaru) maka .git/FETCH_HEADtidak berubah.

NoBrassRing
sumber
Ini tampaknya tidak menjadi masalah bagi saya: .git/FETCH_HEADmengandung 9f7336c873ccffc772168bf49807e23ff74014d3 branch 'master' of URLdan .git/refs/remotes/origin/mastermengandung 9f7336c873ccffc772168bf49807e23ff74014d3, namun saya masih menerima pesan itu dan tidak git pulljuga tidak git fetchmenyelesaikannya
Davide
0

Jika Anda mendapatkan pesan ini setelah melakukan komit untuk membuka kembali file di cabang, coba buat beberapa perubahan pada file apa pun dan lakukan komit. Tampaknya Anda tidak dapat membuat komit tunggal yang hanya mencakup untracking file yang sebelumnya dilacak. Akhirnya posting ini membantu saya menyelesaikan seluruh masalah https://help.github.com/articles/removing-files-from-a-repository-s-history/ . Saya hanya perlu menghapus file dari riwayat repositori.

nurb
sumber