Apakah ada versi "milik mereka" dari "git merge -s ours"?


876

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 gitperintah yang ada ? ( git checkoutsetiap 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.


1
Lihat juga jawaban ini: stackoverflow.com/questions/928646/… - sepele untuk mengubah contoh menggunakan versi B dan bukannya A.
Robie Basak

8
Lihat SO answer git perintah untuk membuat satu cabang seperti yang lain untuk semua cara yang mungkin saat ini untuk mensimulasikangit merge -s their .
VonC

4
Jadi Anda tidak benar-benar mencari git merge -s theirs(yang dapat dicapai dengan mudah dengan git merge -s oursdan cabang sementara), karena -saya sepenuhnya mengabaikan perubahan gabungan-dari cabang ...
Nicolò Martini

21
@Torek - jangan Git devs benar-benar merasa bahwa ofensif untuk memberikan theirstambahan ours??? Ini adalah gejala dari salah satu masalah teknik dan desain tingkat tinggi di Git: inkonsistensi.
jww

3
@jww Masalahnya di sini bukan tentang "git merge -s ours" yang menyinggung, tetapi tentang hal itu menjadi kontra-intuitif. Anda dapat melihat dari pertanyaan OP bahwa jika fitur seperti itu akan ditambahkan, dia akan menggunakannya secara tidak sengaja ketika apa yang sebenarnya ingin dia lakukan adalah "git merge -s rekursif -X milik mereka". Adalah umum untuk ingin menggabungkan cabang lain yang menimpa konflik dengan versi di cabang lain, tetapi menimpa cabang saat ini dengan cabang lain sepenuhnya membuang perubahan saat ini benar-benar merupakan perkecualian.
ThomazMoura

Jawaban:


1020

Tambahkan -Xopsi ke theirs. Sebagai contoh:

git checkout branchA
git merge -X theirs branchB

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 rmdengan nama semua file yang telah dihapus:

git rm {DELETED-FILE-NAME}

Setelah itu, -X theirsseharusnya bekerja seperti yang diharapkan.

Tentu saja, melakukan penghapusan aktual dengan git rmperintah akan mencegah konflik terjadi di tempat pertama.


Catatan : Opsi formulir yang lebih panjang juga ada.

Untuk menggunakannya, ganti:

-X theirs

dengan:

--strategy-option=theirs

6
Lihat jawaban lain di bawah ini untuk solusi yang lebih baik (Paul Pladijs) untuk pertanyaan awal.
Malcolm

204
Layak untuk dicatat bahwa ini tidak sama dengan "strategi penggabungan 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.
Timur

2
Ini bekerja dengan perintah lain juga. Saya baru saja melakukan 'git cherry-pick sha1 -X milik mereka'. Terima kasih!
Max Hohenegger

48
Ini adalah jawaban yang mengerikan, karena terlihat benar, tetapi sebenarnya salah. "git merge -X milik mereka" tidak melakukan apa yang akan "git merge -s milik mereka". Itu tidak mengganti cabang saat ini dengan konten dari cabang gabungan. Itu lebih suka perubahan "mereka", tetapi hanya dalam kasus konflik. Oleh karena itu, komit yang dihasilkan mungkin sangat berbeda dari cabang "mereka". Ini bukan apa yang dipikirkan poster pertanyaan.
Ivan Krivyakov

7
@ user3338098: ya, Anda benar. Saya membaca kembali pertanyaannya, dan itu juga tidak begitu baik. Sayangnya, akar penyebab kebingungan bukanlah jawaban dan bahkan bukan pertanyaan. Ini adalah pilihan desain penulis git untuk memberikan nama yang sama 'milik kita' untuk strategi penggabungan dan ke opsi strategi gabungan 'rekursif'. Kebingungan dalam kasus ini praktis tidak terhindarkan.
Ivan Krivyakov

218

Solusi yang mungkin dan teruji untuk menggabungkan branchB ke branchA check-out kami:

# in case branchA is not our current branch
git checkout branchA

# make merge commit but without conflicts!!
# the contents of 'ours' will be discarded later
git merge -s ours branchB    

# make temporary branch to merged commit
git branch branchTEMP         

# get contents of working tree and index to the one of branchB
git reset --hard branchB

# reset to our merged commit but 
# keep contents of working tree and index
git reset --soft branchTEMP

# change the contents of the merged commit
# with the contents of branchB
git commit --amend

# get rid off our temporary branch
git branch -D branchTEMP

# verify that the merge commit contains only contents of branchB
git diff HEAD branchB

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.


T: Mengapa Anda membutuhkan branchTEMP? Tidak bisa Anda hanya git reset --soft branchA?
cdunn2001

4
@ cdunn2001: Entah bagaimana saya memikirkan hal yang sama, tetapi tidak. Perhatikan bahwa git reset --hardperubahan yang komit branchAmenunjuk ke.
Tsuyoshi Ito

5
maaf mengajukan pertanyaan bodoh tapi mengapa metode ini lebih baik the -xtheirs? apa keuntungan / kerugiannya
chrispepper1989

9
@ chrispepper1989 -x mereka hanya mempengaruhi konflik , jika sebongkah kita bisa diterapkan dengan bersih itu akan melewati penggabungan yang dihasilkan. Dalam kasus ini, seperti yang diperlihatkan oleh perintah terakhir, kita mendapatkan gabungan yang sangat identik dengan branchB, terlepas dari apakah akan ada konflik atau tidak.
UncleZeiv

2
@UncleZeiv terima kasih atas penjelasannya, jadi pada dasarnya melakukan "mereka" akan menjaga perubahan dan file yang tidak berkonflik menghasilkan kode int yang tidak identik dengan kode yang ditarik.
chrispepper1989

89

Versi git yang lebih lama memungkinkan Anda untuk menggunakan strategi gabungan "mereka":

git pull --strategy=theirs remote_branch

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:

git fetch origin
git reset --hard origin

Namun waspadalah, ini berbeda dari gabungan sebenarnya. Solusi Anda mungkin adalah opsi yang benar-benar Anda cari.


7
Saya benar-benar tidak mengerti penjelasan Junio ​​Hamano sama sekali. Bagaimana git reset --hard originsolusi untuk penggabungan gaya mereka? Jika saya ingin menggabungkan BranchB ke BranchA (seperti dalam jawaban Alan W. Smith), bagaimana saya melakukannya dengan menggunakan resetmetode ini?
James McMahon

3
@ James McMahon: Junio ​​C Poin Hamano bukanlah git reset --hardpenggabungan gaya "milik mereka". Tentu saja, git reset --hardtidak 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.
Tsuyoshi Ito

11
Sangat disayangkan bahwa theirstelah 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]
Philip Oakley

