คอมไพล์ผสานโดยไม่ต้องกระทำอัตโนมัติ


402

เป็นไปได้ที่จะทำgit mergeแต่ไม่มีความมุ่งมั่น?

"man git merge" พูดว่า:

With --no-commit perform the merge but pretend the merge failed and do not autocommit,
to give the user a chance to inspect and further tweak the merge result before
committing.

แต่เมื่อฉันพยายามที่จะใช้git mergeกับ--no-commitมันก็ยังคงกระทำโดยอัตโนมัติ นี่คือสิ่งที่ฉันทำ:

$> ~/git/testrepo$ git checkout master
Switched to branch 'master'

$> ~/git/testrepo$ git branch
* master
  v1.0

$> ~/git/testrepo$ git merge --no-commit v1.0
Updating c0c9fd2..18fa02c
Fast-forward
 file1 |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

$> ~/git/testrepo$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)

ต่อมาgit logเผยให้เห็นความมุ่งมั่นทั้งหมดจากสาขา v1.0 รวมเข้ากับต้นแบบ

คำตอบ:


616

บันทึกผลลัพธ์ขณะทำการผสาน - กำลังบอกว่า Fast Forward

ในสถานการณ์เช่นนี้คุณต้องการทำ:

git merge v1.0 --no-commit --no-ff

7
เกิดอะไรขึ้นถ้ามีความผิด
Jürgen Paul

20
@PinappleUndertheSea ส่งต่ออย่างรวดเร็วไม่เคยทำให้เกิดความขัดแย้ง ในกรณีที่การผสาน "ของจริง" โดยไม่มีการ--no-commitสลับไปข้างหน้าอย่างรวดเร็วสวิตช์จะมีผลก็ต่อเมื่อไม่มีข้อขัดแย้งเกิดขึ้นในกรณีที่มีข้อขัดแย้ง git จะไม่กระทำโดยอัตโนมัติ
gronostaj

38
FYI: หากคุณต้องการรวมการเปลี่ยนแปลงแล้วกระทำราวกับว่าคุณได้พิมพ์การเปลี่ยนแปลงทั้งหมดที่คุณผสานด้วยตนเอง (ซึ่งตรงกันข้ามกับการผสานแบบดั้งเดิม) คุณจะต้องเรียกใช้rm .git/MERGE_HEADหลังจากนั้นซึ่งจะทำให้คอมไพล์ลืมการรวมที่เกิดขึ้น
Jonn

7
FYI: นี่คือผลลัพธ์ตัวอย่างสำหรับการผสานที่ประสบความสำเร็จ:Automatic merge went well; stopped before committing as requested
kevinarpe

6
เห็นได้ชัดว่าgit merge BRANCHENAME --no-commit --no-ffออกจากพื้นที่ทำงานของฉันในสถานะ "MERGING" คอมไพล์ ไม่แน่ใจว่าสิ่งนี้ทำอะไร แต่วงจรที่เรียบง่ายgit stash saveและgit stash popดูเหมือนจะกลับไปทุกอย่างกลับสู่ปกติ มีเพียงไฟล์ที่แก้ไขจากสาขาเป้าหมายในสถานที่ตามที่ตั้งใจไว้และไม่มีสถานะการควบรวมกิจการอีกต่อไป
MoonLite

49

คุณเข้าใจความหมายของการรวมที่นี่ผิด

การ--no-commitป้องกันไม่ให้ MERGE COMMIT เกิดขึ้นและจะเกิดขึ้นเฉพาะเมื่อคุณรวมประวัติสาขาที่แตกต่างกันสองรายการ ในตัวอย่างของคุณไม่ใช่กรณีเนื่องจาก Git ระบุว่าเป็นการผสาน "การกรอไปข้างหน้า" จากนั้น Git จะใช้การกระทำที่มีอยู่แล้วในสาขาตามลำดับเท่านั้น


12
ที่จะไม่ (imo) จำเป็นต้องล้างความสับสน; ฉันคิดว่านี่เป็นเวลาหนึ่ง (ค่อนข้างหายาก) จริง ๆ แล้วเอกสารชัดเจน: git help merge=> "เมื่อ--no-commitทำการผสาน แต่แกล้งทำเป็นว่าการผสานล้มเหลวและไม่ทำการตรวจสอบอัตโนมัติเพื่อให้ผู้ใช้มีโอกาสตรวจสอบและปรับแต่งผลการรวมก่อนทำการยืนยัน " กุญแจสำคัญคือการใช้มันร่วมกับ--no-ff
ไมเคิล

6
... อาจจะสับสนน้อยกว่าถ้าแยกจากคำศัพท์ที่เข้มงวดและอธิบายด้วยวิธีนี้: "git merge" ที่ทำให้การกรอไปข้างหน้าไม่มีการรวมเพราะมันไม่ได้เป็นการผสาน นี่คือความจริงแล้วสถานการณ์ในอุดมคติ: การส่งต่ออย่างรวดเร็วเป็นสิ่งที่ดีและไม่ได้มีการ "รวมการกระทำ" เข้าไว้ด้วยกัน นี่เป็นพฤติกรรมเริ่มต้นที่ดีและไม่ควรปิดการใช้งาน (ในการพูดจาที่เหมาะสมการส่งต่อที่รวดเร็วเป็นประเภทของการรวมกัน แต่ไม่ใช่ "การผสานที่แท้จริง")
michael

4
มันสัมพันธ์กับนโยบายของโครงการในบางกรณีมันมีประโยชน์ที่จะมี / บังคับ "รวมการกระทำ" เหล่านั้นเป็นพิเศษแม้ว่ามันจะเป็น ff เพราะคุณจำเป็นต้องทำเครื่องหมายการรวมคุณสมบัติไว้ในสาขาหลัก
Samus_

7
...อะไร. เอาล่ะฉันคิดว่าคอมไพล์นั้นไม่สามารถกู้ได้มากนัก คำตอบนี้โดยเฉพาะอย่างยิ่งมีความเชื่อมั่นให้ผมลอง Mercurial
Brian Gordon

24

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

$ git merge --squash v1.0
$ git commit

1
นี่เป็นผลเช่นเดียวกับgit merge v1.0 --no-commit --no-ff
jpierson

2
ไม่เอฟเฟกต์ต่างกัน สควอชสร้างคอมมิทใหม่ด้วยแฮชใหม่ มันรวมความมุ่งมั่นทั้งหมดในสาขาเป็นหนึ่งกระทำการรวม
Kavi Siegel

23

ฉันชอบวิธีนี้ดังนั้นฉันไม่จำเป็นต้องจำพารามิเตอร์หายาก

git merge branch_name

จากนั้นจะบอกว่าสาขาของคุณอยู่ข้างหน้าด้วยการ#กระทำ "" ตอนนี้คุณสามารถเปิดการกระทำเหล่านี้และนำพวกเขาไปสู่การเปลี่ยนแปลงการทำงานด้วยสิ่งต่อไปนี้:

git reset @~#

ตัวอย่างเช่นถ้าหลังจากการผสานมันคือ 1 คอมมิตล่วงหน้าให้ใช้:

git reset @~1

หมายเหตุ: สำหรับ Windows จำเป็นต้องใช้เครื่องหมายคำพูด (ดังที่จอชระบุไว้ในความคิดเห็น) เช่น:

git reset "@~1"

4
ใน windows จำเป็นต้องมีการเสนอราคา:git reset "@~1"
Josh

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