ฉันมีโครงการที่มีประวัติศาสตร์อันยาวนาน ฉันต้องการแสดงคอมมิชชันแรกในคอมไพล์
ฉันจะทำสิ่งนี้ได้อย่างไร
ฉันมีโครงการที่มีประวัติศาสตร์อันยาวนาน ฉันต้องการแสดงคอมมิชชันแรกในคอมไพล์
ฉันจะทำสิ่งนี้ได้อย่างไร
คำตอบ:
git rev-list --max-parents=0 HEAD
(จากtiho ของความคิดเห็น . ในฐานะที่เป็นคริสจอห์นสันประกาศ , --max-parentsถูกนำมาใช้หลังจากคำตอบนี้ถูกโพสต์.)
ในทางเทคนิคอาจมีการคอมมิทมากกว่าหนึ่งรูท สิ่งนี้จะเกิดขึ้นเมื่อมีการรวมประวัติอิสระก่อนหน้านี้หลายรายการเข้าด้วยกัน มันเป็นเรื่องธรรมดาเมื่อโครงการเป็นแบบบูรณาการผ่านการผสานทรีย่อย
git.gitพื้นที่เก็บข้อมูลมีหกกระทำรากในกราฟประวัติศาสตร์ (คนละไลนัสเริ่มต้นกระทำgitkบางเครื่องมือแยกต่างหากแรกGit-GUI , gitwebและGit-P4 ) ในกรณีนี้เรารู้ว่าe83c516เป็นสิ่งที่เราน่าสนใจมันเป็นทั้งการกระทำที่เร็วที่สุดและการกระทำที่รูท
มันไม่ง่ายนักในกรณีทั่วไป
ลองนึกภาพว่าlibfooได้รับการพัฒนามาระยะหนึ่งแล้วเก็บประวัติไว้ในที่เก็บ Git ( libfoo.git) อิสระที่“บาร์” โครงการยังได้รับภายใต้การพัฒนา (ในbar.git) แต่ไม่ได้นานlibfoo (กระทำกับวันที่เก่าแก่ที่สุดในlibfoo.gitมีวันที่นำหน้ากระทำกับวันที่เก่าแก่ที่สุดในbar.git) ในบางจุดผู้พัฒนาของ“ บาร์” ตัดสินใจรวมlibfooในโครงการของพวกเขาโดยใช้ทรีทรีผสาน ก่อนการรวมนี้อาจเป็นเรื่องเล็กน้อยที่จะตัดสินการกระทำ“ ครั้งแรก” ในbar.git(อาจมีเพียงหนึ่งรูทการส่ง) อย่างไรก็ตามหลังจากการผสานมีหลายการกระทำและรูทแรกสุดที่กระทำจริงมาจากประวัติของlibfooไม่ใช่ "บาร์"
คุณสามารถค้นหารากทั้งหมดที่กระทำในประวัติ DAG ดังนี้:
git rev-list --max-parents=0 HEAD
สำหรับเร็กคอร์ดหาก--max-parentsไม่พร้อมใช้งานสิ่งนี้จะทำงานเช่นกัน:
git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$"
หากคุณมีแท็กที่มีประโยชน์อยู่แล้วgit name-revอาจให้ภาพรวมโดยย่อเกี่ยวกับประวัติ:
git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$" | git name-rev --stdin
ใช้สิ่งนี้บ่อยไหม? จำยากไหม เพิ่มนามแฝง git เพื่อการเข้าถึงที่รวดเร็ว
git config --global alias.first "rev-list --max-parents=0 HEAD"
ตอนนี้คุณสามารถทำได้
git first
git rev-list --max-parents=0 HEADจะทำเช่นเดียวกันและเรียบง่ายขึ้นเล็กน้อย
ฉันพบว่า:
git log --reverse
แสดงความมุ่งมั่นตั้งแต่เริ่มต้น
git log --reverse -5ทำให้มันไม่สนใจ--reverseด้วยเหตุผลบางอย่าง
คุณสามารถย้อนกลับบันทึกของคุณและมุ่งไปที่ผลลัพธ์แรก
git log --pretty=oneline --reverse | head -1
git log --reverseย้อนกลับประวัติดังนั้นคุณต้องใช้head -1แทนที่จะtail -1ได้รับการยอมรับครั้งแรก
-nธงเมื่อ--reverseได้รับ
git log $(git log --pretty=format:%H|tail -1)
git log $(git log --reverse --pretty=format:%H|head -1)
ไม่ใช่วิธีที่สวยที่สุดในการทำฉันเดาว่า:
git log --pretty=oneline | wc -l
นี่จะให้ตัวเลขกับคุณ
git log HEAD~<The number minus one>
git log --format="%h" | tail -1 ให้แฮชการกระทำ (เช่น 0dd89fb ) ซึ่งคุณสามารถป้อนลงในคำสั่งอื่นโดยทำสิ่งที่ต้องการ
git diff `git log --format="%h" --after="1 day"| tail -1`..HEAD เพื่อดูข้อผูกพันทั้งหมดในวันสุดท้าย
git log -1เท่านั้น