ฉันจะรวมสองคอมมิตเป็นคอมมิตเดียวได้อย่างไร?


99

ฉันมีสาขา 'โครงการแรก' ที่มี 2 ข้อตกลง ฉันต้องการกำจัดการกระทำเหล่านี้และทำให้มันปรากฏเป็นคอมมิตเดียว

คำสั่งgit merge --squashฟังดูมีแนวโน้ม แต่เมื่อฉันเรียกใช้git merge --squashเทอร์มินัลของฉันจะแสดงตัวเลือกสำหรับคำสั่ง คำสั่งที่ถูกต้องคืออะไร?

Commit 1:
Added 'homepage.html'
Added 'contacts.html'

Commit 2:
Added 'homepage.php'
Added 'homepage.php'
Deleted 'homepage.html'
Deleted 'contacts.html'

ฉันไม่คิดว่านั่นเป็นคำสั่งที่ถูกต้อง นอกจากนี้ฉันสงสัยว่าคุณสามารถเปลี่ยนการกระทำเช่นนั้นได้
BSull

ไม่คุณสามารถเปลี่ยนการคอมมิทหลายรายการเป็นคอมมิตเดียว: git-scm.com/book/en/Git-Tools-Rewriting-History คำถามของฉันเป็นเพียงคำสั่งเฉพาะสำหรับมัน
Don P

@Bull คุณสามารถเปลี่ยนแปลงการกระทำได้อย่างที่คุณต้องการ สามารถแก้ไขได้อย่างสมบูรณ์ทุกเวลา หากคุณแชร์รหัสกับผู้อื่นการทำเช่นนั้นจะเขียนประวัติของคุณใหม่และคุณจะทำงานกับสาขาอื่นได้อย่างมีประสิทธิภาพมากกว่าคนอื่น ๆ
meagar

สิ่งนี้ไม่ควรถูกหลอก อันที่จริงควรปิดอีกอันที่กว้างเกินไป คำถามอื่น ๆ ที่ถูกทำเครื่องหมายว่าหลอกลวงนั้นไม่จำเป็นต้องซับซ้อนเนื่องจากเกี่ยวข้องกับการละทิ้งฐานข้อมูลก่อนหน้านี้
Evan Carroll

คำตอบ:


134

คุณต้องการgit rebase -iที่จะดำเนินการrebase โต้ตอบ

หากคุณกำลังอยู่ใน "คอมมิต 1" ของคุณและคอมมิตที่คุณต้องการรวม "คอมมิต 2" คือคอมมิตก่อนหน้านี้คุณสามารถรันgit rebase -i HEAD~2ได้ซึ่งจะสร้างตัวแก้ไขที่แสดงรายการคอมมิตทั้งหมดที่ rebase จะข้ามผ่าน คุณควรเห็นสองบรรทัดขึ้นต้นด้วย "เลือก" หากต้องการดำเนินการสควอชให้เปลี่ยนคำแรกของบรรทัดที่สองจาก "เลือก" เป็น "สควอช" จากนั้นบันทึกไฟล์ของคุณและออก Git จะบดขยี้การกระทำครั้งแรกของคุณไปยังการกระทำครั้งที่สองของคุณ

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

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


2
ทำThen write your file, and quitอย่างไร? ฉันใช้ Android Studio Terminal, git console เองหรือแม้กระทั่งเปิด git console โดยซอฟต์แวร์ SourceTree แต่จะประหยัดและเลิกได้อย่างไร?
Dr.jacky

1
วิธีการรวม 2 คอมมิตที่ไม่ใช่สองคอมมิตสุดท้ายในสาขา
Weishi Zeng

1
@meagar ฉันคิดว่ามันสมเหตุสมผล ... ถ้าคุณตรวจสอบปัญหานี้ (ซ้ำกัน) การบีบ 'ทิศทาง' สร้างความแตกต่างอย่างมากและเป็นต้นตอของปัญหาทั้งหมด (ดูความคิดเห็นแรกที่มีการโหวตประมาณ 200 ครั้งเกี่ยวกับ ' squashing ผิดวิธี ') - stackoverflow.com/a/2568581/43453
PandaWood