1
Itu juga hilang use case saya terjebak dengan sekarang, di mana saya berbagi cabang dengan orang lain dan kami berdua mendorong perubahan (pada file yang berbeda) pada saat yang sama. Jadi saya ingin mengalahkan semua versi lama yang saya miliki secara lokal dan menggunakan yang lebih baru sebagai gantinya. Dia ingin melakukan hal yang sama untuk file yang saya perbarui. Tidak ada yang perlu 'diatur ulang'. Dan solusi untuk checkout setiap file tidak praktis ketika ~ 20 file.
szeitlin

2
Saya benar-benar tidak mengerti filosofi. Saya hanya menggunakan theirskarena saya tidak sengaja mengubah beberapa file di dua cabang terpisah dan ingin membuang perubahan satu tanpa harus secara manual melakukannya untuk setiap file.
sudo

65

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 untuk git merge -X ours" (yang merupakan kependekan dari git merge -s recursive -X ours):

git checkout branchA
# also uses -s recursive implicitly
git merge -X theirs branchB

Inilah yang misalnya jawaban Alan W. Smith .

Gunakan konten dari B saja

Ini menciptakan gabungan komit untuk kedua cabang tetapi membuang semua perubahan dari branchAdan hanya menyimpan konten dari branchB.

# Get the content you want to keep.
# If you want to keep branchB at the current commit, you can add --detached,
# else it will be advanced to the merge commit in the next step.
git checkout branchB

# Do the merge an keep current (our) content from branchB we just checked out.
git merge -s ours branchA

# Set branchA to current commit and check it out.
git checkout -B branchA

Perhatikan bahwa gabungan komit dengan orang tua pertama sekarang adalah dari branchBdan hanya yang kedua dari branchA. 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 dari branchB) tetapi urutan orang tua benar, yaitu orang tua pertama berasal branchAdan yang kedua dari branchB.

