จะทราบได้อย่างไรว่าสาขา Git นั้นถูกสร้างขึ้นเมื่อใด


327

มีวิธีการตรวจสอบเมื่อสาขา Git ถูกสร้างขึ้น? ฉันมีสาขาใน repo ของฉันและฉันจำไม่ได้ว่าการสร้างมันและคิดว่าอาจจะเห็นการประทับเวลาการสร้างจะเขย่าหน่วยความจำของฉัน


3
พบสิ่งนี้ว่าเป็นประโยชน์มากcommandlinefu.com/commands/view/2345/…
Brendon-Van-Heyzen

1
เมื่อคุณถามคำถามนี้เป็นคุณจริงๆสนใจเพียงในการรับวันที่และเวลาของการสร้างของสาขาหรือถูกคุณมีความสนใจในการรู้จักที่ในประวัติศาสตร์กระทำของสาขาที่ถูกสร้างขึ้นครั้งแรกคือที่กระทำสาขาของคุณถูกแยกออกก่อน จาก?

3
@ คัพเค้กคำถามที่ค่อนข้างชัดเจน ฉันสนใจเมื่อฉันสร้างสาขา ที่กล่าวว่ารู้การกระทำจะเป็นข้อมูลที่มีประโยชน์ในกรณีทั่วไป
paxos1977

คำตอบ:


151

ใช้

แสดง git - สรุป 'git ผสานฐาน foo master'

หากคุณต้องการดูในบริบทโดยใช้ gitk ให้ใช้

gitk - ทั้งหมด - เลือกยอมรับ = `git ผสานฐาน foo master`

(โดยที่ foo เป็นชื่อของสาขาที่คุณกำลังมองหา)

ภาพหน้าจอ


24
เพื่อชี้แจงคำตอบมีสองขั้นตอนในกระบวนการ (1) รับ treesh โดยใช้ "git merge-base <branch> master" โดยที่ branch เป็นสาขาที่สนใจ (2) ใช้ treesh เป็นอินพุตในการแสดง git เพื่อรับวันที่: "git show - สรุป <treesh>"
paxos1977

11
ดูเหมือนว่าคำตอบนี้จะยกเว้นสาขาที่ถูกสร้างขึ้นจากต้นแบบ แต่ถ้ามันไม่ใช่อย่างนั้นล่ะ? มีวิธีการค้นหาการกระทำแรกของสาขาที่มีลูกมากกว่า 1 คนหรือไม่?
Manitra Andriamitondra

20
นี่ไม่ใช่วันที่สาขาถูกสร้างขึ้น - นี่คือการกระทำ "การแยกสาขา"
Marco

44
วิธีแก้ปัญหาจะใช้ได้ก็ต่อเมื่อ 'branch' ไม่ถูกรวมกลับไปเป็น 'master' มีวิธีการหาฐานการผสานแรกสุดสำหรับสองสาขาในระดับสากลหรือไม่?
Ilya Ivanov

22
นี่แสดงฐานการผสานไม่ใช่การสร้างสาขา
Hedley

139

ตามที่ระบุไว้ในความคิดเห็นและคำตอบของ 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

3
น่าสนใจมาก. +1 แน่นอนว่าจะเกิดขึ้นภายในไม่gc.reflogexpireกี่วัน
VonC

2
@VonC - ใช่คุณ ค่าเริ่มต้นสำหรับ gc.reflogexpire คือ 90 วัน
แอรอน

1
ที่สุด! คำตอบเดียวที่คอมไพล์เองพูดว่า: "branch: created from HEAD" ดังนั้นสิ่งที่ "สาขา" ของ git ที่เข้าใจยากสามารถติดตามได้จนถึงวันที่และเวลาในการสร้าง ... ขอบคุณรางวัล +1 แต่สิ่งที่เกี่ยวกับ gc.reflogexpire สิ่งนั้นและวิธีการทำเช่นนี้ในสาขาระยะไกล?
Motti Shneor

60

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>"

โปรดทราบว่าการอ้างอิงไม่สามารถทำงานได้อย่างมีประสิทธิภาพในสาขาระยะไกลเฉพาะสาขาที่คุณทำงานในพื้นที่เท่านั้น


อืมฉันไม่แน่ใจว่าคำตอบนี้มีประโยชน์เพียงใดฉันจะต้องศึกษาเพิ่มเติมในภายหลัง สำหรับสิ่งที่คุ้มค่าคุณทำผลงานได้ดีในความพยายามที่จะเขียนบางสิ่งที่ครอบคลุมและไม่ใช่แค่คำตอบสั้น ๆ บางส่วนที่ขี้เกียจดังนั้นมันจึงเป็นสิ่งที่ดีอย่างแน่นอน นอกจากนี้โปรดทราบว่าคุณสามารถใช้ reflog สำหรับสิ่งนี้ได้ตราบใดที่สาขาของคุณไม่เก่ากว่าgc.reflogexpireวันดังที่ระบุไว้ในคำตอบนี้และคำตอบนี้

4
ฉันไม่ต้องการทำซ้ำข้อมูลที่ดีทั้งหมดเกี่ยวกับ reflogs จากคำตอบอื่น ๆ แต่ยินดีที่จะเพิ่ม gc.reflogexpire หากคุณคิดว่ามันมีประโยชน์ คำตอบของฉันมีวัตถุประสงค์เพื่อ (1) ให้ความชัดเจนมากขึ้นในสิ่งที่สาขา git คืออะไรและทำไม "ประวัติศาสตร์" ของมันค่อนข้างคลุมเครือ (2) ใส่คำสั่งที่มีประโยชน์ด้านหน้าและศูนย์รวมทั้ง (3) แสดงความมุ่งมั่นในสาขา (4) grep-ing reflog สำหรับสาขาที่ถูกลบ ข้อเสนอแนะยินดีต้อนรับ
yoyo

