มีวิธีการตรวจสอบเมื่อสาขา Git ถูกสร้างขึ้น? ฉันมีสาขาใน repo ของฉันและฉันจำไม่ได้ว่าการสร้างมันและคิดว่าอาจจะเห็นการประทับเวลาการสร้างจะเขย่าหน่วยความจำของฉัน
มีวิธีการตรวจสอบเมื่อสาขา Git ถูกสร้างขึ้น? ฉันมีสาขาใน repo ของฉันและฉันจำไม่ได้ว่าการสร้างมันและคิดว่าอาจจะเห็นการประทับเวลาการสร้างจะเขย่าหน่วยความจำของฉัน
คำตอบ:
ใช้
แสดง git - สรุป 'git ผสานฐาน foo master'
หากคุณต้องการดูในบริบทโดยใช้ gitk ให้ใช้
gitk - ทั้งหมด - เลือกยอมรับ = `git ผสานฐาน foo master`
(โดยที่ foo เป็นชื่อของสาขาที่คุณกำลังมองหา)
ตามที่ระบุไว้ในความคิดเห็นและคำตอบของ Jackubตราบใดที่สาขาของคุณอายุน้อยกว่าจำนวนวันที่กำหนดไว้ในการตั้งค่าคอนฟิกgc.reflogexpire
(ค่าเริ่มต้นคือ 90 วัน) จากนั้นคุณสามารถใช้ reflog ของคุณเพื่อค้นหาเมื่อมีการอ้างอิงสาขา สร้างขึ้นครั้งแรก
โปรดทราบว่าgit reflog
สามารถใช้git log
ธงส่วนใหญ่ นอกจากนี้โปรดทราบว่าHEAD@{0}
ตัวเลือกสไตล์นั้นเป็นตัวบอกเวลาอย่างมีประสิทธิภาพและอันที่จริงแล้วมีการจัดการ (ในลักษณะที่แฮ็ก) เป็นสตริงวันที่ ซึ่งหมายความว่าคุณสามารถใช้การตั้งค่าสถานะ--date=local
และรับผลลัพธ์เช่นนี้:
$ git reflog --date = local 763008c HEAD @ {ศุกร์ 20 สิงหาคม 10:09:18 2010}: ดึง: กรอไปข้างหน้า f6cec0a HEAD @ {อังคาร 10 สิงหาคม 09:37:55 2010}: ดึง: กรอไปข้างหน้า e9e70bc HEAD @ {Thu Feb 4 02:51:10 2010}: pull: กรอไปข้างหน้า 836f48c HEAD @ {พฤหัสบดี 21 มกราคม 14:08:14 2010}: เช็คเอาต์: ย้ายจากต้นแบบเป็นหลัก 836f48c HEAD @ {พฤหัสบดี 21 มกราคม 14:08:10 2010}: ดึง: กรอไปข้างหน้า 24bc734 HEAD @ {Wed Jan 20 12:05:45 2010}: ชำระเงิน: ย้ายจาก 74fca6a42863ffacaf7ba6f1936a9f228950f657 74fca6a HEAD @ {Wed Jan 20 11:55:43 2010}: เช็คเอาต์: ย้ายจากต้นแบบเป็น v2.6.31 24bc734 HEAD @ {Wed Jan 20 11:44:42 2010}: pull: กรอไปข้างหน้า 964fe08 HEAD @ {จันทร์ 26 ตุลาคม 15:29:29 2009}: เช็คเอาต์: ย้ายจาก 4a6908a3a050aacc9c3a2f36b276b46c0629ad91 4a6908a HEAD @ {จันทร์ 26 ตุลาคม 14:52:12 2009}: เช็คเอาต์: ย้ายจากต้นแบบเป็น v2.6.28
มันอาจจะมีประโยชน์ในบางครั้งที่จะใช้--date=relative
:
$ git reflog - วันที่ = ญาติ 763008c HEAD @ {4 สัปดาห์ก่อน}}: pull: กรอไปข้างหน้า f6cec0a HEAD @ {6 สัปดาห์ที่ผ่านมา}: pull: กรอไปข้างหน้า e9e70bc HEAD @ {8 เดือนที่ผ่านมา}: pull: กรอไปข้างหน้า 836f48c HEAD @ {8 เดือนที่ผ่านมา}: การเช็คเอาต์: ย้ายจากต้นแบบเป็นหลัก 836f48c HEAD @ {8 เดือนที่ผ่านมา}: pull: กรอไปข้างหน้า 24bc734 HEAD @ {8 เดือนที่ผ่านมา}: เช็คเอาต์: ย้ายจาก 74fca6a42863ffacaf7ba6f1936a9f228950f657 ไปยังต้นแบบ 74fca6a HEAD @ {8 เดือนที่ผ่านมา}: เช็คเอาต์: ย้ายจากต้นแบบเป็น v2.6.31 24bc734 HEAD @ {8 เดือนที่ผ่านมา}: pull: กรอไปข้างหน้า 964fe08 HEAD @ {11 เดือนก่อน}}: เช็คเอาต์: ย้ายจาก 4a6908a3a050aacc9c3a2f36b276b46c0629ad91 เป็นผู้เชี่ยวชาญ 4a6908a HEAD @ {11 เดือนที่ผ่านมา}: การเช็คเอาท์: ย้ายจากต้นแบบเป็น v2.6.28
หมายเหตุสุดท้ายหนึ่ง: --all
ธง (ซึ่งจริงๆแล้วเป็นสถานะ git-log ที่เข้าใจโดย git-reflog) จะแสดง reflogs สำหรับ refs ที่รู้จักทั้งหมดในrefs/
(แทนที่จะเป็นอย่างง่ายHEAD
) ซึ่งจะแสดงกิจกรรมสาขาให้คุณเห็นอย่างชัดเจน:
git reflog - วันที่ = local - ทั้งหมด 860e4e4 refs / heads / master @ {Sun Sep 19 23:00:30 2010}: ส่ง: วินาที 17695bc refs / heads / example_branch @ {จันทร์ 20 ก.ย. 00:31:06 2010}: สาขา: สร้างจาก HEAD
gc.reflogexpire
กี่วัน
Pro Git § 3.1 Git Branching - สาขาใดมีคำอธิบายที่ดีเกี่ยวกับสาขา git จริงๆ
สาขาใน Git เป็นเพียงตัวชี้แบบเคลื่อนย้ายได้น้ำหนักเบาเพื่อ [กระทำ]
เนื่องจากสาขาเป็นเพียงตัวชี้ที่มีน้ำหนักเบา git จึงไม่มีแนวคิดที่ชัดเจนเกี่ยวกับประวัติหรือวันที่สร้าง "แต่แขวน" ฉันได้ยินคุณพูดว่า "แน่นอน git รู้ประวัติศาสตร์สาขาของฉัน!" เรียงกันของ
หากคุณเรียกใช้อย่างใดอย่างหนึ่งต่อไปนี้:
git log <branch> --not master
gitk <branch> --not master
คุณจะเห็นว่า "ประวัติของสาขา" ของคุณเป็นอย่างไร แต่จริงๆแล้วเป็นรายการที่สามารถเข้าถึงได้จาก 'สาขา' ที่ไม่สามารถเข้าถึงได้จากต้นแบบ สิ่งนี้จะให้ข้อมูลที่คุณต้องการ แต่ถ้าหากคุณไม่เคยรวม 'สาขา' กลับไปที่ต้นแบบและไม่เคยรวมต้นแบบเป็น 'สาขา' นับตั้งแต่คุณสร้างมันขึ้นมา หากคุณได้รวมแล้วประวัติศาสตร์ของความแตกต่างนี้จะยุบ
โชคดีที่ reflog มักจะมีข้อมูลที่คุณต้องการตามที่อธิบายไว้ในคำตอบอื่น ๆ อีกมากมายที่นี่ ใช้สิ่งนี้:
git reflog --date=local <branch>
เพื่อแสดงประวัติของสาขา รายการสุดท้ายในรายการนี้คือ (อาจ) จุดที่คุณสร้างสาขา
หากสาขาถูกลบแล้ว 'branch' จะไม่ใช่ตัวระบุ git ที่ถูกต้องอีกต่อไป แต่คุณสามารถใช้สิ่งนี้แทนซึ่งอาจค้นหาสิ่งที่คุณต้องการ:
git reflog --date=local | grep <branch>
หรือใน Windows cmd shell:
git reflog --date=local | find "<branch>"
โปรดทราบว่าการอ้างอิงไม่สามารถทำงานได้อย่างมีประสิทธิภาพในสาขาระยะไกลเฉพาะสาขาที่คุณทำงานในพื้นที่เท่านั้น
gc.reflogexpire
วันดังที่ระบุไว้ในคำตอบนี้และคำตอบนี้
git reflog --date=local <branch>
ขั้นแรกหากสาขาของคุณถูกสร้างขึ้นภายในgc.reflogexpire
วัน (เริ่มต้น 90 วันคือประมาณ 3 เดือน) คุณสามารถใช้git log -g <branch>
หรือgit reflog show <branch>
ค้นหารายการแรกใน reflog ซึ่งจะเป็นเหตุการณ์การสร้างและมีลักษณะดังนี้ (สำหรับgit log -g
):
Reflog: <branch>@{<nn>} (C R Eator <creator@example.com>)
Reflog message: branch: Created from <some other branch>
คุณจะได้รับว่าใครเป็นผู้สร้างสาขาจำนวนการดำเนินการที่ผ่านมาและจากสาขาใด (อาจเป็นแค่ "สร้างจากส่วนหัว" ซึ่งไม่ได้ช่วยอะไรมาก)
นั่นคือสิ่งที่ MikeSep กล่าวในคำตอบของเขา
ประการที่สองถ้าคุณมีสาขานานกว่า gc.reflogexpire
และคุณได้รันgit gc
(หรือเรียกใช้โดยอัตโนมัติ) คุณจะต้องค้นหาบรรพบุรุษร่วมกับสาขาที่สร้างขึ้น ลองดูที่ไฟล์กำหนดค่าบางทีอาจมีbranch.<branchname>.merge
รายการซึ่งจะบอกให้คุณทราบว่าสาขานี้ใช้สาขาใด
หากคุณรู้ว่าสาขาที่เป็นปัญหาถูกสร้างขึ้นจากสาขาหลัก (การแยกจากสาขาหลัก) ตัวอย่างเช่นคุณสามารถใช้คำสั่งต่อไปนี้เพื่อดูบรรพบุรุษร่วม:
git show $(git merge-base <branch> master)
คุณสามารถลองgit show-branch <branch> master
เป็นทางเลือก
นี่คือสิ่งที่gbacon กล่าวว่าในการตอบสนองของเขา
ฉันยังไม่แน่ใจเกี่ยวกับคำสั่ง git แต่ฉันคิดว่าคุณสามารถค้นหาพวกมันได้ใน reflogs
.git/logs/refs/heads/<yourbranch>
ไฟล์ของฉันดูเหมือนจะมีการประทับเวลา unix ในพวกเขา
อัปเดต:มีตัวเลือกในการใช้ประวัติ reflog แทนประวัติการส่งมอบเมื่อพิมพ์บันทึก:
git log -g
คุณสามารถติดตามบันทึกนี้เช่นกันกลับไปเมื่อคุณสร้างสาขา git log
แม้ว่าจะแสดงวันที่กระทำ แต่ไม่ใช่วันที่คุณทำการกระทำที่ทำรายการใน reflog ฉันยังไม่พบยกเว้นโดยดูที่การอ้างอิงจริงในเส้นทางด้านบน
ลองสิ่งนี้
git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)'
%
มาก่อน(refname)
| cut -c 5- | sort -r |
และจากนั้นส่งผ่าน grep สำหรับเดือนให้รายการ lin ลำดับย้อนกลับของฉันมากหรือน้อย
--sort='-committerdate'
(หมายเหตุ '-' ก่อน committerdate สำหรับลำดับย้อนกลับ)
ใช้:
git reflog
เพื่อแสดงวงจรชีวิตทั้งหมดของที่เก็บข้อมูลของคุณในโฟลเดอร์ปัจจุบัน ชื่อสาขาที่ปรากฏขึ้นครั้งแรก (จากมากไปน้อย) เป็นแหล่งที่สร้างขึ้น
855a3ce HEAD@{0}: checkout: moving from development to feature-sut-46
855a3ce HEAD@{1}: checkout: moving from feature-sut-46 to development
855a3ce HEAD@{2}: checkout: moving from feature-jira35 to feature-sut-46
535dd9d HEAD@{3}: checkout: moving from feature-sut-46 to feature-jira35
855a3ce HEAD@{4}: checkout: moving from development to feature-sut-46
855a3ce HEAD@{5}: checkout: moving from feature-jira35 to development
535dd9d HEAD@{6}: commit: insert the format for vendor specific brower - screen.css
855a3ce HEAD@{7}: checkout: moving from development to feature-jira35
855a3ce HEAD@{8}: checkout: moving from master to development
นั่นหมายถึง:
มีการสร้างการพัฒนาสาขา (checkout -b) จากต้นแบบ
คุณลักษณะของสาขา - jira35 ถูกสร้างขึ้น (checkout -b) จากการพัฒนา
คุณลักษณะของสาขา -Jira-sut-46 ถูกสร้างขึ้น (checkout -b) จากการพัฒนา
นี่คือสิ่งที่ฉันเกิดขึ้นก่อนที่ฉันจะพบกระทู้นี้
git reflog show --date=local --all | sed 's!^.*refs/!refs/!' | grep '/master' | tail -1
git reflog show --date=local --all | sed 's!^.*refs/!refs/!' | grep 'branch:'
คำสั่งนี้แสดงวันที่สร้างสาขาdev
จากmain
$git reflog show --date=iso dev
$7a2b33d dev@{2012-11-23 13:20:28 -2100}: branch: Created from main
หากคุณต้องการทราบรายละเอียดของสาขาทั้งหมด
for i in `git branch -r | tail -n +2 `;do git log --reverse $i|grep -A 2 -B 2 `echo $i | awk -F'origin/' '{print $2}'` |head -n 4; done
ฉันพบวิธีที่ดีที่สุด: ฉันมักจะตรวจสอบสาขาล่าสุดที่สร้างขึ้นด้วยวิธีนี้
git for-each-ref --sort=-committerdate refs/heads/
รวมกับคำตอบจาก Andrew Sohn ( https://stackoverflow.com/a/14265207/1929406 )
branchcreated=$(git reflog show --date=format:'%Y-%m-%d %H:%M:%S' --all | sed 's!^.*refs/!refs/!' | grep '/master' | tail -1| cut -d'{' -f 2| cut -d'}' -f 1 | xargs)
echo $branchcreated
สิ่งนี้ทำเพื่อฉัน: (10 ปีต่อมา)
git log [--remotes] --no-walk --decorate
เนื่องจากไม่มีข้อมูลที่เก็บไว้ในเวลาที่สร้างสาขาสิ่งนี้จะแสดงการกระทำแรกของแต่ละสาขา ( --no-walk
) ซึ่งรวมถึงวันที่กระทำ ใช้--remotes
สำหรับสาขาระยะไกลหรือละเว้นมันสำหรับสาขาท้องถิ่น
เนื่องจากฉันทำอย่างน้อยหนึ่งข้อตกลงในสาขาก่อนที่จะสร้างอีกอันสิ่งนี้อนุญาตให้ฉันย้อนกลับไปสองสามเดือนของการสร้างสาขา (และคุณลักษณะ dev-start) เพื่อวัตถุประสงค์ด้านเอกสาร
แหล่งที่มา: AnoEบน stackexchange
ไวยากรณ์:
git reflog --date=local | grep checkout: | grep ${current_branch} | tail -1
ตัวอย่าง:
git reflog --date=local | grep checkout: | grep dev-2.19.0 | tail -1
ผลลัพธ์:
cc7a3a8ec HEAD@{Wed Apr 29 14:58:50 2020}: checkout: moving from dev-2.18.0 to dev-2.19.0