ฉันกำลังรวมในสาขาระยะไกลที่อาจมีความขัดแย้งมากมาย ฉันจะบอกได้อย่างไรว่ามันจะมีความขัดแย้งหรือไม่?
ฉันไม่เห็นอะไรเหมือนใน --dry-run
git-merge
ฉันกำลังรวมในสาขาระยะไกลที่อาจมีความขัดแย้งมากมาย ฉันจะบอกได้อย่างไรว่ามันจะมีความขัดแย้งหรือไม่?
ฉันไม่เห็นอะไรเหมือนใน --dry-run
git-merge
คำตอบ:
ตามที่ระบุไว้ก่อนหน้านี้ผ่านในการ--no-commit
ตั้งค่าสถานะ แต่เพื่อหลีกเลี่ยงการส่งต่อที่รวดเร็วส่งต่อ--no-ff
เช่นกันเช่น:
$ git merge --no-commit --no-ff $BRANCH
หากต้องการตรวจสอบการเปลี่ยนแปลงที่มีการจัดฉาก:
$ git diff --cached
และคุณสามารถยกเลิกการผสานได้แม้ว่าจะเป็นการผสานแบบกรอไปข้างหน้า:
$ git merge --abort
git merge --only-if-there-wont-be-any-conflicts
หรือgit diff --show-conflicts <commit>
จะเป็นประโยชน์จริงๆ ความอัปยศมันเป็นไปไม่ได้เลยหรือฉันขาดอะไรไป
git pull --ff-only
!
ฉันแค่ต้องใช้วิธีการที่พบความขัดแย้งโดยอัตโนมัติระหว่างพื้นที่เก็บข้อมูลและระยะไกล โซลูชันนี้ทำการผสานในหน่วยความจำดังนั้นจึงไม่แตะดัชนีหรือแผนผังการทำงาน ฉันคิดว่านี่เป็นวิธีที่ปลอดภัยที่สุดที่คุณสามารถแก้ไขปัญหานี้ได้ นี่คือวิธีการทำงาน:
git fetch origin master
git merge-base FETCH_HEAD master
git merge-tree mergebase master FETCH_HEAD
( mergebaseเป็นเลขฐานสิบหกที่ผสานฐานพิมพ์ในขั้นตอนก่อนหน้า)ตอนนี้สมมติว่าคุณต้องการผสานรวมต้นแบบระยะไกลกับเจ้านายท้องถิ่นของคุณ แต่คุณสามารถใช้สาขาใดก็ได้ git merge-tree
จะดำเนินการผสานในหน่วยความจำและพิมพ์ผลลัพธ์ไปยังเอาต์พุตมาตรฐาน grep สำหรับรูปแบบหรือ<<
>>
หรือคุณสามารถพิมพ์ผลลัพธ์ไปยังไฟล์และตรวจสอบว่า หากคุณพบว่าบรรทัดที่ขึ้นต้นด้วย 'เปลี่ยนแปลงทั้งคู่' ส่วนใหญ่อาจมีข้อขัดแย้ง
git merge-tree `git merge-base FETCH_HEAD master` FETCH_HEAD master
git merge-tree `git merge-base clieop master` clieop master | grep -A3 "changed in both"
มาก! +100
+<<<<<<< .our
ดังนั้นฉันจึงใช้นิพจน์ grep เช่นgrep -q '^+<* \.our$'
วิธีเดรัจฉานบังคับง่าย ๆ ของฉันคือ:
สร้างสาขา "pre-master" (จากหลักสูตรหลัก)
ผสานทุกสิ่งที่คุณต้องการเข้าร่วมปรมาจารย์
จากนั้นคุณจะเห็นว่าการผสานเกิดขึ้นอย่างไรโดยไม่ต้องแตะต้องต้นแบบ
อย่างไรก็ตามฉันจะปฏิบัติตามคำแนะนำของ @ orange80
git merge --abort
หากมีความขัดแย้งถ้ามีการผสานหรือgit reset --hard HEAD~1
git reset --hard origin/master
การสร้างสาขาอื่นให้ความรู้สึกปลอดภัย แต่ถ้าคุณเรียนรู้วิธีการใช้งานคอมไพล์คุณจะเข้าใจว่ามันคือความกลัวที่ถูกวางผิดที่ เมื่อมีข้อกังวลเกี่ยวกับการไม่เปลี่ยนสำเนาการทำงานสิ่งนี้ไม่ได้แก้ปัญหา
git merge --no-commit
จะไม่ยกเลิกการรวมหากสามารถส่งต่อได้อย่างรวดเร็ว git merge --abort
ไม่ทำงานหากรวมเข้าด้วยกัน หากคุณต้องการเขียนสิ่งนี้เป็นสคริปต์มันน่าอึดอัดใจเนื่องจากgit merge
ไม่ตอบกลับด้วยรหัสข้อผิดพลาดที่ดีพอที่จะอธิบายความขัดแย้งประเภทต่างๆ การทำงานกับสาขาใหม่จะทำให้สคริปต์ที่ใช้งานไม่ได้ปล่อยให้ repo ของคุณอยู่ในสถานะที่ต้องการการแทรกแซงด้วยตนเอง แน่นอนว่าคุณจะไม่สูญเสียอะไรเลย แต่มันจะง่ายกว่าที่จะสร้างเป็นอย่างอื่น
การยกเลิกการรวมกับคอมไพล์นั้นง่ายมากคุณไม่ควรกังวลเกี่ยวกับการทำแห้ง:
$ git pull $REMOTE $BRANCH
# uh oh, that wasn't right
$ git reset --hard ORIG_HEAD
# all is right with the world
แก้ไข: ตามที่ระบุไว้ในความคิดเห็นด้านล่างหากคุณมีการเปลี่ยนแปลงในไดเรกทอรีการทำงานหรือพื้นที่การแสดงละครคุณอาจต้องการซ่อนพวกเขาก่อนที่จะทำข้างต้น (มิฉะนั้นพวกเขาจะหายไปดังกล่าวgit reset
ข้างต้น)
git branch --contains HEAD
หรือมากกว่านั้นโดยตรงให้ใช้git merge --ff-only
--dry-run
จะไม่ "เพียงตรวจสอบว่าการผสานจะส่งต่ออย่างรวดเร็ว" หรือไม่ มันจะส่งกลับผลลัพธ์ที่แน่นอนว่าการผสานจะ: ไฟล์ความขัดแย้งเป็นต้นว่า ff จะไม่น่าสนใจจริง ๆ หรือไม่
git stash; git reset --hard
ล่ะ @BrianPhillips
ฉันทำนามแฝงสำหรับการทำเช่นนี้และทำงานเหมือนมีเสน่ห์ฉันทำสิ่งนี้:
git config --global alias.mergetest '!f(){ git merge --no-commit --no-ff "$1"; git merge --abort; echo "Merge aborted"; };f '
ตอนนี้ฉันแค่โทร
git mergetest <branchname>
เพื่อตรวจสอบว่ามีข้อขัดแย้งใด ๆ หรือไม่
เพียงแค่แตกสาขาปัจจุบันของคุณกับสาขาระยะไกลนี่จะบอกคุณว่าจะมีการเปลี่ยนแปลงอะไรเมื่อคุณดึง / รวม
#see diff between current master and remote branch
git diff master origin/master
ฉันใช้คำสั่ง git ที่ร้องขอเพื่อทำเช่นนั้น ช่วยให้คุณเห็นการเปลี่ยนแปลงทุกอย่างที่จะเกิดขึ้นเมื่อทำการผสานแต่ไม่ต้องทำอะไรกับที่เก็บข้อมูลโลคัลหรือรีโมตของคุณ
ตัวอย่างเช่นสมมติว่าคุณต้องการรวมสาขาที่ชื่อ "feature-x" เข้ากับสาขาหลักของคุณ
git request-pull master origin feature-x
จะแสดงบทสรุปของสิ่งที่จะเกิดขึ้น (โดยไม่ทำอะไรเลย):
The following changes since commit fc01dde318:
Layout updates (2015-06-25 11:00:47 +0200)
are available in the git repository at:
http://fakeurl.com/myrepo.git/ feature-x
for you to fetch changes up to 841d3b41ad:
----------------------------------------------------------------
john (2):
Adding some layout
Refactoring
ioserver.js | 8 +++---
package.json | 7 +++++-
server.js | 4 +--
layout/ldkdsd.js | 277 +++++++++++++++++++++++++++++++++++++
4 files changed, 289 insertions(+), 7 deletions(-)
create mode 100644 layout/ldkdsd.js
หากคุณเพิ่ม-p
พารามิเตอร์คุณจะได้รับข้อความแพตช์แบบเต็มเหมือนกับว่าคุณกำลังทำคอมไพล์ในทุกไฟล์ที่เปลี่ยนแปลง
master
และorigin
ทำในตัวเลือกบรรทัดคำสั่งและถ้าฉันเป็นตัวอย่างในท้องถิ่นbranch1
และต้องการที่จะทำrequest-pull
ในสาขาคุณลักษณะท้องถิ่นbranch2
? ฉันยังต้องการorigin
หรือไม่ แน่นอนหนึ่งสามารถอ่านเอกสารได้เสมอ
ฉันประหลาดใจที่ไม่มีใครแนะนำให้ใช้แพทช์
สมมติว่าคุณต้องการทดสอบการรวมyour_branch
เข้าmaster
(ฉันสมมติว่าคุณได้master
เช็คเอาต์):
$ git diff master your_branch > your_branch.patch
$ git apply --check your_branch.patch
$ rm your_branch.patch
นั่นควรทำเคล็ดลับ
หากคุณได้รับข้อผิดพลาดเช่น
error: patch failed: test.txt:1
error: test.txt: patch does not apply
นั่นหมายความว่าการแก้ไขไม่สำเร็จและการผสานจะก่อให้เกิดความขัดแย้ง ไม่มีผลลัพธ์หมายความว่าแพทช์นั้นสะอาดและคุณสามารถผสานสาขาได้อย่างง่ายดาย
โปรดทราบว่านี่จะไม่เปลี่ยนแผนผังการทำงานของคุณ (นอกเหนือจากการสร้างไฟล์แพทช์แน่นอน แต่คุณสามารถลบได้อย่างปลอดภัยในภายหลัง) จากเอกสารประกอบการใช้ git:
--check
Instead of applying the patch, see if the patch is applicable to the
current working tree and/or the index file and detects errors. Turns
off "apply".
หมายเหตุถึงใครก็ตามที่ฉลาดกว่า / มีประสบการณ์เกี่ยวกับคอมไพล์มากกว่าฉัน: โปรดแจ้งให้เราทราบหากฉันผิดที่นี่และวิธีนี้จะแสดงพฤติกรรมที่แตกต่างจากการผสานปกติ ดูเหมือนว่าแปลกว่าใน 8 ปีที่ผ่านมาว่าคำถามนี้ไม่มีใครจะแนะนำวิธีแก้ปัญหาที่เห็นได้ชัดนี้
git diff master your_branch | git apply --check
วิธีที่สั้นลงโดยไม่ต้องสร้างไฟล์แพทช์ชั่วคราว:
สิ่งนี้อาจน่าสนใจ: จากเอกสาร:
หากคุณพยายามผสานซึ่งส่งผลให้เกิดความขัดแย้งที่ซับซ้อนและต้องการที่จะเริ่มต้นคุณสามารถกู้คืนด้วย--abort ผสานคอมไพล์
แต่คุณสามารถทำได้ด้วยวิธีที่ไร้เดียงสา (แต่ช้า):
rm -Rf /tmp/repository
cp -r repository /tmp/
cd /tmp/repository
git merge ...
...if successful, do the real merge. :)
(หมายเหตุ: มันจะไม่ทำงานเพียงการโคลนไปที่ / tmp คุณจะต้องมีสำเนาเพื่อให้แน่ใจว่าการเปลี่ยนแปลงที่ไม่มีข้อผูกมัดจะไม่ขัดแย้งกัน)
cp -r repository/.git /tmp/repository/.git
, cd /tmp/repository
, git reset --hard
, git add --all
, git reset --hard
(การวัดที่ดี) git status
(เพื่อตรวจสอบว่ามันเป็นที่สะอาด)
ฉันรู้ว่านี่เป็นคำถามเก่า แต่เป็นคำถามแรกที่ปรากฏในการค้นหาของ Google
Git แนะนำตัวเลือก --ff-only เมื่อทำการผสาน
จาก: http://git-scm.com/docs/git-merge
--ff เท่านั้น
ปฏิเสธที่จะรวมและออกด้วยสถานะที่ไม่ใช่ศูนย์เว้นแต่ว่า HEAD ปัจจุบันนั้นทันสมัยอยู่แล้วหรือการผสานนั้นสามารถแก้ไขได้อย่างรวดเร็ว
การทำเช่นนี้จะพยายามผสานและกรอไปข้างหน้าและหากไม่สามารถยกเลิกและแจ้งให้คุณทราบว่าไม่สามารถดำเนินการกรอไปข้างหน้าได้ แต่ปล่อยให้สาขาการทำงานของคุณไม่มีการแตะต้อง ถ้ามันสามารถกรอไปข้างหน้าก็จะทำการผสานในสาขาการทำงานของคุณ git pull
ตัวเลือกนี้ก็ยังมีอยู่ ดังนั้นคุณสามารถทำสิ่งต่อไปนี้:
git pull --ff-only origin branchA #See if you can pull down and merge branchA
git merge --ff-only branchA branchB #See if you can merge branchA into branchB
ฉันใช้บันทึก git เพื่อดูว่ามีการเปลี่ยนแปลงอะไรในสาขาฟีเจอร์จากสาขาหลัก
git log does_this_branch..contain_this_branch_changes
เช่น - เพื่อดูว่าคอมมิชชันใดอยู่ในฟีเจอร์แบรนช์ที่มี / ไม่ถูกรวมเข้ากับมาสเตอร์:
git log master..feature_branch
ถ้าคุณต้องการกรอไปข้างหน้าอย่างรวดเร็วจาก B ไปยัง A คุณต้องแน่ใจว่าบันทึก git B..A ไม่แสดงอะไรเลยนั่นคือ A ไม่มีอะไรที่ B ไม่มี แต่แม้ว่า B..A มีบางอย่างคุณอาจยังสามารถผสานได้โดยไม่มีข้อขัดแย้งดังนั้นข้างต้นแสดงสองสิ่ง: ว่าจะมีการกรอไปข้างหน้าดังนั้นคุณจะไม่ได้รับความขัดแย้ง
ทางออกของฉันคือการรวมถอยหลัง
แทนที่จะรวมสาขาของคุณเข้ากับสาขา "เป้าหมาย" ระยะไกลให้รวมสาขานั้นเข้ากับของคุณ
git checkout my-branch
git merge origin/target-branch
คุณจะเห็นว่ามีข้อขัดแย้งใด ๆ หรือไม่และสามารถวางแผนเกี่ยวกับวิธีแก้ไขได้
หลังจากนั้นคุณสามารถยกเลิกการผสานผ่านทางคอมไพล์merge --abort
หรือ (หากไม่มีข้อขัดแย้งและการผสานเกิดขึ้น) ย้อนกลับไปยังคอมมิชชันก่อนหน้าผ่านgit reset --hard HEAD~1
ทำสำเนาชั่วคราวของสำเนาทำงานของคุณจากนั้นรวมเข้ากับที่และแตกต่างกันทั้งสอง