Saat menggabungkan cabang topik "B" menjadi "A" menggunakan git merge
, saya mendapatkan beberapa konflik. Saya tahu semua konflik dapat diselesaikan menggunakan versi di "B".
Saya sadar git merge -s ours
. Tetapi yang saya inginkan adalah sesuatu seperti git merge -s theirs
.
Mengapa itu tidak ada? Bagaimana saya bisa mencapai hasil yang sama setelah penggabungan yang bertentangan dengan git
perintah yang ada ? ( git checkout
setiap file yang tidak dihapus dari B)
UPDATE: "solusi" hanya membuang apa pun dari cabang A (titik komit gabungan ke versi B dari pohon) bukan yang saya cari.
git merge -s their
.git merge -s theirs
(yang dapat dicapai dengan mudah dengangit merge -s ours
dan cabang sementara), karena -saya sepenuhnya mengabaikan perubahan gabungan-dari cabang ...theirs
tambahanours
??? Ini adalah gejala dari salah satu masalah teknik dan desain tingkat tinggi di Git: inkonsistensi.Jawaban:
Tambahkan
-X
opsi ketheirs
. Sebagai contoh:Semuanya akan bergabung dengan cara yang diinginkan.
Satu-satunya hal yang saya lihat menyebabkan masalah adalah jika file dihapus dari branchB. Mereka muncul sebagai konflik jika sesuatu selain git menghapusnya.
Cara mengatasinya mudah. Jalankan saja
git rm
dengan nama semua file yang telah dihapus:Setelah itu,
-X theirs
seharusnya bekerja seperti yang diharapkan.Tentu saja, melakukan penghapusan aktual dengan
git rm
perintah akan mencegah konflik terjadi di tempat pertama.Catatan : Opsi formulir yang lebih panjang juga ada.
Untuk menggunakannya, ganti:
dengan:
sumber
theirs
". -Xtheirs adalah opsi strategi yang diterapkan untuk strategi rekursif . Ini berarti bahwa strategi rekursif masih akan menggabungkan apa pun yang ia bisa, dan hanya akan kembali ke logika "mereka" jika terjadi konflik. Walaupun inilah yang dibutuhkan dalam kebanyakan kasus seperti di atas, ini tidak sama dengan "ambil semuanya dari cabang B apa adanya". Itu memang menggabungkan sebenarnya.Solusi yang mungkin dan teruji untuk menggabungkan branchB ke branchA check-out kami:
Untuk mengotomatiskannya, Anda dapat membungkusnya menjadi skrip menggunakan branchA dan branchB sebagai argumen.
Solusi ini melindungi orang tua pertama dan kedua dari gabungan komit, seperti yang Anda harapkan
git merge -s theirs branchB
.sumber
git reset --soft branchA
?git reset --hard
perubahan yang komitbranchA
menunjuk ke.Versi git yang lebih lama memungkinkan Anda untuk menggunakan strategi gabungan "mereka":
Tapi ini sejak itu telah dihapus, seperti yang dijelaskan dalam pesan ini oleh Junio Hamano (pengelola Git). Seperti tercantum dalam tautan, Anda justru akan melakukan ini:
Namun waspadalah, ini berbeda dari gabungan sebenarnya. Solusi Anda mungkin adalah opsi yang benar-benar Anda cari.
sumber
git reset --hard origin
solusi untuk penggabungan gaya mereka? Jika saya ingin menggabungkan BranchB ke BranchA (seperti dalam jawaban Alan W. Smith), bagaimana saya melakukannya dengan menggunakanreset
metode ini?git reset --hard
penggabungan gaya "milik mereka". Tentu saja,git reset --hard
tidak membuat komit gabungan, atau komit apa pun dalam hal ini. Maksudnya adalah bahwa kita tidak boleh menggunakan gabungan untuk mengganti apa pun di HEAD dengan sesuatu yang lain. Tapi saya tidak setuju.theirs
telah dihapus karena alasan itu tidak lengkap. Itu gagal untuk memungkinkan contoh-contoh di mana kode itu baik, hanya saja hulu dipertahankan berdasarkan filosofis yang berbeda, jadi dalam pengertian itu 'buruk', jadi orang ingin tetap mengikuti perkembangan hulu, tetapi pada saat yang sama mempertahankan 'perbaikan' kode yang baik [git & msysgit memiliki beberapa 'konflik' ini karena filosofi platform target mereka yang berbeda]theirs
karena saya tidak sengaja mengubah beberapa file di dua cabang terpisah dan ingin membuang perubahan satu tanpa harus secara manual melakukannya untuk setiap file.Tidak sepenuhnya jelas apa hasil yang Anda inginkan, sehingga ada beberapa kebingungan tentang cara "benar" melakukannya dalam jawaban dan komentar mereka. Saya mencoba memberikan ikhtisar dan melihat tiga opsi berikut:
Coba gabungkan dan gunakan B untuk konflik
Ini bukan "versi mereka untuk
git merge -s ours
" tetapi "versi mereka untukgit merge -X ours
" (yang merupakan kependekan darigit merge -s recursive -X ours
):Inilah yang misalnya jawaban Alan W. Smith .
Gunakan konten dari B saja
Ini menciptakan gabungan komit untuk kedua cabang tetapi membuang semua perubahan dari
branchA
dan hanya menyimpan konten daribranchB
.Perhatikan bahwa gabungan komit dengan orang tua pertama sekarang adalah dari
branchB
dan hanya yang kedua daribranchA
. Inilah yang misalnya jawaban Gandalf458 .Gunakan konten hanya dari B dan pertahankan urutan induk yang benar
Ini adalah "versi mereka yang sebenarnya
git merge -s ours
". Ini memiliki konten yang sama seperti pada opsi sebelumnya (yaitu hanya itu daribranchB
) tetapi urutan orang tua benar, yaitu orang tua pertama berasalbranchA
dan yang kedua daribranchB
.Inilah yang dilakukan jawaban Paul Pladijs (tanpa membutuhkan cabang sementara).
sumber
git checkout branchA; git merge -s ours --no-commit branchB; git read-tree -um @ branchB; git commit
read-tree
yang rata-rata pengguna git mungkin tidak terbiasa (setidaknya saya tidak ;-)). Solusi dalam jawaban hanya menggunakan perintah tingkat tinggi ("porselen") yang harus diketahui sebagian besar pengguna git. Saya lebih suka mereka tetapi terima kasih untuk versimu!…commit --amend…
) akan "hilang". Saya berencana untuk menambahkan beberapa penjelasan grafis untuk jawaban ini segera setelah saya punya waktu untuk melakukannya ... ;-)Saya menggunakan jawaban dari Paul Pladijs sejak sekarang. Saya tahu, Anda dapat melakukan penggabungan "normal", konflik terjadi, jadi Anda melakukannya
untuk menyelesaikan konflik dengan menggunakan revisi dari cabang lain. Jika Anda melakukan ini untuk setiap file, Anda memiliki perilaku yang sama seperti yang Anda harapkan dari
Lagi pula, upaya lebih dari itu akan dengan strategi gabungan! (Ini diuji dengan git versi 1.8.0)
sumber
git ls-files --modified | xargs git add
saya ingin melakukan ini untuk ditambahkan di kedua sisi menggabungkan: /git ls-files --modified
jadi saya kira ini juga merupakan solusi yang layak.git config --global alias.unresolved '!git status --short|egrep "^([DAU])\1"'
-X
dan apa perbedaan antara-X
dan-s
? tidak dapat menemukan dokumen apa pun.Saya memecahkan masalah saya menggunakan
sumber
Saya berasumsi bahwa Anda membuat cabang dari master dan sekarang ingin bergabung kembali menjadi master, menimpa semua hal lama dalam master. Itulah tepatnya yang ingin saya lakukan ketika saya menemukan posting ini.
Lakukan persis apa yang ingin Anda lakukan, kecuali menggabungkan satu cabang ke yang lain terlebih dahulu. Saya hanya melakukan ini, dan itu berhasil dengan baik.
Kemudian, checkout master dan gabungkan cabang Anda di dalamnya (ini akan berjalan lancar sekarang):
sumber
Jika Anda berada di cabang A, lakukan:
Diuji pada git versi 1.7.8
sumber
Untuk benar-benar melakukan penggabungan yang hanya membutuhkan input dari cabang yang Anda gabungkan dapat Anda lakukan
git merge --strategy=ours ref-to-be-merged
git diff --binary ref-to-be-merged | git apply --reverse --index
git commit --amend
Tidak akan ada konflik dalam skenario yang saya tahu, Anda tidak perlu membuat cabang tambahan, dan itu bertindak seperti komit gabungan normal.
Namun ini tidak cocok dengan submodul.
sumber
Sementara saya menyebutkan dalam " perintah git untuk membuat satu cabang seperti yang lain " cara mensimulasikan
git merge -s theirs
, perhatikan bahwa Git 2.15 (Q4 2017) sekarang lebih jelas:Lihat komit c25d98b (25 Sep 2017) oleh Junio C Hamano (
gitster
) .(Digabung oleh Junio C Hamano -
gitster
- dalam komit 4da3e23 , 28 Sep 2017)-Xtheirs
adalah opsi strategi yang diterapkan untuk strategi rekursif. Ini berarti bahwa strategi rekursif masih akan menggabungkan apa saja yang bisa, dan hanya akan kembali ketheirs
logika jika terjadi konflik.Perdebatan tentang ketepatan atau tidak dari
theirs
strategi penggabungan dibawa kembali baru-baru ini di utas September 2017 ini .Ini mengakui utas yang lebih lama (2008)
Itu menyebutkan alias:
Yaroslav Halchenko mencoba mengadvokasi sekali lagi untuk strategi itu, tetapi Junio C. Hamano menambahkan :
Junio menambahkan, seperti yang dikomentari oleh Mike Beaton :
sumber
git merge -s ours <their-ref>
secara efektif mengatakan 'tanda berkomitmen untuk <their-ref> di cabang mereka sebagai komitmen untuk diabaikan secara permanen '; dan ini penting karena, jika Anda kemudian bergabung dari negara bagian belakangan dari cabang mereka, perubahan mereka nanti akan dibawa tanpa perubahan yang diabaikan pernah dilakukan.Lihat jawaban Junio Hamano yang banyak dikutip : jika Anda akan membuang konten yang dikomit, buang saja komit, atau setidaknya jauhkan dari sejarah utama. Mengapa repot-repot semua orang di masa depan membaca pesan komit dari komitmen yang tidak memiliki apa-apa untuk ditawarkan?
Tetapi kadang-kadang ada persyaratan administrasi, atau mungkin alasan lain. Untuk situasi di mana Anda benar-benar harus mencatat komitmen yang tidak berkontribusi apa pun, Anda ingin:
(sunting: wow, apakah saya berhasil melakukan kesalahan ini sebelumnya. Yang ini berhasil.)
sumber
Yang ini menggunakan perintah git plumbing read-tree, tetapi membuat alur kerja keseluruhan yang lebih pendek.
sumber
Ini akan menggabungkan newBranch Anda di baseBranch yang ada
sumber
git commit --amend
di akhir contoh Anda, atau pengguna dapat melihat komit gabungan dengangit log
dan menganggap operasi selesai.Saya pikir apa yang sebenarnya Anda inginkan adalah:
Ini kelihatan canggung, tetapi seharusnya berhasil. Satu-satunya rasa saya sangat tidak suka tentang solusi ini adalah sejarah git akan membingungkan ... Tapi setidaknya sejarah akan sepenuhnya dipertahankan dan Anda tidak perlu melakukan sesuatu yang khusus untuk file yang dihapus.
sumber
Setara (yang menjaga urutan induk) untuk 'git merge -s branchs merekaB'
Sebelum bergabung:
!!! Pastikan Anda dalam kondisi bersih !!!
Lakukan penggabungan:
Apa yang kita lakukan ? Kami membuat komit baru dimana dua orang tua milik kami dan milik mereka dan contnet dari komit adalah branchB - milik mereka
Setelah bergabung:
Lebih tepatnya:
sumber
Jawaban ini diberikan oleh Paul Pladijs. Saya hanya mengambil perintahnya dan membuat alias git untuk kenyamanan.
Edit .gitconfig Anda dan tambahkan berikut ini:
Kemudian Anda bisa "git merge -s milik mereka A" dengan menjalankan:
sumber
Saya baru-baru ini perlu melakukan ini untuk dua repositori terpisah yang memiliki sejarah yang sama. Saya mulai dengan:
Org/repository1 master
Org/repository2 master
Saya ingin semua perubahan
repository2 master
diterapkanrepository1 master
, menerima semua perubahan yang akan dilakukan repository2. Dalam istilah git, ini harus menjadi strategi yang disebut-s theirs
TETAPI tidak ada. Berhati-hatilah karena-X theirs
dinamai seperti apa yang Anda inginkan, tetapi BUKAN sama (bahkan dikatakan di halaman manual).Cara saya memecahkan ini adalah dengan pergi ke
repository2
dan membuat cabang barurepo1-merge
. Di cabang itu, saya berlarigit pull [email protected]:Org/repository1 -s ours
dan bergabung dengan baik tanpa masalah. Saya kemudian mendorongnya ke remote.Lalu saya kembali ke
repository1
dan membuat cabang barurepo2-merge
. Di cabang itu, saya menjalankangit pull [email protected]:Org/repository2 repo1-merge
yang akan lengkap dengan masalah.Akhirnya, Anda harus mengeluarkan permintaan penggabungan
repository1
untuk menjadikannya master baru, atau hanya menyimpannya sebagai cabang.sumber
Cara dua langkah yang sederhana dan intuitif untuk melakukannya adalah
diikuti oleh
(yang menandai dua cabang digabung)
Satu-satunya kelemahan adalah tidak menghapus file yang telah dihapus di branchB dari cabang Anda saat ini. Perbedaan sederhana antara dua cabang setelahnya akan menunjukkan apakah ada file seperti itu.
Pendekatan ini juga memperjelas dari log revisi setelah itu apa yang dilakukan - dan apa yang dimaksudkan.
sumber