Entah bagaimana majikan saya dan cabang asal / master saya telah menyimpang.
Saya sebenarnya tidak ingin mereka menyimpang.
Bagaimana saya bisa melihat perbedaan ini dan menggabungkannya?
Entah bagaimana majikan saya dan cabang asal / master saya telah menyimpang.
Saya sebenarnya tidak ingin mereka menyimpang.
Bagaimana saya bisa melihat perbedaan ini dan menggabungkannya?
Jawaban:
Anda dapat meninjau perbedaannya dengan:
git log HEAD..origin/master
sebelum menariknya (ambil + gabung) (lihat juga "Bagaimana Anda membuat git selalu menarik dari cabang tertentu?" )
Ketika Anda memiliki pesan seperti:
"Cabang dan 'asal / master' Anda masing-masing berbeda, # dan memiliki 1 dan 1 komitmen yang berbeda."
, periksa apakah Anda perlu memperbaruiorigin
. Jika origin
up-to-date, maka beberapa komit telah didorong ke origin
dari repo lain saat Anda membuat komit Anda sendiri secara lokal.
... o ---- o ---- A ---- B origin/master (upstream work)
\
C master (your work)
Anda mendasarkan komit C pada komit A karena itu adalah pekerjaan terbaru yang Anda ambil dari hulu pada saat itu.
Namun, sebelum Anda mencoba untuk mendorong kembali ke asal, orang lain mendorong komit B.
Riwayat pengembangan telah menyimpang ke jalur yang terpisah.
Anda kemudian dapat menggabungkan atau rebase. Lihat Pro Git: Git Branching - Rebasing untuk detailnya.
Menggabungkan
Gunakan perintah git merge:
$ git merge origin/master
Ini memberitahu Git untuk mengintegrasikan perubahan dari origin/master
dalam pekerjaan Anda dan membuat komit gabungan.
Grafik sejarah sekarang terlihat seperti ini:
... o ---- o ---- A ---- B origin/master (upstream work)
\ \
C ---- M master (your work)
Penggabungan baru, komit M, memiliki dua orang tua, masing-masing mewakili satu jalur pengembangan yang mengarah ke konten yang tersimpan di komit itu.
Perhatikan bahwa sejarah di balik M sekarang non-linear.
Rebase
Gunakan perintah git rebase:
$ git rebase origin/master
Ini memberi tahu Git untuk mengulang komit C (pekerjaan Anda) seolah-olah Anda telah mendasarkannya pada komit B alih-alih A.
CVS dan pengguna Subversion secara rutin mengubah perubahan lokal mereka di atas pekerjaan hulu saat mereka memperbarui sebelum komit.
Git hanya menambahkan pemisahan eksplisit antara langkah komit dan rebase.
Grafik sejarah sekarang terlihat seperti ini:
... o ---- o ---- A ---- B origin/master (upstream work)
\
C' master (your work)
Komit C 'adalah komit baru yang dibuat oleh perintah git rebase.
Ini berbeda dari C dalam dua cara:
Perhatikan bahwa sejarah di balik C 'masih linier.
Kami telah memilih (untuk saat ini) untuk hanya mengizinkan riwayat linear di cmake.org/cmake.git
.
Pendekatan ini mempertahankan alur kerja berbasis CVS yang digunakan sebelumnya dan dapat memudahkan transisi.
Upaya memasukkan C 'ke dalam repositori kami akan berhasil (dengan asumsi Anda memiliki izin dan tidak ada yang mendorong saat Anda melakukan rebasing).
Perintah git pull menyediakan cara cepat untuk mengambil dari asal dan melakukan rebase pada pekerjaan lokal di dalamnya:
$ git pull --rebase
Ini menggabungkan langkah-langkah ambil dan rebase di atas menjadi satu perintah.
git reset --hard HEAD
hanya akan menghapus modifikasi tidak berkomitmen yang diindeks lokal, dan tidak akan melakukan apa pun untuk mendamaikan perbedaan antara komitmen lokal dan jarak jauh . Hanya gabungan atau rebase yang akan menyatukan dua set komit (yang lokal dan yang jauh).
master
menunjukkan B
contoh Anda.
git reset --hard origin/master
seperti yang disebutkan dalam jawaban di bawah ini: stackoverflow.com/a/8476004/6309
Saya memiliki ini dan saya bingung tentang apa yang menyebabkannya, bahkan setelah membaca tanggapan di atas. Solusi saya adalah melakukan
git reset --hard origin/master
Kemudian itu hanya me-reset salinan master (lokal) saya (yang saya anggap kacau) ke titik yang benar, sebagaimana diwakili oleh (remote) asal / master.
PERINGATAN : Anda akan kehilangan semua perubahan yang belum didorong ke
origin/master
.
git reflog
atau melihatnya gitk --all
. Namun, tentu saja hard reset adalah hal lain selain rebase.
git pull --rebase origin/master
adalah satu perintah yang dapat membantu Anda sebagian besar waktu.
Sunting: Menarik komit dari sumber / master dan menerapkan perubahan Anda pada riwayat cabang yang baru ditarik.
Saya menemukan diri saya dalam situasi ini ketika saya mencoba untuk rebase cabang yang melacak cabang terpencil, dan saya mencoba untuk rebase pada master. Dalam skenario ini jika Anda mencoba melakukan rebase, kemungkinan besar cabang Anda berbeda dan bisa membuat kekacauan yang bukan untuk git nube!
Katakanlah Anda berada di cabang my_remote_tracking_branch, yang bercabang dari master
$ git status
# Di cabang my_remote_tracking_branch
tidak ada yang berkomitmen (direktori kerja bersih)
Dan sekarang Anda mencoba untuk rebase dari master sebagai:
git rebase master
BERHENTI SEKARANG dan selamatkan diri Anda dari masalah! Alih-alih, gunakan gabungan sebagai:
git merge master
Ya, Anda akan berakhir dengan komitmen ekstra di cabang Anda. Tetapi kecuali jika Anda siap untuk "un-diverging" branch, ini akan menjadi alur kerja yang jauh lebih lancar daripada rebasing. Lihat blog ini untuk penjelasan yang lebih rinci.
Di sisi lain, jika cabang Anda hanya cabang lokal (yaitu belum didorong ke remote) Anda pasti harus melakukan rebase (dan cabang Anda tidak akan menyimpang dalam hal ini).
Sekarang jika Anda membaca ini karena Anda sudah berada dalam skenario "menyimpang" karena rebase tersebut, Anda dapat kembali ke komit terakhir dari asal (yaitu dalam keadaan tidak-menyimpang) dengan menggunakan:
git reset --barang asli / my_remote_tracking_branch
rebase
jika cabang yang Anda rebiling belum diterbitkan (dan digunakan oleh orang lain). Kalau tidak, gunakan merge
. Jika Anda rebase cabang yang sudah diterbitkan (dan digunakan), Anda harus mengoordinasikan konspirasi untuk menulis ulang sejarah di setiap pengembang yang telah menggunakan cabang Anda.
git rebase master
...
git reset --hard origin/my_remote_tracking_branch
adalah apa yang benar-benar bekerja
Dalam kasus saya di sini adalah apa yang saya lakukan untuk menyebabkan pesan yang berbeda : Saya lakukan git push
tetapi kemudian git commit --amend
menambahkan sesuatu ke pesan komit. Kemudian saya juga melakukan komitmen lain.
Jadi dalam kasus saya itu hanya berarti asal / master sudah ketinggalan zaman. Karena saya tahu tidak ada orang lain yang menyentuh asal / master, perbaikannya sepele: git push -f
(di mana -f
berarti kekuatan)
git push -f
menimpa perubahan yang sebelumnya dilakukan dan didorong ke asal. Saya juga yakin tidak ada orang lain yang menyentuh repositori.
Dalam kasus saya, saya telah mendorong perubahan origin/master
dan kemudian menyadari saya seharusnya tidak melakukannya :-( Ini rumit oleh fakta bahwa perubahan lokal dalam subtree. Jadi saya kembali ke komitmen baik terakhir sebelum lokal "buruk" perubahan (menggunakan SourceTree) dan kemudian saya mendapat "pesan divergensi".
Setelah memperbaiki kekacauan saya secara lokal (detailnya tidak penting di sini) saya ingin "mundur dalam waktu" origin/master
cabang jarak jauh sehingga akan disinkronkan dengan lokal master
lagi. Solusi dalam kasus saya adalah:
git push origin master -f
Perhatikan -f
sakelar (paksa). Ini menghapus "perubahan buruk" yang didorong origin/master
oleh kesalahan dan sekarang cabang lokal dan jarak jauh disinkronkan.
Harap diingat bahwa ini adalah operasi yang berpotensi merusak jadi lakukan hanya jika Anda yakin 100% bahwa "mundur" master jarak jauh dalam waktu adalah OK.
You are not allowed to force push code to a protected branch on this project.
. Saya mencoba mendorong ke garpu.
Saya tahu ada banyak jawaban di sini, tetapi saya pikir git reset --soft HEAD~1
patut mendapat perhatian, karena itu memungkinkan Anda menjaga perubahan di komit lokal terakhir (tidak didorong) sambil menyelesaikan keadaan yang berbeda. Saya pikir ini adalah solusi yang lebih fleksibel daripada menarikrebase
, karena komit lokal dapat ditinjau dan bahkan dipindahkan ke cabang lain.
Kuncinya adalah menggunakan --soft
, bukannya keras --hard
. Jika ada lebih dari 1 komit, variasi HEAD~x
harus bekerja. Jadi, inilah semua langkah yang memecahkan situasi saya (saya punya 1 komit lokal dan 8 komit di remote):
1) git reset --soft HEAD~1
untuk membatalkan komit lokal. Untuk langkah selanjutnya, saya telah menggunakan antarmuka di SourceTree, tapi saya pikir perintah berikut juga harus berfungsi:
2) git stash
untuk menyembunyikan perubahan dari 1). Sekarang semua perubahan aman dan tidak ada perbedaan lagi.
3) git pull
untuk mendapatkan perubahan jarak jauh.
4) git stash pop
atau git stash apply
untuk menerapkan perubahan simpanan terakhir, diikuti oleh komit baru, jika diinginkan. Langkah ini opsional, bersama dengan 2) , ketika ingin membuang perubahan di komit lokal. Juga, ketika ingin komit ke cabang lain, langkah ini harus dilakukan setelah beralih ke yang diinginkan.
pull --rebase
akan tersimpan secara otomatis. stackoverflow.com/a/30209750/6309
Untuk melihat perbedaan:
git difftool --dir-diff master origin/master
Ini akan menampilkan perubahan atau perbedaan antara dua cabang. Dalam araxis (Favorit saya) ini menampilkannya dalam gaya folder berbeda. Menampilkan masing-masing file yang diubah. Saya kemudian dapat mengklik file untuk melihat detail dari perubahan dalam file.
Dalam kasus saya ini disebabkan oleh tidak melakukan resolusi konflik saya.
Masalahnya disebabkan oleh menjalankan git pull
perintah. Perubahan asal menyebabkan konflik dengan repo lokal saya, yang saya selesaikan. Namun, saya tidak melakukan itu. Solusi pada titik ini adalah melakukan perubahan (git commit
file yang diselesaikan)
Jika Anda juga telah memodifikasi beberapa file sejak menyelesaikan konflik, git status
perintah akan menampilkan modifikasi lokal sebagai modifikasi lokal yang tidak dipentaskan dan menggabungkan resolusi sebagai modifikasi lokal yang dipentaskan. Ini dapat diselesaikan dengan benar dengan melakukan perubahan dari penggabungan terlebih dahulu git commit
, kemudian menambahkan dan melakukan perubahan yang tidak dipentaskan seperti biasa (misalnya dengan git commit -a
).
Saya memiliki pesan yang sama ketika saya mencoba untuk mengedit pesan komit terakhir, dari sudah mendorong komit, menggunakan: git commit --amend -m "New message"
Ketika saya mendorong perubahan menggunakan git push --force-with-lease repo_name branch_name
tidak ada masalah.
Temui masalah ini ketika saya membuat cabang berdasarkan cabang A oleh
git checkout -b a
dan kemudian saya mengatur aliran cabang a ke asal cabang B oleh
git branch -u origin/B
Lalu saya mendapat pesan kesalahan di atas.
Salah satu cara untuk mengatasi masalah ini bagi saya adalah,
git checkout -b b origin/B