จะไม่มีการเปลี่ยนแปลงและข้อความใหม่ได้อย่างไร?


150

ฉันจะสร้างข้อความใหม่commitและสร้างข้อความใหม่ได้อย่างไรหากไม่มีการเปลี่ยนแปลงไฟล์

เป็นไปไม่ได้เนื่องจากรหัสของการกระทำ (SHA?) จะเหมือนกันหรือไม่?

คำตอบ:


187

ไม่ค่อยมีเหตุผลที่ดีในการทำเช่นนี้ แต่พารามิเตอร์มี--allow-emptyไว้--allow-empty-messageสำหรับการคอมมิตว่าง (ไม่มีไฟล์เปลี่ยนแปลง) ตรงกันข้ามกับข้อความคอมมิตว่าง นอกจากนี้คุณยังสามารถอ่านเพิ่มเติมโดยการพิมพ์git help commitหรือเยี่ยมชมเอกสารออนไลน์

ในขณะที่วัตถุต้นไม้ (ซึ่งมีแฮชเป็นของตัวเอง) จะเหมือนกัน แต่การคอมมิตนั้นจะมีแฮชที่แตกต่างกันเพราะมันน่าจะมีการประทับเวลาและข้อความที่แตกต่างกันและจะมีการคอมมิตของพาเรนต์ที่แตกต่างกัน ปัจจัยทั้งสามเหล่านี้รวมอยู่ในgitอัลกอริทึมแฮชอ็อบเจ็กต์


มีอยู่ไม่กี่เหตุผลที่คุณอาจต้องการที่ว่างเปล่ากระทำ (ผสมผสานความคิดเห็นบางส่วน):

  • ในฐานะ "การกระทำที่เปิดเผย" เพื่อเพิ่มคำบรรยายหรือเอกสารประกอบ (ผ่านDavidNeiss ) รวมถึงข้อมูลหลังความจริงเกี่ยวกับการผ่านการทดสอบหรือผ้าสำลี (ผ่านRobert Balicki )
  • เพื่อทดสอบgitคำสั่งโดยไม่สร้างการเปลี่ยนแปลงตามอำเภอใจ (ผ่านVaelus )
  • ในการสร้างที่เก็บเปล่าที่ถูกลบอีกครั้งโดยใช้gitolite(ผ่านTatsh )
  • เพื่อสร้างคอมมิตใหม่โดยพลการเช่นสำหรับการทริกเกอร์เครื่องมือบิลด์อีกครั้ง (ผ่านmattLummus ) หรือเพื่อประโยชน์ในการบันทึกหรือเมตริกส่วนบุคคล (ผ่านDynamiteReed ) อย่างไรก็ตามลองคิดดู: ขึ้นอยู่กับโครงสร้างสาขา / การผสานของคุณการคอมมิตอาจมีอยู่เป็นเวลานานดังนั้นกลยุทธ์ "เพียงแค่กระทำอะไรเลย" อาจทำให้พื้นที่เก็บข้อมูลของทีมของคุณเสียไปโดยไม่ได้ตั้งใจด้วยอาร์ติแฟกต์เวิร์กโฟลว์ชั่วคราวและทำให้ยากที่จะแยกการแก้ไขโค้ดออกจาก Cruft ชั่วคราว

กลยุทธ์อื่น ๆ ในการเพิ่มข้อมูลเมตาลงในโครงสร้างคอมมิต ได้แก่ :

  • แยกสาขาหรือแท็กที่มีน้ำหนักเบาซึ่งชี้ไปที่การคอมมิตของสถานะหนึ่ง ๆ เสมอ (เช่น "การคอมมิตล่าสุดที่ยอมรับ" หรือ "การคอมมิตการจัดเตรียมปัจจุบัน")
  • แท็กคำอธิบายประกอบสำหรับวิธีบันทึกการประทับเวลาคอมมิตเตอร์และข้อความโดยชี้ไปยังคอมมิตที่มีอยู่โดยไม่ต้องเพิ่มรายการในโครงสร้างการคอมมิตเอง
  • git notes เพื่อเชื่อมโยงบันทึกย่อที่เปลี่ยนแปลงได้ที่ด้านบนของการกระทำที่ไม่เปลี่ยนรูปที่มีอยู่

4
ฉันได้เริ่มทำตามโมเดลสาขากระแส git แล้ว เมื่อคุณทำdevแบบฟอร์มสาขาmasterแล้วfeatสาขาทันทีdevที่featสาขารูปลักษณ์ที่จะมาจากmasterสาขาที่ไม่มีความแตกต่างกระทำในdevสาขาที่featสาขามาจาก ที่ว่างเปล่ากระทำเมื่อคุณทำให้devสาขาจะช่วยสร้างdevสาขาเป็นของตัวเองไปเรื่อย ๆ masterเป็นเวลานานอิสระสาขาของ โดยทั่วไปจะมีประโยชน์เมื่อคุณใช้กิ่งก้านเป็นเลเยอร์และสร้างสองชั้นจากการคอมมิตเดียว
Novice C

3
อีกเหตุผลหนึ่ง: หากคุณละเว้นบางสิ่งที่สำคัญออกไปจากข้อความคอมมิตก่อนที่จะกดคุณจะไม่สามารถทำได้commit --amendหากรีโมทไม่อนุญาตให้กดบังคับ ด้วยวิธีนี้คุณสามารถอนุญาตให้นักพัฒนาเห็นข้อความสำคัญที่มาพร้อมกับการคอมมิตก่อนหน้านี้
Andy J

2
ฉันต้องการทำสิ่งนี้เพราะฉันผลักดันการคอมมิต แต่ลืมพูดถึงบางอย่างในข้อความคอมมิต ข้อความคอมมิตของเรารวมเข้ากับการติดตามปัญหาและซอฟต์แวร์การผสานรวมอย่างต่อเนื่องและเนื้อหาของข้อความคอมมิตจะส่งผลต่อแอปพลิเคชันเหล่านั้น มีวิธีที่ดีกว่า? นี่ดูเหมือนจะเป็นทางออกที่ดีที่สุดในกรณีของฉัน สิ่งเดียวที่ฉันนึกได้คือสามารถย้อนกลับการกระทำก่อนหน้านี้ได้
sytech

2
ฉันเพิ่งใช้สิ่งนี้เพื่อทริกเกอร์ pre-commit hook ของเราซึ่งสคริปต์ฐานข้อมูล ดังนั้นจึงมีการเปลี่ยนแปลงเพียงแค่คอมไพล์ไม่สามารถมองเห็นได้จนกว่าสคริปต์จะทำงาน แน่นอนว่าสามารถรันได้ด้วยตนเอง แต่จากนั้นจะเรียกใช้สคริปต์สองครั้ง
yoyodyn

2
มีประโยชน์มากเมื่อโต้ตอบกับปัญหาการติดตามในตัวไปยังเซิร์ฟเวอร์ git เป็น github และ gogs
SimonF

45

ถ้าฉันเข้าใจคุณถูกต้องคุณต้องการที่จะทำการคอมมิตว่างเปล่า ในกรณีนี้คุณต้อง:

git commit --allow-empty

39

ว่างเปล่าด้วยข้อความ

git commit --allow-empty -m "Empty test commit"

ล้างคอมมิตด้วยข้อความว่างเปล่า

git commit --allow-empty --allow-empty-message


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