git checkout branchA

# Do a merge commit. The content of this commit does not matter,
# so use a strategy that never fails.
# Note: This advances branchA.
git merge -s ours branchB

# Change working tree and index to desired content.
# --detach ensures branchB will not move when doing the reset in the next step.
git checkout --detach branchB

# Move HEAD to branchA without changing contents of working tree and index.
git reset --soft branchA

# 'attach' HEAD to branchA.
# This ensures branchA will move when doing 'commit --amend'.
git checkout branchA

# Change content of merge commit to current index (i.e. content of branchB).
git commit --amend -C HEAD

Inilah yang dilakukan jawaban Paul Pladijs (tanpa membutuhkan cabang sementara).


Versi opsi 3 yang lebih bersih:git checkout branchA; git merge -s ours --no-commit branchB; git read-tree -um @ branchB; git commit
jthill

@ jthill: Walaupun versi Anda lebih ringkas, tetapi juga menggunakan perintah level rendah ("plumbing") read-treeyang 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!
siegi

Bisakah Anda jelaskan langkah kedua hingga terakhir (checkout branchA)? Sepertinya tidak seharusnya ada di sana.
Patrick

@ Patrick, langkah ini diperlukan. Jika Anda melewatkannya, Anda akan mendapatkan komit yang sama tetapi Anda tidak akan memiliki cabang yang menunjuk komit ini. Jadi segera setelah Anda beralih ke komit lain / cabang komit yang Anda lakukan dengan perintah terakhir ( …commit --amend…) akan "hilang". Saya berencana untuk menambahkan beberapa penjelasan grafis untuk jawaban ini segera setelah saya punya waktu untuk melakukannya ... ;-)
siegi

62

Saya menggunakan jawaban dari Paul Pladijs sejak sekarang. Saya tahu, Anda dapat melakukan penggabungan "normal", konflik terjadi, jadi Anda melakukannya

git checkout --theirs <file>

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

git merge <branch> -s theirs

Lagi pula, upaya lebih dari itu akan dengan strategi gabungan! (Ini diuji dengan git versi 1.8.0)


1
akan lebih bagus jika daftar file bisa diambil. Sebagai contoh, git ls-files --modified | xargs git addsaya ingin melakukan ini untuk ditambahkan di kedua sisi menggabungkan: /
dan

Sebenarnya git mengembalikan yang ditambahkan pada kedua sisi file dengan git ls-files --modifiedjadi saya kira ini juga merupakan solusi yang layak.
andho

1
Terima kasih telah menambahkan ini juga. Lebih sering daripada tidak diperlukan pada basis file-by-file. Selain itu, status git menunjukkan "Jalan Tidak Terpal" di bagian paling bawah. Untuk mendapatkan daftar jalur yang belum terselesaikan, saya menggunakan alias ini:git config --global alias.unresolved '!git status --short|egrep "^([DAU])\1"'
Melvyn

apa artinya -Xdan apa perbedaan antara -Xdan -s? tidak dapat menemukan dokumen apa pun.
Lei Yang

21

Saya memecahkan masalah saya menggunakan

git checkout -m old
git checkout -b new B
git merge -s ours old

cabang "B" dari cabang "lama"
elmarco

13

Saat menggabungkan cabang topik "B" di "A" menggunakan git merge, saya mendapatkan beberapa konflik. Saya tahu semua konflik dapat diselesaikan menggunakan versi di "B".

Saya menyadari git merge - milik kita. Tapi yang saya inginkan adalah git merge> -s milik mereka.

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.

git checkout Branch
git merge master -s ours

Kemudian, checkout master dan gabungkan cabang Anda di dalamnya (ini akan berjalan lancar sekarang):

git checkout master
git merge Branch

1
Terima kasih. Ini harus menjadi jawaban yang diterima, sejauh ini yang paling sederhana dan paling benar. Jika cabang Anda ada di belakang / konflik dengan master, maka itu adalah tugas cabang untuk menggabungkan dan membuat semuanya berfungsi sebelum menggabungkan kembali segalanya untuk dikuasai.
StackHola

Ini berhasil luar biasa, terima kasih.
Kodie Grantham

12

Jika Anda berada di cabang A, lakukan:

git merge -s recursive -X theirs B

Diuji pada git versi 1.7.8


