วิธีการแสดงความมุ่งมั่นครั้งแรกโดย 'บันทึก git'?


290

ฉันมีโครงการที่มีประวัติศาสตร์อันยาวนาน ฉันต้องการแสดงคอมมิชชันแรกในคอมไพล์

ฉันจะทำสิ่งนี้ได้อย่างไร


2
ฉันพบวิธีที่จะแสดงสิ่งสุดท้ายgit log -1เท่านั้น
alex

คำตอบ:


299

คำตอบสั้น ๆ

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

49
ฉันเชื่อว่าgit rev-list --max-parents=0 HEADจะทำเช่นเดียวกันและเรียบง่ายขึ้นเล็กน้อย
tiho

3
@tiho: ใช่มันทำแบบเดียวกันและเรียบง่ายกว่า แม้ว่าตัวเลือกนั้นยังไม่ได้"ประดิษฐ์"ในช่วงเวลาของคำถาม / คำตอบนี้
Chris Johnsen

มันเกิดขึ้นกับผมว่าครั้งแรกที่กระทำมีมากขึ้นของใบกระทำกว่ารากกระทำ
tiwo

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

@RussellSilva ฉันไม่สนใจจุด แต่ฉันเชื่อว่าเป็นไปได้ที่จะแก้ไขคำตอบของคนอื่นซึ่งอาจจะดีกว่าการเพิ่มจุดใหม่ ฉันไม่สบายใจที่จะทำมันด้วยตัวเอง แต่รู้สึกอิสระที่จะทำ :)
tiho

416

ฉันพบว่า:

git log --reverse

แสดงความมุ่งมั่นตั้งแต่เริ่มต้น


19
น่าสนใจgit log --reverse -5ทำให้มันไม่สนใจ--reverseด้วยเหตุผลบางอย่าง
Dan2552

6
@ Dan2552 ดูเหมือนว่าเป็นข้อผิดพลาดควรรายงานอย่างไร
saeedgnu

23
ดูเหมือนว่ามันจะ จำกัด ผลลัพธ์ไว้ที่ 5 รายการจากนั้นย้อนกลับ
nonopolarity

3
@ 太極者無極而生ถูกต้องนั่นคือพฤติกรรมที่บันทึกไว้
ร้ายแรง

44

คุณสามารถย้อนกลับบันทึกของคุณและมุ่งไปที่ผลลัพธ์แรก

git log --pretty=oneline --reverse | head -1

7
git log --reverseย้อนกลับประวัติดังนั้นคุณต้องใช้head -1แทนที่จะtail -1ได้รับการยอมรับครั้งแรก
rubiii

4
มันจะดีที่สุดถ้าคอมไพล์ไม่ได้เพิกเฉยต่อ-nธงเมื่อ--reverseได้รับ
Frederick Nord


6

ไม่ใช่วิธีที่สวยที่สุดในการทำฉันเดาว่า:

git log --pretty=oneline | wc -l

นี่จะให้ตัวเลขกับคุณ

git log HEAD~<The number minus one>

1

git log --format="%h" | tail -1 ให้แฮชการกระทำ (เช่น 0dd89fb ) ซึ่งคุณสามารถป้อนลงในคำสั่งอื่นโดยทำสิ่งที่ต้องการ

git diff `git log --format="%h" --after="1 day"| tail -1`..HEAD เพื่อดูข้อผูกพันทั้งหมดในวันสุดท้าย

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