Git menggabungkan laporan "Sudah up-to-date" meskipun ada perbedaan

286

Saya memiliki repositori git dengan 2 cabang: master dan test.

Ada perbedaan antara cabang master dan test.

Kedua cabang memiliki semua perubahan yang dilakukan.

Jika aku melakukan:

git checkout master
tes git diff

Layar penuh perubahan muncul yang menunjukkan perbedaan. Saya ingin menggabungkan perubahan di cabang tes dan begitu juga:

git merge test

Tetapi dapatkan pesan "Sudah mutakhir"

Namun, memeriksa file di bawah masing-masing cabang berbeda jelas menunjukkan perbedaan.

Apa masalahnya di sini dan bagaimana cara mengatasinya?

Charles Darke
sumber
Apakah Anda memiliki kode modifikasi yang tidak berkomitmen?
Ozma
Apakah ini menjawab pertanyaan Anda? Mengapa Git mengatakan cabang master saya "sudah up to date" meskipun tidak?
Michael Freidgeim

Jawaban:

146

Pesan "Sudah diperbarui" berarti bahwa semua perubahan dari cabang yang Anda coba gabungkan telah digabungkan ke cabang yang saat ini Anda gunakan. Lebih khusus itu berarti cabang yang Anda coba gabungkan adalah induk dari cabang Anda saat ini . Selamat, itu penggabungan termudah yang pernah Anda lakukan. :)

Gunakan gitkuntuk melihat repositori Anda. Label untuk cabang "test" harus berada di bawah label cabang "master" Anda.

Cabang Anda mutakhir sehubungan dengan induknya. Menurut penggabungan tidak ada perubahan baru di induk sejak penggabungan terakhir. Itu tidak berarti cabang-cabangnya sama, karena Anda dapat memiliki banyak perubahan di cabang kerja Anda dan sepertinya Anda lakukan.

Sunting 10/12/2019:

Per Charles Drake dalam komentar untuk jawaban ini, salah satu solusi untuk memulihkan masalah adalah:

git checkout master
git reset --hard test

Ini membawanya kembali ke level 'test'.

Kemudian lakukan:

git push --force origin master

untuk memaksa perubahan kembali ke repo pusat.

Bombe
sumber
2
Holy cr * p! Kamu benar! Saya pikir apa yang terjadi adalah bahwa cabang lain (pengembangan tidak stabil) secara tidak benar digabungkan dengan master dan cabang uji adalah sub-set yang tidak stabil. Penggabungan yang saya coba buat adalah membawa master kembali ke level 'ujian'.
Charles Darke
2
Baik. Operasi itu tidak masuk akal sehingga Git menolak untuk melakukan apa pun. :)
Bombe
24
Apa yang saya lakukan sekarang adalah: git checkout master; git reset - uji keras; Ini membawanya kembali ke level 'test'. Saya kemudian melakukan "git push - force origin master" untuk memaksa perubahan kembali ke repo pusat.
Charles Darke
22
Akan lebih baik jika git mendapat peringatan untuk mengatakan "mencoba bergabung dengan orang tua".
Charles Darke
1
Mendorong cabang yang bukan keturunan dari cabang yang sudah ada di sisi terpencil dianggap sebagai hal yang buruk: Lihat diskusi di halaman manual untuk git-push dan git-pull.
Bombe
131

Ini sering terjadi pada saya ketika saya tahu ada perubahan pada master jarak jauh, jadi saya mencoba untuk menggabungkan mereka menggunakan git merge master. Namun, ini tidak bergabung dengan master jarak jauh, tetapi dengan master lokal Anda.

Jadi sebelum melakukan penggabungan, checkout master, dan kemudian di git pullsana. Maka Anda akan dapat menggabungkan perubahan baru ke cabang Anda.

ACarter
sumber
7
Adakah cara pengalihan cabang bisa dihindari, seperti melakukan tarikan cabang yang akan digabung sementara masih di cabang yang akan digabung, dan kemudian bergabung?
Japheth Ongeri - inkalimeva
Ahh, bagus. Saya pikir git fetchakan memperbarui cabang utama bahkan jika saya saat ini pada yang berbeda. Ternyata tidak. Terima kasih! Saya cukup yakin ada opsi untuk fetchitu memungkinkan Anda menentukan cabang mana yang akan Anda dapatkan.
Raik
1
@Raik Anda dapat melakukannya git fetch --all, tetapi ini hanya mengambil cabang, itu tidak menariknya.
Ingo Bürk
6
@ JaphethOngeri-inkalimeva Anda bisa melakukannya git fetch --all && git merge origin/master. Tidak perlu memperbarui lokal Anda masteruntuk menggabungkan perubahan jarak jauh.
Ingo Bürk
@ IngoBürk Saya memiliki 2 cabang, diperbarui dengan git merge master1 dan 1 dengan git merge origin/master. Saya juga sudah memeriksa masterdan git pullsebelum memperbarui 2 cabang. meskipun mereka berbagi konten yang sama, membuat PR antara 2 cabang menunjukkan beberapa file berbeda. Saya diperbaiki oleh git pullcabang target menjadi cabang fitur, yang menunjukkan: Already up to date! Merge made by the 'recursive' strategy.ini menghasilkan gabungan komit tanpa perubahan, tetapi menghapus file diff yang tidak terduga dari PR. tahu mengapa ada perbedaan antara menggabungkan cabang lokal dan remote "setara"?
wrapperapps
45