8

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.


Apa yang -R lakukan di sini?
P. Myer Nore

Dengan cara ini Anda kehilangan riwayat file "dipindahkan dan diubah". Apakah saya benar?
elysch

1
-R -reverse, saya memperbarui jawaban dengan itu untuk lebih mendokumentasikan diri.
Elijah Lynn

Ini tampaknya tidak berfungsi jika file yang Anda coba gabungkan dihapus di cabang yang masuk.
Mengatasi

7

Mengapa itu tidak ada?

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:

Dokumentasi untuk ' -X<option>' untuk penggabungan ditulis secara menyesatkan untuk menyatakan bahwa " -s theirs" ada, yang tidak demikian.

Lihat komit c25d98b (25 Sep 2017) oleh Junio ​​C Hamano ( gitster) .
(Digabung oleh Junio ​​C Hamano - gitster- dalam komit 4da3e23 , 28 Sep 2017)

strategi gabungan: hindari menyiratkan bahwa " -s theirs" ada

Deskripsi -Xoursopsi gabungan memiliki catatan kurung yang memberi tahu para pembaca bahwa itu sangat berbeda dari -s ours, yang benar, tetapi deskripsi -Xtheirsyang mengikutinya dengan sembrono mengatakan "ini adalah kebalikan dari ours", memberikan kesan yang salah bahwa pembaca juga perlu untuk diingat bahwa itu sangat berbeda dari -s theirs, yang dalam kenyataannya bahkan tidak ada.

-Xtheirsadalah opsi strategi yang diterapkan untuk strategi rekursif. Ini berarti bahwa strategi rekursif masih akan menggabungkan apa saja yang bisa, dan hanya akan kembali ke theirslogika jika terjadi konflik.

Perdebatan tentang ketepatan atau tidak dari theirsstrategi penggabungan dibawa kembali baru-baru ini di utas September 2017 ini .
Ini mengakui utas yang lebih lama (2008)

Singkatnya, diskusi sebelumnya dapat diringkas menjadi "kami tidak ingin ' -s theirs' karena mendorong alur kerja yang salah".

Itu menyebutkan alias:

mtheirs = !sh -c 'git merge -s ours --no-commit $1 && git read-tree -m -u $1' -

Yaroslav Halchenko mencoba mengadvokasi sekali lagi untuk strategi itu, tetapi Junio ​​C. Hamano menambahkan :

Alasan mengapa kami dan mereka tidak simetris adalah karena Anda adalah Anda dan bukan mereka --- kontrol dan kepemilikan sejarah kami dan sejarah mereka tidak simetris.

Setelah Anda memutuskan bahwa sejarah mereka adalah jalur utama, Anda lebih suka memperlakukan lini pengembangan Anda sebagai cabang sampingan dan membuat penggabungan ke arah itu, yaitu induk pertama dari hasil gabungan adalah komit pada sejarah mereka dan yang kedua orang tua adalah yang terburuk dalam sejarah Anda. Jadi, Anda akhirnya akan menggunakan " checkout their-history && merge -s ours your-history" untuk menjaga orangtua yang masuk akal.

Dan pada saat itu, penggunaan " -s ours" tidak lagi menjadi solusi untuk kekurangan " -s theirs".
Ini adalah bagian yang tepat dari semantik yang diinginkan, yaitu dari sudut pandang garis sejarah kanonik yang bertahan, Anda ingin mempertahankan apa yang dilakukannya, membatalkan apa yang dilakukan garis sejarah lainnya .

Junio ​​menambahkan, seperti yang dikomentari oleh Mike Beaton :

git merge -s ours <their-ref>secara efektif mengatakan 'tanda berkomitmen dibuat <their-ref>pada cabang mereka sebagai komitmen untuk diabaikan secara permanen';
dan ini penting karena, jika Anda kemudian bergabung dari negara bagian kemudian dari cabang mereka, perubahan mereka nanti akan dibawa tanpa perubahan diabaikan yang pernah dibawa .


1
Ini adalah jawaban yang berguna, tetapi tidak menyebutkan satu poin kunci yang saya baru mengerti dari jawaban Junio ​​C. Hamano: 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.
MikeBeaton

1
@ MikeBeaton Terima kasih. Saya telah memasukkan komentar Anda dalam jawaban untuk lebih banyak visibilitas.
VonC