1
@PandaWood คุณกำลังอ่านคำตอบผิด วิธีแรกคือความเรียบง่ายที่ไม่ถูกต้องไม่แตกต่างกัน คุณสามารถเพียงข้างหลังควอช, มันทำให้รู้สึกไม่ที่จะคิดว่า squashing เก่ากระทำเป็นหนึ่งใหม่ แต่ถ้าคุณสามารถมันจะดำเนินการเดียวกัน
meagar

1
ฉันเข้าใจถึง "เปลี่ยนคำแรกของบรรทัดที่สอง" - บรรทัดที่สองของอะไร
Andrew Torr

70

รุ่นง่ายขี้เกียจสำหรับคนขี้ลืมอย่างฉัน:

git rebase -i HEAD~3 หรือกระทำหลายอย่างแทน 3.

เปิดสิ่งนี้

pick YourCommitMessageWhatever
pick YouGetThePoint
pick IdkManItsACommitMessage

ในสิ่งนี้

pick YourCommitMessageWhatever
s YouGetThePoint
s IdkManItsACommitMessage

และจะดำเนินการบางอย่างที่คุณตีescแล้วenterเพื่อบันทึกการเปลี่ยนแปลง [1]

เมื่อหน้าจอถัดไปขึ้นมากำจัดขยะเส้น # [2] และสร้างใหม่กระทำข้อความหรืออะไรบางอย่างและทำเช่นเดียวกันescape enterการดำเนินการ [1]

ว้าวคุณมีการกระทำน้อยลง หรือคุณทำลายทุกอย่าง


[1] - หรืออะไรก็ตามที่ใช้ได้กับการกำหนดค่าคอมไพล์ของคุณ นี่เป็นเพียงลำดับที่มีประสิทธิภาพจากการตั้งค่าของฉัน

[2] - คุณจะเห็นบางสิ่งเช่น# this is your n'th commitสองสามครั้งโดยมีการกระทำเดิมของคุณอยู่ด้านล่างข้อความเหล่านี้ คุณต้องการลบบรรทัดเหล่านี้และสร้างข้อความคอมมิตเพื่อสะท้อนความตั้งใจของเอ็นคอมมิตที่คุณรวมเป็น 1


วิธีแก้ปัญหาที่รัดกุมมาก - ขอบคุณ อาจเป็นประโยชน์ในการร่างโครงร่างที่sใช้ในที่นี้หมายถึงสควอช เมื่อต้องการใช้การกระทำ แต่ meld เข้าไปก่อนหน้านี้กระทำ
UrbanConor

หากคุณมีเพียงแค่2กระทำและต้องการที่จะรวมเดียวกัน2กระทำคุณจะต้องเรียกใช้และgit reset --soft HEAD~ git commit --amend
scrutari

22
  1. ชำระเงินสาขาของคุณและนับจำนวนการกระทำทั้งหมดของคุณ
  2. เปิด git bash แล้วเขียน: git rebase -i HEAD~<quantity of your commits>(ie git rebase -i HEAD~5)
  3. ในคีย์เวิร์ดtxtเปลี่ยนไฟล์ที่เปิดpickเป็นsquashสำหรับคอมมิตทั้งหมดยกเว้นคอมมิตแรก (ซึ่งอยู่ด้านบน) สำหรับอันดับแรกให้เปลี่ยนเป็นreword(ซึ่งหมายความว่าคุณจะแสดงความคิดเห็นใหม่สำหรับข้อตกลงนี้ในขั้นตอนถัดไป) แล้วคลิกบันทึก! หากอยู่ในกลุ่มให้กดescแล้วบันทึกโดยการเข้าwq!และกด Enter
  4. แสดงความคิดเห็น
  5. เปิด Git และทำการ "ดึงข้อมูลทั้งหมด" เพื่อดูการเปลี่ยนแปลงใหม่

เสร็จแล้ว


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