Katakanlah Anda memiliki cabang masterdengan riwayat komit berikut:

A -- B -- C -- D

Sekarang, Anda membuat tes cabang, mengerjakannya, dan melakukan 4 komitmen:


                 E -- F -- G -- H
                /
A -- B -- C -- D

masterHead menunjuk ke D, dan testhead menunjuk ke H.

Pesan "Sudah up-to-date" muncul ketika KEPALA cabang yang Anda gabungkan adalah induk dari rantai komit cabang yang ingin Anda gabungkan. Itulah masalahnya, di sini: Dadalah orangtua dari E.

Tidak ada yang menggabungkan dari testke master, karena tidak ada yang berubah pada mastersejak saat itu. Apa yang ingin Anda lakukan di sini adalah memberi tahu Git agar memiliki masterkepala yang mengarah ke H, sehingga cabang master memiliki sejarah komit sebagai berikut:

A -- B -- C -- D -- E -- F -- G -- H

Ini adalah pekerjaan untuk perintah Git reset. Anda juga ingin direktori kerja mencerminkan perubahan ini, sehingga Anda akan melakukan hard reset:

git reset --hard H
Marek Stanley
sumber
3
Saya telah diberitahu di masa lalu bahwa menggunakan git reset --hardadalah hal yang cukup drastis untuk dilakukan, bisakah kehilangan komitmen? Apakah ada cara yang lebih aman untuk melakukan perubahan ini, atau ada bahaya git reset --hardberlebihan?
Graham R. Armstrong
1
Perintah ini waras, jangan khawatir. Saya akan mengatakan satu-satunya hal yang perlu diperhatikan dengan --hardopsi adalah kenyataan bahwa itu benar-benar mengubah direktori kerja Anda, dan sebagai konsekuensinya, Anda kehilangan perubahan yang tidak dikomit. Secara pribadi, saya melakukan git statussebelum dan sesudah setiap perintah git yang dijalankan secara manual untuk memastikan repo saya bersih atau dalam kondisi yang diharapkan.
Marek Stanley
ini akan menghasilkan pesan status "Cabang Anda dan 'asal / master' telah menyimpang", bagaimana saya bisa mengatasinya?
Eido95
1
Saya berharap saya bisa memberi Anda lebih dari satu suara. Terima kasih!
KMC
Apakah ada --hardopsi yang dibutuhkan ? Saya sudah dalam situasi ini beberapa kali sekarang dan selalu reset tanpa --hard. Itu bekerja dengan baik tanpa risiko kehilangan perubahan yang tidak dikomit.
Casimir
16

Apa yang berhasil untuk saya, katakanlah Anda memiliki branch1 dan Anda ingin menggabungkannya menjadi branch2.

Anda membuka perintah git, buka folder root dari branch2 dan ketik:

git checkout branch1
git pull branch1
git checkout branch2
git merge branch1
git push

Jika Anda memiliki comflicts, Anda tidak perlu melakukan git push, tetapi pertama-tama pecahkan konflits dan kemudian dorong.

Stefan Pintilie
sumber
6

Penggabungan selalu antara HEAD saat ini dan satu atau lebih komit (biasanya, kepala cabang atau tag),
dan file indeks harus cocok dengan pohon komit HEAD (yaitu isi komit terakhir) ketika mulai.
Dengan kata lain, git diff --cached HEADharus melaporkan tidak ada perubahan.

Komitmen gabungan sudah terkandung di HEAD. Ini adalah kasus paling sederhana, yang disebut "Sudah mutakhir."

Itu berarti komit dalam ujian sudah digabung dalam master, tetapi karena komit lain dilakukan pada master, git diff testmasih akan memberikan beberapa perbedaan.

VONC
sumber
6

Ini terjadi karena salinan lokal cabang yang ingin Anda gabungkan ketinggalan zaman. Saya memiliki cabang saya, dipanggil MyBranchdan saya ingin menggabungkannya ProjectMaster.

