Saya memiliki dua cabang (A dan B) dan saya ingin menggabungkan satu file dari cabang A dengan file tunggal yang sesuai dari Cabang B.
git diff branch_name > patch
git apply patch
. stackoverflow.com/a/9473543/1091853
Saya memiliki dua cabang (A dan B) dan saya ingin menggabungkan satu file dari cabang A dengan file tunggal yang sesuai dari Cabang B.
git diff branch_name > patch
git apply patch
. stackoverflow.com/a/9473543/1091853
Jawaban:
Saya menemukan masalah yang sama. Lebih tepatnya, saya memiliki dua cabang A
dan B
dengan file yang sama tetapi antarmuka pemrograman yang berbeda dalam beberapa file. Sekarang metode file f
, yang independen dari perbedaan antarmuka di dua cabang, diubah dalam cabang B
, tetapi perubahan ini penting untuk kedua cabang. Jadi, saya perlu menggabungkan hanya file f
cabang B
ke file f
cabang A
.
Perintah sederhana sudah memecahkan masalah bagi saya jika saya berasumsi bahwa semua perubahan dilakukan di kedua cabang A
dan B
:
git checkout A
git checkout --patch B f
Perintah pertama beralih ke cabang A
, ke tempat saya ingin menggabungkan B
versi file f
. Perintah kedua patch file f
dengan f
dari HEAD
dari B
. Anda bahkan dapat menerima / membuang satu bagian patch. Alih-alih B
Anda dapat menentukan komit apa pun di sini, itu tidak harus HEAD
.
Suntingan komunitas : Jika file f
aktif B
belum ada A
, maka abaikan --patch
opsi. Jika tidak, Anda akan mendapatkan "Tidak Ada Perubahan." pesan.
git checkout --patch B -- f
untuk mendapatkan ini berfungsi.
a
selama fase interaktif, alih-alih menekan y
setiap waktu. Atau gunakan git checkout B -- f
perintah sebagai gantinya.
Inilah yang saya lakukan dalam situasi ini. Itu adalah kludge tetapi itu bekerja dengan baik untuk saya.
Saya mencoba menambal dan situasi saya terlalu buruk untuk itu. Jadi singkatnya akan terlihat seperti ini:
Cabang Kerja: Cabang Eksperimental: B (berisi file.txt yang memiliki perubahan yang ingin saya lipat.)
git checkout A
Buat cabang baru berdasarkan A:
git checkout -b tempAB
Gabungkan B ke dalam tempAB
git merge B
Salin hash sha1 dari penggabungan:
git log
commit 8dad944210dfb901695975886737dc35614fa94e
Merge: ea3aec1 0f76e61
Author: matthewe <matthewe@matthewe.com>
Date: Wed Oct 3 15:13:24 2012 -0700
Merge branch 'B' into tempAB
Periksa cabang kerja Anda:
git checkout A
Periksa file perbaikan Anda:
git checkout 7e65b5a52e5f8b1979d75dffbbe4f7ee7dad5017 file.txt
Dan di sana Anda harus memilikinya. Komit hasil Anda.
A
telah beralih dari B
awal, dengan cara lain. Menyalin akan mengatasi perbedaan-perbedaan itu.
Ini menggunakan difftool internal git. Mungkin sedikit pekerjaan yang harus dilakukan tetapi terus terang.
#First checkout the branch you want to merge into
git checkout <branch_to_merge_into>
#Then checkout the file from the branch you want to merge from
git checkout <branch_to_merge_from> -- <file>
#Then you have to unstage that file to be able to use difftool
git reset HEAD <file>
#Now use difftool to chose which lines to keep. Click on the mergebutton in difftool
git difftool
#Save the file in difftool and you should be done.
--
(label argumen kosong), git checkout docs: ARGUMENT DISAMBIGUATION mengatakan: "gunakan git checkout -- <pathspec>
jika Anda ingin checkout jalur ini dari indeks." Ini karena Anda bisa memiliki cabang dan file / jalur dengan nama yang sama. Dalam kasus seperti itu, daripada meminta Anda untuk tidak menentukan apakah cabang atau path harus diperiksa ketika keduanya ada, git akan memilih untuk checkout cabang secara default. Namun jika --
precit git akan checkout file / path sebagai gantinya.
Saya menemukan pendekatan ini sederhana dan bermanfaat: Cara "menggabungkan" file tertentu dari cabang lain
Ternyata, kami berusaha terlalu keras. Git checkout teman baik kami adalah alat yang tepat untuk pekerjaan itu.
git checkout source_branch <paths>...
Kita cukup memberi git checkout nama cabang fitur A dan path ke file tertentu yang ingin kita tambahkan ke cabang master kita.
Silakan baca seluruh artikel untuk pemahaman lebih lanjut
-p
opsi dalam perintah itu. Yang kemudian, menimpa setiap bagian pada file worktree Anda yang sebelumnya dialihkan dari cabang tempat Anda keluar, sebelum perubahan patch, sayangnya.
Anda bisa menggunakan:
git merge-file
Kiat: https://www.kernel.org/pub/software/scm/git/docs/git-merge-file.html
git merge-file
Perintah berikut akan (1) membandingkan file dari cabang yang benar, untuk menguasai (2) secara interaktif bertanya kepada Anda modifikasi mana yang berlaku.
git checkout - master pengirim
Hasil edit saya ditolak, jadi saya melampirkan cara menangani perubahan gabungan dari cabang jarak jauh di sini.
Jika Anda harus melakukan ini setelah penggabungan yang salah, Anda dapat melakukan sesuatu seperti ini:
# If you did a git pull and it broke something, do this first
# Find the one before the merge, copy the SHA1
git reflog
git reset --hard <sha1>
# Get remote updates but DONT auto merge it
git fetch github
# Checkout to your mainline so your branch is correct.
git checkout develop
# Make a new branch where you'll be applying matches
git checkout -b manual-merge-github-develop
# Apply your patches
git checkout --patch github/develop path/to/file
...
# Merge changes back in
git checkout develop
git merge manual-merge-github-develop # optionally add --no-ff
# You'll probably have to
git push -f # make sure you know what you're doing.
Dengan asumsi B adalah cabang saat ini:
$ git diff A <file-path> > patch.tmp
$ git apply patch.tmp -R
Perhatikan bahwa ini hanya berlaku untuk perubahan file lokal. Anda harus berkomitmen setelahnya.
error: <file-path>: already exists in working directory
git diff Branch_A <file-path, filename> -- hash_commit > file_name.temp
Anda bisa checkout versi lama file untuk digabung, menyimpannya di bawah nama yang berbeda, kemudian jalankan alat penggabungan apa pun Anda pada dua file.
misalnya.
git show B:src/common/store.ts > /tmp/store.ts
(di mana B adalah nama cabang / komit / tag)
meld src/common/store.ts /tmp/store.ts
Saya akan melakukannya sebagai
git format-patch branch_old..branch_new file
ini akan menghasilkan tambalan untuk file.
Terapkan tambalan di target branch_old
git am blahblah.patch