5

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.)

git update-ref HEAD $(
        git commit-tree -m 'completely superseding with branchB content' \
                        -p HEAD -p branchB    branchB:
)
git reset --hard

3

Yang ini menggunakan perintah git plumbing read-tree, tetapi membuat alur kerja keseluruhan yang lebih pendek.

git checkout <base-branch>

git merge --no-commit -s ours <their-branch>
git read-tree -u --reset <their-branch>
git commit

# Check your work!
git diff <their-branch>

0

Ini akan menggabungkan newBranch Anda di baseBranch yang ada

git checkout <baseBranch> // this will checkout baseBranch
git merge -s ours <newBranch> // this will simple merge newBranch in baseBranch
git rm -rf . // this will remove all non references files from baseBranch (deleted in newBranch)
git checkout newBranch -- . //this will replace all conflicted files in baseBranch

Saya sarankan menambahkan git commit --amenddi akhir contoh Anda, atau pengguna dapat melihat komit gabungan dengan git logdan menganggap operasi selesai.
Michael R

0

Saya pikir apa yang sebenarnya Anda inginkan adalah:

git checkout -B mergeBranch branchB
git merge -s ours branchA
git checkout branchA
git merge mergeBranch
git branch -D mergeBranch

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.


0

Setara (yang menjaga urutan induk) untuk 'git merge -s branchs merekaB'

Sebelum bergabung:masukkan deskripsi gambar di sini

!!! Pastikan Anda dalam kondisi bersih !!!

Lakukan penggabungan:

git commit-tree -m "take theirs" -p HEAD -p branchB 'branchB^{tree}'
git reset --hard 36daf519952 # is the output of the prev command

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:masukkan deskripsi gambar di sini

Lebih tepatnya:

git commit-tree -m "take theirs" -p HEAD -p 'SOURCE^{commit}' 'SOURCE^{tree}'

0

Jawaban ini diberikan oleh Paul Pladijs. Saya hanya mengambil perintahnya dan membuat alias git untuk kenyamanan.

Edit .gitconfig Anda dan tambahkan berikut ini:

[alias]
    mergetheirs = "!git merge -s ours \"$1\" && git branch temp_THEIRS && git reset --hard \"$1\" && git reset --soft temp_THEIRS && git commit --amend && git branch -D temp_THEIRS"

Kemudian Anda bisa "git merge -s milik mereka A" dengan menjalankan:

git checkout B (optional, just making sure we're on branch B)
git mergetheirs A

-1

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 masterditerapkan repository1 master, menerima semua perubahan yang akan dilakukan repository2. Dalam istilah git, ini harus menjadi strategi yang disebut -s theirsTETAPI tidak ada. Berhati-hatilah karena -X theirsdinamai seperti apa yang Anda inginkan, tetapi BUKAN sama (bahkan dikatakan di halaman manual).

Cara saya memecahkan ini adalah dengan pergi ke repository2dan membuat cabang baru repo1-merge. Di cabang itu, saya berlari git pull git@gitlab.com:Org/repository1 -s oursdan bergabung dengan baik tanpa masalah. Saya kemudian mendorongnya ke remote.

Lalu saya kembali ke repository1dan membuat cabang baru repo2-merge. Di cabang itu, saya menjalankan git pull git@gitlab.com:Org/repository2 repo1-mergeyang akan lengkap dengan masalah.

Akhirnya, Anda harus mengeluarkan permintaan penggabungan repository1untuk menjadikannya master baru, atau hanya menyimpannya sebagai cabang.


-2

Cara dua langkah yang sederhana dan intuitif untuk melakukannya adalah

git checkout branchB .
git commit -m "Picked up the content from branchB"

diikuti oleh

git merge -s ours branchB

(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.


ini mungkin benar untuk pertanyaan awal, namun OP memperbarui pertanyaan pada 2008 sedemikian rupa sehingga jawaban ini salah.
user3338098

1
@ user3338098 Ya, sangat disayangkan bahwa mereka meninggalkan judul yang menyesatkan dan hanya menampar pembaruan yang tidak begitu terlihat di akhir badan pertanyaan .... karena jawaban ini menjawab dengan benar pertanyaan judul.
RomainValeri

Saya sepenuhnya setuju dengan @RomainValeri
AppleCiderGuy
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.