_>git status
On branch MyBranch-Issue2
Your branch is up-to-date with 'origin/MyBranch-Issue2'.

nothing to commit, working tree clean

_>git merge ProjectMaster
Already up-to-date.

Tetapi saya tahu bahwa ada perubahan yang perlu digabungkan!

Begini, ketika saya mengetik git merge ProjectMaster, git melihat salinan lokal saya dari cabang ini, yang mungkin tidak mutakhir . Untuk melihat apakah ini yang terjadi, saya pertama-tama memberi tahu Git untuk memeriksa dan melihat apakah cabang-cabang saya ketinggalan zaman dan mengambil perubahan apa pun jika menggunakan, eh fetch,. Lalu saya melompat ke cabang saya ingin bergabung untuk melihat apa yang terjadi di sana ...

_>git fetch origin

_>git checkout ProjectMaster
Switched to branch ProjectMaster
**Your branch is behind 'origin/ProjectMaster' by 85 commits, and can be fast-forwarded.**
  (use "git pull" to update your local branch)

Ah-ha! Salinan lokal saya basi oleh 85 commit, yang menjelaskan semuanya! Sekarang, saya Pullturunkan perubahan yang saya lewatkan, lalu naik ke MyBranchdan coba penggabungan lagi.

_>git pull
Updating 669f825..5b49912
Fast-forward

_>git checkout MyBranch-Issue2
Switched to branch MyBranch-Issue2
Your branch is up-to-date with 'origin/MyBranch-Issue2'.

_>git merge ProjectMaster
Auto-merging Runbooks/File1.ps1
CONFLICT (content): Merge conflict in Runbooks/Runbooks/File1.ps1

Automatic merge failed; fix conflicts and then commit the result.

Dan sekarang saya punya masalah lain untuk diperbaiki ...

FoxDeploy
sumber
5

Ini terjadi pada saya karena anehnya GIT berpikir bahwa cabang lokal berbeda dari cabang terpencil. Ini terlihat dalam grafik cabang: ini menampilkan dua cabang yang berbeda: remote / origin / branch_name dan branch_name.

Solusinya adalah menghapus repo lokal dan mengkloningnya dari jarak jauh. Dengan cara ini GIT akan mengerti bahwa remote / origin / branch_name> dan branch_name memang sama, dan saya bisa mengeluarkan git merge branch_name.

rm <my_repo>
git clone <my_repo>
cd <my_repo>
git checkout <branch_name>
git pull
git checkout master
git merge <branch_name>
cdupont
sumber
Bukankah ini jawaban yang sama persis dengan jawaban Acarter?
Andrew C
Saya pikir Acarter benar-benar melewatkan poin - tidak ada perubahan pada remote - itu bukan masalah sama sekali. Saya perlu "git checkout master" dan kemudian "git merge <branch_name>" untuk memaksa penggabungan fast-forward. Sebaliknya tidak melakukan apa-apa karena cabang berada di depan tuannya. Jawaban Bombe adalah penjelasan yang bagus tetapi tidak pernah menjawab bagian "bagaimana cara mengatasinya".
MrMas
5

git merge origin/masteralih-alih git merge masterbekerja untuk saya. Jadi untuk menggabungkan master ke cabang fitur, Anda dapat menggunakan:

git checkout feature_branch
git merge origin/master
Justas
sumber
5

Pastikan untuk checkout cabang yang ingin Anda gabungkan dulu dan kemudian tarik (jadi versi lokal Anda cocok dengan versi jarak jauh).

Kemudian checkout kembali ke cabang tempat Anda ingin melakukan penggabungan dan git merge Anda akan berfungsi.

John Murphy
sumber
1
Ini untuk saya - saya melakukan tarikan sementara di master; harus tahu bahwa saya mendapat komitmen baru di "cabang". Mencoba menggabungkan "cabang" menjadi master - "Sudah up to date". Apakah git checkout "branch" - mendapat "branch Anda ada di belakang ... dan dapat diteruskan dengan cepat.", Yang berarti saya perlu memperbarui "branch" dengan menjalankannya git pulldi "branch"
sdbbs
3

senang kepada saya dan dikirim ke halaman ini, tidak yakin apakah saya memiliki skenario yang sama, tetapi milik saya adalah saya yang mencoba "menggabungkan kembali" cabang "uji" itu.

Jadi saya sebelumnya menggabungkannya tetapi saya sengaja mengecualikan beberapa perubahan spesifik selama penggabungan itu, sehingga jelas memiliki beberapa perbedaan antar cabang. Saya kemudian mencoba untuk menggabungkan kembali karena saya menyadari / lupa bahwa saya seharusnya dan ingin menambahkan perubahan / file tertentu yang sebelumnya saya kecualikan dan saya berharap jika saya melakukan penggabungan lagi akan menunjukkan semua perubahan yang saya kecualikan sebelumnya , tapi saya salah dan saya mendapat pesan "Sudah mutakhir".

