ฉันมีสองสาขา (A และ B) และฉันต้องการรวมไฟล์เดียวจากสาขา A กับไฟล์เดียวที่เกี่ยวข้องจาก Branch B
git diff branch_name > patch
git apply patch
. stackoverflow.com/a/9473543/1091853
ฉันมีสองสาขา (A และ B) และฉันต้องการรวมไฟล์เดียวจากสาขา A กับไฟล์เดียวที่เกี่ยวข้องจาก Branch B
git diff branch_name > patch
git apply patch
. stackoverflow.com/a/9473543/1091853
คำตอบ:
ฉันเจอปัญหาเดียวกัน เพื่อความแม่นยำฉันมีสองสาขาA
และB
มีไฟล์เดียวกัน แต่มีอินเตอร์เฟสการเขียนโปรแกรมที่แตกต่างกันในบางไฟล์ ตอนนี้วิธีการของไฟล์f
ซึ่งเป็นอิสระจากความแตกต่างของส่วนต่อประสานในสองสาขาได้เปลี่ยนไปในสาขาB
แต่การเปลี่ยนแปลงสำคัญสำหรับทั้งสองสาขา ดังนั้นฉันต้องการที่จะผสานไฟล์เพียงf
สาขาB
ลงในแฟ้มของสาขาf
A
คำสั่งง่าย ๆ แก้ปัญหาให้ฉันแล้วถ้าฉันคิดว่าการเปลี่ยนแปลงทั้งหมดเกิดขึ้นในทั้งสองสาขาA
และB
:
git checkout A
git checkout --patch B f
คำสั่งแรกสวิทช์ลงในสาขาA
ลงที่ฉันต้องการที่จะผสานB
's f
รุ่นของแฟ้ม คำสั่งที่สองแพทช์ไฟล์f
กับf
ของของHEAD
B
คุณสามารถยอมรับ / ทิ้งส่วนหนึ่งส่วนของแพทช์ แทนที่จะB
คุณสามารถระบุใด ๆ HEAD
ที่กระทำอยู่ที่นี่ก็ไม่ได้จะต้องมีการ
แก้ไขโดยชุมชน : ถ้าแฟ้มf
บนB
ไม่มีอยู่บนA
ยังแล้วละเว้น--patch
ตัวเลือก มิฉะนั้นคุณจะได้รับ "ไม่มีการเปลี่ยนแปลง" ข่าวสาร
git checkout --patch B -- f
เพื่อให้เรื่องนี้ทำงาน
a
ในช่วงโต้ตอบโต้ตอบแทนการกดy
ทุกครั้ง หรือใช้git checkout B -- f
คำสั่งแทน
นี่คือสิ่งที่ฉันทำในสถานการณ์เหล่านี้ มันเป็นรถถัง แต่มันใช้งานได้ดีสำหรับฉัน
ฉันพยายามแก้ไขและสถานการณ์ของฉันมันน่าเกลียดเกินไป ดังนั้นในระยะสั้นมันจะเป็นดังนี้:
สาขาการทำงาน: สาขาทดลอง: B (มี file.txt ซึ่งมีการเปลี่ยนแปลงที่ฉันต้องการพับใน)
git checkout A
สร้างสาขาใหม่โดยใช้ A:
git checkout -b tempAB
รวม B เข้ากับเทมเพลต
git merge B
คัดลอกแฮช sha1 ของการรวม:
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
ชำระเงินสาขาที่ทำงานของคุณ:
git checkout A
ชำระเงินไฟล์ที่แก้ไขแล้วของคุณ:
git checkout 7e65b5a52e5f8b1979d75dffbbe4f7ee7dad5017 file.txt
และที่นั่นคุณควรจะมีมัน ยอมรับผลลัพธ์ของคุณ
A
ได้หันเหความสนใจจากB
เริ่มต้นด้วยวิธีอื่น การคัดลอกจะแทนที่ความแตกต่างเหล่านั้น
สิ่งนี้ใช้ difftool ภายในของคอมไพล์ อาจจะเป็นงานเล็ก ๆ น้อย ๆ ที่ต้องทำ แต่ตรงไปตรงมา
#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.
--
(ป้ายกำกับอาร์กิวเมนต์ที่ว่างเปล่า) ให้ใช้เอกสารการชำระเงิน git: ARGUMENT DISAMBIGUATIONพูดว่า: "ใช้git checkout -- <pathspec>
ถ้าคุณต้องการเช็คเอาต์พา ธ เหล่านี้ออกจากดัชนี" นี่เป็นเพราะคุณสามารถมีทั้งสาขาและไฟล์ / พา ธ ด้วยชื่อเดียวกัน ในกรณีเช่นนี้แทนที่จะขอให้คุณแก้ความสงสัยว่าควรตรวจสอบสาขาหรือเส้นทางเมื่อมีอยู่ทั้งคู่หรือไม่ git จะเลือกเช็คเอาต์สาขาตามค่าเริ่มต้น อย่างไรก็ตามหาก--
นำหน้าคอมไพล์จะเช็กเอาต์ไฟล์ / พา ธ แทน
ฉันพบวิธีการนี้ง่ายและมีประโยชน์: วิธี "ผสาน" ไฟล์เฉพาะจากสาขาอื่น
เมื่อปรากฎว่าเราพยายามหนักเกินไป การชำระเงินคอมไพล์เพื่อนที่ดีของเราเป็นเครื่องมือที่เหมาะสมสำหรับงาน
git checkout source_branch <paths>...
เราสามารถให้ชื่อของสาขาฟีเจอร์ A และเช็คเอาต์ไปยังไฟล์เฉพาะที่เราต้องการเพิ่มไปยังสาขาหลักของเรา
โปรดอ่านบทความทั้งหมดเพื่อความเข้าใจที่มากขึ้น
-p
ตัวเลือกในคำสั่งนั้น ซึ่งจะเขียนทับส่วนใด ๆ ในไฟล์ worktree ของคุณซึ่งก่อนหน้านี้ได้ถูกเบี่ยงเบนจากสาขาที่คุณเช็คเอาต์ก่อนที่จะมีการเปลี่ยนแปลงแพตช์
คุณสามารถใช้:
git merge-file
เคล็ดลับ: https://www.kernel.org/pub/software/scm/git/docs/git-merge-file.html
git merge-file
คำสั่งต่อไปนี้จะ (1) เปรียบเทียบไฟล์ของสาขาที่ถูกต้องกับมาสเตอร์ (2) แบบโต้ตอบถามคุณว่าการแก้ไขใดที่จะนำไปใช้
git checkout --patch master
การแก้ไขของฉันถูกปฏิเสธดังนั้นฉันจึงแนบวิธีจัดการกับการรวมการเปลี่ยนแปลงจากสาขาระยะไกลที่นี่
หากคุณต้องทำหลังจากผสานไม่ถูกต้องคุณสามารถทำสิ่งนี้:
# 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.
สมมติว่า B เป็นสาขาปัจจุบัน:
$ git diff A <file-path> > patch.tmp
$ git apply patch.tmp -R
โปรดทราบว่านี่ใช้การเปลี่ยนแปลงกับไฟล์ในเครื่อง คุณจะต้องกระทำในภายหลัง
error: <file-path>: already exists in working directory
git diff Branch_A <file-path, filename> -- hash_commit > file_name.temp
คุณสามารถเช็คเอาต์ไฟล์เวอร์ชันเก่าเพื่อรวมบันทึกไว้ในชื่ออื่นจากนั้นเรียกใช้เครื่องมือผสานที่อยู่ในไฟล์สองไฟล์
เช่น.
git show B:src/common/store.ts > /tmp/store.ts
(โดยที่ B คือชื่อสาขา / กระทำ / แท็ก)
meld src/common/store.ts /tmp/store.ts
ฉันจะทำตาม
git format-patch branch_old..branch_new file
สิ่งนี้จะสร้างแพตช์สำหรับไฟล์
ติดตั้ง patch ที่ target branch_old
git am blahblah.patch