Saya bekerja dengan pengembang lain dalam sebuah proyek, dan kami menggunakan Github sebagai repo jarak jauh kami. Saya menggunakan Mac menggunakan git 1.7.7.3, dia menggunakan Windows menggunakan git 1.7.6.
Inilah yang terjadi
- Salah satu dari kami (sebut saja dia developer A, tapi tidak masalah yang mana) mendorong satu set commit ke GitHub.
- Yang lainnya (pengembang B) membuat beberapa komitmen lokal.
- B melakukan a
git pull
. - B melakukan a
git push
. - Melihat log riwayat komit, saya melihat Gabungkan cabang 'master' dari github.com:foo/bar
Log komit dikotori dengan pesan "Gabungkan cabang" dari waktu ke waktu, dan juga menunjukkan pengembang B sebagai melakukan perubahan yang dibuat oleh pengembang A. Satu-satunya cara yang kami temukan untuk mencegah masalah ini adalah dengan melakukan git pull --rebase
langkah 3, tetapi saya tidak tahu efek samping apa yang akan ditimbulkan oleh rebasing. Ini pertama kalinya saya mengerjakan repo git multi-developer, jadi apakah ini hanya perilaku normal? Ada pemikiran tentang cara mengatasi masalah ini?
git log --no-merges
Jawaban:
Komitmen yang Anda lihat baik-baik saja. A
pull
berjalan secara efektifgit fetch
dan kemudiangit merge
penggabungan biasanya terjadi saat Anda menjalankangit pull
.Alternatif untuk menggunakan rebasing daripada penggabungan dimungkinkan, tetapi biasanya Anda harus menghindarinya. Rebasing memungkinkan Anda menyimpan riwayat linier, tetapi juga menghapus informasi apa pun tentang percabangan yang awalnya terjadi. Ini juga akan menyebabkan riwayat cabang saat ini ditulis ulang, membuat ulang semua komit yang tidak terdapat dalam cabang target (dalam kasus Anda, remote). Karena komit yang dibuat ulang adalah komit yang berbeda , ini dapat menyebabkan banyak kebingungan saat mengembangkan bersama dengan yang lain, terutama saat orang sudah memeriksa bagian dari komit tersebut sebelum ditulis ulang (misalnya dengan cabang fitur). Jadi sebagai aturan praktis, Anda tidak boleh menulis ulang komit apa pun yang sudah didorong.
Komit yang Anda lihat ada untuk menggabungkan dua (atau lebih) cabang. Tidak masalah untuk memiliki komit yang tidak melakukan apa-apa selain menggabungkan beberapa cabang. Bahkan itu membuatnya sangat jelas saat Anda memiliki komit gabungan yang menggabungkan cabang saat melihat riwayat. Dibandingkan dengan rebasing, penggabungan juga memungkinkan Anda melihat riwayat asli secara efektif saat dikembangkan, termasuk cabang sebenarnya yang hidup berdampingan.
Singkat cerita: Ya, memiliki komit gabungan tidak apa-apa dan Anda tidak perlu mengkhawatirkannya.
sumber
Jawaban ini telah direvisi, karena pemahaman, diagram, dan kesimpulan saya salah.
git pull
menyebabkan merge commit karena git sedang menggabungkan. Ini dapat diubah dengan mengatur cabang Anda untuk menggunakan rebase daripada merge. Menggunakan rebase daripada merge on a pull memberikan histori yang lebih linier ke repositori bersama. Di sisi lain, komit gabungan menunjukkan upaya pengembangan paralel di cabang.Misalnya, dua orang bekerja di cabang yang sama. Cabang dimulai sebagai:
Orang pertama menyelesaikan pekerjaannya dan mendorong ke cabang:
Orang kedua menyelesaikan pekerjaan mereka dan ingin mendorong, tetapi tidak bisa karena mereka perlu memperbarui. Repositori lokal untuk orang kedua terlihat seperti:
Jika tarikan diatur untuk digabungkan, repositori orang kedua akan terlihat seperti ini.
Dimana M1 adalah komit gabungan. Sejarah cabang baru ini akan didorong ke repo. Jika sebaliknya, tarikan diatur ke rebase, repo lokal akan terlihat seperti:
Tidak ada komit gabungan. Sejarah telah dibuat lebih linier.
Kedua pilihan tersebut mencerminkan sejarah cabang tersebut. git memungkinkan Anda untuk memilih riwayat mana yang Anda sukai.
Memang ada tempat di mana rebase dapat menyebabkan masalah dengan cabang yang jauh. Ini bukan salah satu dari kasus tersebut. Kami lebih suka menggunakan rebase karena ini menyederhanakan riwayat cabang yang sudah rumit serta menunjukkan versi riwayat yang berhubungan dengan repositori bersama.
Anda dapat menyetel branch.autosetuprebase = selalu agar git secara otomatis membuat cabang jarak jauh Anda sebagai rebase, bukan master.
Pengaturan ini menyebabkan git secara otomatis membuat pengaturan konfigurasi untuk setiap cabang jarak jauh:
Anda dapat menyetelnya sendiri untuk cabang jarak jauh Anda yang sudah disiapkan.
Saya ingin berterima kasih kepada @LaurensHolst karena telah mempertanyakan dan mengejar pernyataan saya sebelumnya. Saya pasti telah belajar lebih banyak tentang bagaimana git bekerja dengan komit pull and merge.
Untuk informasi lebih lanjut tentang merge commits, Anda dapat membaca Berkontribusi pada Proyek di ProGit-Book . Bagian Tim Kecil Pribadi menunjukkan komitmen gabungan.
sumber
Anda dapat melakukan:
Namun, ini akan selalu menempatkan perubahan Anda di atas kolaborator Anda. Tapi Anda tidak akan mendapatkan pesan gabungan yang mencemari.
sumber
Sebenarnya ada jawaban yang lebih sederhana untuk ini. Mintalah pengembang B melakukan penarikan SEBELUM membuat komitmennya. Ini akan mencegah komit penggabungan tersebut, karena disebabkan oleh riwayat yang Anda buat di repo lokal dari komit lokal Anda yang mencoba untuk menggabungkan dengan riwayat komit pada repo jarak jauh. Jika Anda mendapatkan pesan yang mengatakan sesuatu di sepanjang baris 'perubahan akan ditimpa' saat melakukan penarikan, itu berarti Anda berdua menyentuh file yang sama, jadi lakukan:
maka Anda dapat menyelesaikan konflik penggabungan jika ada.
sumber
stash
hadapan Andapull
. Ugh git mengharuskan saya untuk berada di puncak permainan saya sepanjang waktu.git pull --rebase
mengintegrasikan perubahan jarak jauh sebelum perubahan lokal, apa pun.Melakukan git pull akan memasukkan pesan "Merge branch", itulah yang dilakukannya. Dengan melakukan git pull, Anda telah menggabungkan cabang jarak jauh ke cabang lokal Anda.
Saat Anda melakukan git pull dan terjadi konflik, git log akan menampilkan pembaruan ke file yang konflik sebagai berasal dari pengguna yang menyelesaikan konflik. Saya berasumsi ini karena orang yang memperbaiki konflik melakukan kembali file tersebut.
Sejauh yang saya tahu, begitulah cara kerja git, dan tidak ada jalan lain.
Rebasing akan menghapus riwayat git, jadi Anda tidak akan dapat melihat saat penggabungan terjadi.
sumber