ขอบคุณ @Cupcake ตอนแรกฉันก็สนุกดีที่มีวงเล็บมุมอยู่รอบ ๆ 'branch' แต่นั่นก็ทำให้ทั้งคำหลุดออกมาจากคำตอบพรีวิวของฉันดังนั้นฉันจึงสันนิษฐานว่ามันถูกถือว่าผิดพลาดเป็น inline html (ไม่ถูกต้อง)
yoyo

วิธีนี้ใช้ได้ดีผ่าน Intellij และ BitBucketgit reflog --date=local <branch>
isaac weathers

41

ขั้นแรกหากสาขาของคุณถูกสร้างขึ้นภายใน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 กล่าวว่าในการตอบสนองของเขา


3
"git reflog show <branch>" ทำงานได้ดีแสดงให้เห็นอย่างชัดเจนเมื่อสร้างสาขา Treesh ดึงข้อมูลเป็น "แสดง git - สรุป <treesh>"
paxos1977

1
'git log -g <branch>' เป็นสิ่งที่เหมาะกับฉัน - มีรายละเอียดมากมาย จำเป็นต้องอยู่ในสาขาเพื่อใช้สิ่งเหล่านี้
Lidia

18

ฉันยังไม่แน่ใจเกี่ยวกับคำสั่ง git แต่ฉันคิดว่าคุณสามารถค้นหาพวกมันได้ใน reflogs

.git/logs/refs/heads/<yourbranch>

ไฟล์ของฉันดูเหมือนจะมีการประทับเวลา unix ในพวกเขา

อัปเดต:มีตัวเลือกในการใช้ประวัติ reflog แทนประวัติการส่งมอบเมื่อพิมพ์บันทึก:

git log -g

คุณสามารถติดตามบันทึกนี้เช่นกันกลับไปเมื่อคุณสร้างสาขา git logแม้ว่าจะแสดงวันที่กระทำ แต่ไม่ใช่วันที่คุณทำการกระทำที่ทำรายการใน reflog ฉันยังไม่พบยกเว้นโดยดูที่การอ้างอิงจริงในเส้นทางด้านบน


12

ลองสิ่งนี้

  git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)'

3
คุณอาจจะต้อง%มาก่อน(refname)
Vor

1
@ หรือฉันได้ทำการเปลี่ยนแปลง
biniam

ฉันส่งผ่านสิ่งนี้| cut -c 5- | sort -r |และจากนั้นส่งผ่าน grep สำหรับเดือนให้รายการ lin ลำดับย้อนกลับของฉันมากหรือน้อย
Noumenon

2
@Noumenon: สำหรับแต่ละ ref สามารถเรียงลำดับสำหรับคุณโดยเพิ่มเช่น--sort='-committerdate'(หมายเหตุ '-' ก่อน committerdate สำหรับลำดับย้อนกลับ)
Pete

9

ใช้:

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) จากการพัฒนา


2
แต่วันไหนล่ะ และคุณเห็นการเช็คเอาท์ทุกสาขาหลายครั้ง สิ่งนี้หมายความว่าเฉพาะการเกิดครั้งแรกในแต่ละสาขาคือการสร้างของมัน?
Motti Shneor

4

นี่คือสิ่งที่ฉันเกิดขึ้นก่อนที่ฉันจะพบกระทู้นี้

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:'

3

คำสั่งนี้แสดงวันที่สร้างสาขาdevจากmain

$git reflog show --date=iso dev
$7a2b33d dev@{2012-11-23 13:20:28 -2100}: branch: Created from main

"วันที่สร้างสาขา" ... ถ้าน้อยกว่า 90 วัน ถ้ามันถูกสร้างขึ้นมากกว่า 90 วันข้อมูลนั้นจะถูกกำจัด ดังกล่าวข้างต้นในstackoverflow.com/a/3748722/6309
VonC

@Sazzad Hissain Khan อันนี้เหมาะสำหรับเราเพราะเราต้องการให้ 'เคล็ดลับการโกงแผ่นที่เป็นมิตร' ให้กับชาวบ้านที่ไม่ใช่ช่างเทคนิคที่ได้หลงทางเล็กน้อยกับความซับซ้อนของ Git
Chris22

2

หากคุณต้องการทราบรายละเอียดของสาขาทั้งหมด

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

2

ฉันพบวิธีที่ดีที่สุด: ฉันมักจะตรวจสอบสาขาล่าสุดที่สร้างขึ้นด้วยวิธีนี้

git for-each-ref --sort=-committerdate refs/heads/


1

สิ่งนี้ทำเพื่อฉัน: (10 ปีต่อมา)

git log [--remotes] --no-walk --decorate

เนื่องจากไม่มีข้อมูลที่เก็บไว้ในเวลาที่สร้างสาขาสิ่งนี้จะแสดงการกระทำแรกของแต่ละสาขา ( --no-walk) ซึ่งรวมถึงวันที่กระทำ ใช้--remotesสำหรับสาขาระยะไกลหรือละเว้นมันสำหรับสาขาท้องถิ่น

เนื่องจากฉันทำอย่างน้อยหนึ่งข้อตกลงในสาขาก่อนที่จะสร้างอีกอันสิ่งนี้อนุญาตให้ฉันย้อนกลับไปสองสามเดือนของการสร้างสาขา (และคุณลักษณะ dev-start) เพื่อวัตถุประสงค์ด้านเอกสาร

แหล่งที่มา: AnoEบน stackexchange


0

ไวยากรณ์: 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

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