Setelah membaca @ Bombe komentar / jawaban, dia benar, dan git saya pikir berperilaku seperti itu, jadi apa yang saya lakukan adalah membuat cadangan keras dari file pada cabang uji, kemudian checkout cabang master dan secara manual menempelkan file di dalamnya dan melakukan seolah-olah itu adalah perubahan baru.

Saya tidak yakin apakah ini cara yang benar atau dapat membantu orang lain memiliki masalah yang sama, tetapi memang memberikan solusi untuk kasus khusus saya.

bubjavier
sumber
Situasi yang sama di sini. Skenarionya adalah saya ingin membagi cabang "integrasi" kembali ke beberapa cabang "fitur".
Yadli
2
Alih-alih pasta manual, Anda dapat checkout file langsung dari salah satu cabang ke cabang saat ini: git checkout srcBranch -- path/to/file. Dapat menggunakan file gumpalan juga.
Todd
Terima kasih, saya menggunakan metode checkout Anda, tetapi saya menaruh checkout srcBranch -- *dan kemudian melihat diff saya
portforwardpodcast
2

Jika menggabungkan cabang A ke cabang B melaporkan "Sudah up to date", sebaliknya tidak selalu benar. Memang benar hanya jika cabang B adalah keturunan dari cabang A, jika tidak cabang B hanya dapat memiliki perubahan yang tidak ada di A.

Contoh:

  1. Anda membuat cabang A dan B dari master
  2. Anda membuat beberapa perubahan dalam master dan menggabungkan perubahan ini hanya menjadi cabang B (tidak memperbarui atau lupa memperbarui cabang A).
  3. Anda membuat beberapa perubahan di cabang A dan menggabungkan A ke B.

Pada titik ini, penggabungan A ke B melaporkan "Sudah up to date" tetapi cabang-cabangnya berbeda karena cabang B memiliki pembaruan dari master sedangkan cabang A tidak.

Stan Bashtavenko
sumber
2

Menghadapi skenario ini menggunakan Git Bash.

Repositori kami memiliki banyak cabang dan setiap cabang memiliki siklus komit yang berbeda dan penggabungan terjadi sesekali. Old_Branch digunakan sebagai induk untuk New_Branch

Old_Branch telah diperbarui dengan beberapa perubahan yang perlu digabungkan dengan New_Branch

Sedang menggunakan perintah pull di bawah ini tanpa cabang untuk mendapatkan semua sumber dari semua cabang.

git tarik asalnya

Anehnya ini tidak menarik semua komitmen dari semua cabang. Sudah memikirkannya sehingga ditunjukkan menunjukkan hampir semua cabang dan tag.

Jadi untuk memperbaiki ini telah memeriksa Old_Branch menarik menggunakan terbaru

git checkout Old_Branch

git tarik asal Old_Branch

Sekarang periksa New_Branch

git checkout New_Branch

Menariknya untuk memastikan

git tarik asal New_Branch

git menggabungkan Old_Branch

Dan viola mendapat konflik untuk diperbaiki dari Old_Branch ke New_Branch :) yang diharapkan

satlead
sumber
0

Hal yang sama terjadi pada saya. Tetapi skenarionya sedikit berbeda, saya memiliki cabang utama, dan saya mengukir release_1 (katakanlah) darinya. Buat beberapa perubahan di cabang release_1 dan gabungkan menjadi asalnya. kemudian saya melakukan ssh dan pada server jarak jauh saya kembali checkout release_1 menggunakan perintah git checkout -b release_1 - yang sebenarnya mengukir branch_ release baru! dari master alih-alih memeriksa rilis branch_1 yang sudah ada dari asal. Memecahkan masalah dengan menghapus saklar "-b"

Deepika Anand
sumber
0

Saya memiliki masalah yang sama. Saya memiliki perubahan di remote dan itu masih menunjukkan "Sudah up to date". Rekloning repositori memperbaiki masalah untuk saya.

Mohammad Rayan
sumber
0

Konyol tapi itu mungkin terjadi. Misalkan nama cabang Anda diawali dengan referensi masalah (misalnya #91-fix-html-markup), jika Anda melakukan penggabungan ini:

$ git merge #91-fix-html-markup

itu tidak akan berfungsi sebagaimana dimaksud karena semuanya setelah #diabaikan, karena #memulai komentar sebaris.

Dalam hal ini Anda dapat mengubah nama Menghilangkan cabang #atau menggunakan tanda kutip tunggal untuk mengelilingi nama cabang: git merge '#91-fix-html-markup'.

Paolo
sumber