วิธีทดสอบการผสานโดยไม่ต้องรวมก่อน


167

มีวิธีการจำลองgit mergeระหว่างสองสาขาสาขาที่ทำงานปัจจุบันและต้นแบบ แต่ไม่มีการเปลี่ยนแปลงใด ๆ ?

git mergeฉันมักจะมีความขัดแย้งเมื่อฉันจะต้องทำ มีวิธีการจำลองการผสานก่อนหรือไม่



1
ซ้ำซ้อนที่เป็นไปได้มีตัวเลือก git-merge --dry-run หรือไม่
คนดีบุก

คำตอบ:


133

ฉันไม่คิดว่าจะมีวิธีการจำลองสิ่งที่จะเกิดขึ้นจนกว่าคุณจะลองผสาน อย่างไรก็ตามถ้าคุณตรวจสอบให้แน่ใจว่าผลลัพธ์ของgit statusว่างเปล่าก่อนทำการผสานจะค่อนข้างปลอดภัยที่จะไปข้างหน้าและลอง หากคุณได้รับความขัดแย้งคุณสามารถกลับสู่สถานะที่เคยเป็นเมื่อก่อนด้วย:

git reset --merge

ตั้งแต่ git 1.7.4 คุณสามารถยกเลิกการผสานโดยทำดังนี้

git merge --abort

(เนื่องจากข้อความคอมมิชชันที่เพิ่มตัวเลือกนั้นจะอธิบายสิ่งนี้จะถูกเพิ่มเพื่อความสอดคล้องกับgit rebase --abortเป็นต้น


4
คำตอบของแอมเบอร์ @ แอมเบอร์ตอบคำถามที่ถูกถามว่า 'จำลองการผสาน' อย่างไร การใช้งาน--no-commitนั้นง่ายกว่ามากในความคิดของฉัน
samirahmed

14
@samirahmed: @Amber ตอบคำถามให้มากกว่านี้แน่นอนแม้ว่า--no-commitคุณจะยังคงเปลี่ยนดัชนีและแผนผังการทำงานซึ่งไม่ตรงกับ "โดยไม่มีการเปลี่ยนแปลง" :) จุดของฉันคือเมื่อมีคนถามแบบนี้ คำถามโดยทั่วไปแล้วเพราะพวกเขาไม่ทราบว่าวิธีที่ดีที่สุดในการดูว่าการผสานจะเป็นอย่างไรลองผสานรวมบ่อยครั้งเพราะพวกเขาไม่ทราบว่าการกลับไปอยู่ในสถานะที่เคยเป็นมานั้นง่ายเพียงใด หากมีปัญหาเกิดขึ้น
Mark Longair

2
ฉันไม่ทราบว่าสิ่งนี้ถูกเพิ่มเข้ามาใน git รุ่นที่ใหม่กว่าหรือไม่ แต่ในเอกสาร (1.8.4) มันระบุว่า " git merge --abortเทียบเท่ากับgit reset --mergeเมื่อMERGE_HEADมีอยู่" ดังนั้นสิ่งที่จำได้ง่ายกว่าคือ :)
Samuel Meacham

@ SamuelMeacham: ขอบคุณที่ชี้ให้เห็น - มันถูกนำมาใช้ใน 1.7.4 ฉันได้อัพเดตคำตอบแล้ว ขอบคุณ!
Mark Longair

ข้อเสนอแนะนี้ไม่ได้ทำอะไรให้ฉันกับ git 1.9.4
djangofan

139

คุณสามารถใช้git merge --no-commitเพื่อป้องกันไม่ให้ผสานจริง ๆ แล้วและถ้าคุณไม่ชอบวิธีการผสานทำงานเพียงรีเซ็ตเป็นหัวเดิม

หากคุณไม่ต้องการสรุปการรวมกลุ่มแม้ว่าจะเป็นการส่งต่อที่รวดเร็ว (และไม่มีข้อขัดแย้งตามคำจำกัดความ) คุณก็สามารถเพิ่มได้--no-ffเช่นกัน


ฉันไม่คิดว่าgit merge --abortมีอยู่ - บางทีคุณหมายถึงgit reset --mergeอะไร
Mark Longair

Nah ผมก็ลืมไปว่าแตกต่างจากrebaseที่มีอยู่ไม่สำหรับ--abort git merge
เหลืองอำพัน

7
ฉันก็จะโยนต่อ--no-ffไป เพื่อป้องกันไม่ให้ ff ผสานเกิดขึ้น
Andy

1
@ Andy's --no-ffเป็นข้อบังคับที่นี่เนื่องจาก--no-commitไม่หยุดการเปลี่ยนแปลงที่รวดเร็ว
jackr

1
@ Anant Anand Gupta - นี่เป็นกลอุบายที่ดี แต่มันควรจะเป็น: git config - alias.tm ทั่วโลก "merge - no-commit --no-ff"
pasx

109

ถ้าฉันต้องการเปรียบเทียบการเปลี่ยนแปลงในหัวข้อของหัวข้อกับต้นแบบฉันพบว่าง่ายที่สุดและปลอดภัยที่สุดในการทำสิ่งต่อไปนี้:

git checkout master
git checkout -b trial_merge
git merge topic_branch

หลังจากเสร็จสิ้นการผสานจะเห็นการเปลี่ยนแปลงรวมจากต้นแบบได้ง่าย

git diff master

เมื่อเสร็จแล้วให้ลบสาขา Trial_merge

git checkout master
git branch -D trial_merge

ด้วยวิธีนี้สาขาหลักจะไม่เปลี่ยนแปลง


4
คุณสามารถทำgit checkout --detachและทดสอบสิ่งที่คุณต้องการ หลังจากนั้นหากคุณต้องการเก็บการเปลี่ยนแปลงของคุณgit checkout -b new_branchไว้ และหากคุณต้องการละทิ้งการเปลี่ยนแปลงโปรดชำระเงินที่สาขาที่คุณต้องการ ( git checkout master)
Shayan Toqraee

หากtopic_branchมีขนาดใหญ่ (อย่างที่เป็นไปได้ในกรณีที่คุณอยู่ที่คำถามนี้ในตอนแรก) diff masterผลลัพธ์อาจมีขนาดใหญ่เกินไปสำหรับคุณที่จะใช้ลูกตาถ้าการผสานจะทำให้เกิดความขัดแย้ง
Crescent Fresh

ฉันชอบสิ่งนี้มาก ... ปลอดภัยและเรียบง่าย
สิงห์

4

ฉันใช้ :

git merge --ff-only

ตามเอกสาร :

ปฏิเสธที่จะรวมและออกด้วยสถานะที่ไม่ใช่ศูนย์เว้นแต่ว่า HEAD ปัจจุบันนั้นทันสมัยอยู่แล้วหรือการผสานนั้นสามารถแก้ไขได้อย่างรวดเร็ว

มันไม่ใช่การจำลองเพราะจะมีการผสานไปข้างหน้าอย่างรวดเร็วในกรณีที่ไม่มีความขัดแย้งระหว่างสองสาขา แต่ในกรณีที่มีข้อขัดแย้งคุณจะได้รับแจ้งและจะไม่มีอะไรเกิดขึ้น


4

ฉันสามารถใช้งานgit merge --abortได้ไม่นานมานี้ อย่างไรก็ตามสิ่งนี้สามารถใช้ได้เฉพาะเมื่อมีข้อขัดแย้งในการผสาน หากคุณแน่ใจว่าคุณไม่ต้องการที่จะกระทำให้ใช้วิธีการอื่น ๆ ที่กล่าวถึงข้างต้น


1
วิธีอื่นใดที่ได้กล่าวมาข้างต้น git merge --abortพวกเขากล่าวถึงทั้งหมด คุณควรพิสูจน์คำตอบของคุณในอนาคตโดยระบุผู้ที่เขียนคำตอบที่คุณอ้างอิง
Michael Fulton

3

ทำไมไม่เพียงสร้างสาขาใบปลิว (git checkout -b) และทำการทดสอบที่นั่น?


1
สิ่งที่คุณขอแนะนำให้เป็นจริงคำตอบโดยเอียนแสดงความกะทัดรัด :)
tzot

0

ฉันไม่ทราบแน่ชัดว่าเป็นกรณีของคุณแต่คำถามของคุณจำฉันได้ว่าบางครั้งฉันเริ่มต้นฟีเจอร์ฉันทำทุกวันและรวมการพัฒนาเข้าด้วยกันหลายครั้ง

ในจุดนี้ฉันสูญเสียการควบคุมไฟล์ที่แน่นอนที่ฉันเปลี่ยนไปและฉันจะรู้ได้เฉพาะเมื่อฟีเจอร์ของฉันถูกปิดและโค้ดของฉันจะพัฒนาขึ้น

ในกรณีนี้วิธีที่ดีที่จะทราบว่าการแก้ไขใดที่คุณทำ (ไม่ใช่อื่น ๆ จากการผสาน) กำลังใช้ Sourcetree

คุณต้องคลิกด้วยปุ่มขวาที่สาขาฐานและเลือกDiff Against Current:

คุณสมบัติของ Sourcetree เพื่อทราบความแตกต่างระหว่างสองสาขา

จากนั้น sourcetree จะแสดงการปรับเปลี่ยนทั้งหมดที่จะผสานหากคุณผสานสาขาของคุณเข้ากับสาขาพื้นฐาน

ผล

แน่นอนว่ามันจะไม่แสดงให้คุณเห็นถึงความขัดแย้ง แต่เป็นเครื่องมือที่มีประโยชน์ในการผสาน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.