जब एक गिट शाखा बनाई गई थी तो यह कैसे निर्धारित किया जाए?


327

क्या यह निर्धारित करने का कोई तरीका है कि एक गिट शाखा कब बनाई गई थी? मेरे रेपो में एक शाखा है और मुझे यह बनाने की याद नहीं है और शायद यह सोचकर कि सृजन टाइमस्टैम्प को देखकर मेरी याददाश्त जाग जाएगी।


3
यह बहुत ही उपयोगी कमांडलाइनफू
/ कॉमैंड्स/view/2345/…

1
जब आपने यह प्रश्न पूछा, तो क्या आप वास्तव में शाखा के निर्माण की तारीख और समय प्राप्त करने में रुचि रखते थे, या क्या आप यह जानने में भी रुचि रखते थे कि आपके प्रतिबद्ध इतिहास में शाखा को पहली बार कहां बनाया गया था, यानी आपकी शाखा को पहली बार बंद किया गया था से?

3
@ चुप रहो, सवाल बहुत स्पष्ट है। जब मैंने शाखा बनाई तो मेरी दिलचस्पी थी। कहा कि कमेटी को जानना सामान्य मामले में आसान जानकारी होगी।
paxos1977

जवाबों:


151

उपयोग

git show --summary `git मर्ज-बेस फू मास्टर`

यदि आप इसे गिट के उपयोग के संदर्भ में देखेंगे, तो उपयोग करें

gitk --all --select-प्रतिबद्ध = `git मर्ज-बेस फू मास्टर '

(जहां फू उस शाखा का नाम है जिसे आप ढूंढ रहे हैं।)

Screenshot


24
उत्तर को स्पष्ट करने के लिए, प्रक्रिया के दो चरण हैं। (1) "git मर्ज-बेस <ब्रांच> मास्टर" का उपयोग करके ट्रेश प्राप्त करें जहां शाखा ब्याज की शाखा है। (2) तिथि प्राप्त करने के लिए git शो में इनपुट के रूप में treesh का उपयोग करें: "git show --summary <treesh>"
paxos1977

11
यह उत्तर इस बात को छोड़कर लगता है कि शाखा का निर्माण गुरु से हुआ है। लेकिन अगर यह मामला नहीं है तो क्या होगा? 1 से अधिक बच्चे होने वाली शाखा की पहली प्रतिबद्धताओं को खोजने का एक तरीका है?
मैनिट्रा ऐंड्रीमिटंड्रा

20
यह वह तारीख नहीं है जिस पर शाखा बनाई गई थी - यह "शाखा" है।
मार्को

44
समाधान तभी काम करेगा जब 'शाखा' को 'मास्टर' में वापस विलय नहीं किया गया था। क्या सार्वभौमिक रूप से दो शाखाओं के लिए बहुत पहले मर्ज का आधार खोजने का एक तरीका है?
इल्या इवानोव

22
यह मर्ज बेस दिखा रहा है, ब्रांच क्रिएशन नहीं।
हेडली

139

जैसा कि टिप्पणियों में और जैकब के उत्तर में बताया गया है , जब तक कि आपकी शाखा विन्यास सेटिंग में निर्धारित दिनों की संख्या से कम है gc.reflogexpire(डिफ़ॉल्ट 90 दिन है), तब आप यह पता लगाने के लिए अपने खंडन का उपयोग कर सकते हैं कि शाखा संदर्भ कब था पहली बार बनाया गया।

ध्यान दें कि git reflogअधिकांश git logझंडे ले सकते हैं । आगे ध्यान दें कि HEAD@{0}स्टाइल चयनकर्ता प्रभावी रूप से समय की धारणा हैं और वास्तव में, तारीख के तार के रूप में (हैक किए गए तरीके से) संभाला जाता है। इसका मतलब है कि आप ध्वज का उपयोग कर सकते हैं --date=localऔर इस तरह से आउटपुट प्राप्त कर सकते हैं :

$ गिट रिफ्लड - स्थानीय =
763008c HEAD @ {शुक्र अगस्त 20 10:09:18 2010}: पुल: फास्ट-फॉरवर्ड
f6cec0a HEAD @ {Tue Aug 10 09:37:55 2010}: पुल: फास्ट-फॉरवर्ड
e9e70bc HEAD @ {थू फ़रवरी 4 02:51:10 2010}: पुल: फास्ट फॉरवर्ड
836f48c HEAD @ {थू जन 21 14:08:14 2010}: चेकआउट: मास्टर से मास्टर तक बढ़ रहा है
836f48c HEAD @ {थू जन 21 14:08:10 2010}: पुल: फास्ट फॉरवर्ड
24bc734 HEAD @ {बुध जनवरी 20 12:05:45 2010}: चेकआउट: 74fca6a42863ffacaf7ba6f1936a9f228950f657 से आगे बढ़ रहा है 
74fca6a HEAD @ {बुध जनवरी 20 11:55:43 2010}: चेकआउट: मास्टर से v2.6.31 पर जा रहा है
24bc734 HEAD @ {बुध जनवरी 20 11:44:42 2010}: पुल: फास्ट फॉरवर्ड
964fe08 HEAD @ {Mon Oct 26 15:29:29 2009}: चेकआउट: 4a6908a3a0aa50cac9c3a2f36b276b46c0629ad91 से आगे बढ़ रहा है 
4a6908a HEAD @ {मोन ऑक्ट 26 14:52:12 2009}: चेकआउट: मास्टर से v2.6.28 पर जा रहा है

यह भी उपयोग करने के लिए कई बार उपयोगी हो सकता है --date=relative:

$ गिट रिफ्लड --डेट = रिश्तेदार
763008c HEAD @ {4 सप्ताह पहले}: पुल: फास्ट-फ़ॉरवर्ड
f6cec0a HEAD @ {6 सप्ताह पहले}: पुल: फास्ट-फ़ॉरवर्ड
e9e70bc HEAD @ {8 महीने पहले}: पुल: फास्ट फॉरवर्ड
836f48c HEAD @ {8 महीने पहले}: चेकआउट: मास्टर से मास्टर की ओर बढ़ रहा है
836f48c HEAD @ {8 महीने पहले}: पुल: फास्ट फॉरवर्ड
24bc734 HEAD @ {8 महीने पहले}: चेकआउट: 74fca6a42863ffacaf7ba6f1936a9f228950f657 से मास्टर में जाना
74fca6a HEAD @ {8 महीने पहले}: चेकआउट: मास्टर से v2.6.31 पर जाना
24bc734 HEAD @ {8 महीने पहले}: पुल: फास्ट फॉरवर्ड
964fe08 HEAD @ {11 महीने पहले}: चेकआउट: 4a6908a3a0aa50cac9c3a2f36b276b46c0629ad91 से मास्टर में जाना
4a6908a HEAD @ {11 महीने पहले}: चेकआउट: मास्टर से v2.6.28 पर जा रहा है

एक अंतिम नोट: --allझंडा (जो वास्तव में गिट-लॉग फ्लैग है जिसे गिट-रिफ्लॉग द्वारा समझा जाता है) सभी ज्ञात रेफ के लिए रिफ्लेक्स दिखाएगा refs/(बस के बजाय HEAD) , जो आपको शाखा घटनाओं को स्पष्ट रूप से दिखाएगा:

git reflog --date = स्थानीय --all
860e4e4 refs / heads / master @ {Sun Sep 19 23:00:30 2010}: प्रतिबद्ध: दूसरा।
17695bc refs / heads / example_branch @ {Mon Sep 20 00:31:06 2010}: शाखा: से बनाया गया

3
बहुत ही रोचक। +1। बशर्ते, यह gc.reflogexpireदिनों के भीतर हो ।
वॉन सीपीसी

2
@VonC - सही है आप। Gc.reflogexpire का डिफ़ॉल्ट मान 90 दिन है।
एरॉन

1
आखिरकार! एकमात्र उत्तर जिसमें git स्वयं कहता है: "शाखा: HEAD से निर्मित"। तो उस मायावी "ब्रांच" की बात git को इसके निर्माण की तारीख और समय के लिए नीचे ट्रैक किया जा सकता है ... धन्यवाद, +1 पुरस्कार। लेकिन उस gc.reflogexpire चीज़ के बारे में क्या है, और दूरस्थ शाखाओं पर ऐसा कैसे करें?
मोति श्नोर 15

60

प्रो गिट G 3.1 गिट ब्रांचिंग - एक शाखा क्या है एक गिट शाखा वास्तव में क्या है की एक अच्छी व्याख्या है

Git में एक शाखा बस एक लाइटवेट मूवेबल पॉइंटर [a] कमिट है।

चूंकि एक शाखा सिर्फ एक हल्का संकेतक है, इसलिए git के पास इसके इतिहास या निर्माण तिथि की कोई स्पष्ट धारणा नहीं है। "लेकिन रुको," मैंने सुना है आप कहते हैं, "निश्चित रूप से गिट मेरी शाखा इतिहास जानता है!" अच्छी तरह की।

यदि आप निम्नलिखित में से किसी एक को चलाते हैं:

git log <branch> --not master
gitk <branch> --not master

आप देखेंगे कि "आपकी शाखा का इतिहास" कैसा दिखता है, लेकिन वास्तव में 'शाखा' से आने वाले कमिट की एक सूची है जो मास्टर से उपलब्ध नहीं हैं। यह आपको वह जानकारी प्रदान करता है जो आप चाहते हैं, लेकिन अगर और केवल अगर आपने 'शाखा' को वापस मास्टर में विलय नहीं किया है, और आपने इसे बनाने के बाद कभी भी मास्टर को 'शाखा' में विलय नहीं किया है। यदि आप विलय कर चुके हैं , तो मतभेदों का यह इतिहास ढह जाएगा।

सौभाग्य से रिफ्लग में अक्सर वह जानकारी होती है जो आप चाहते हैं, जैसा कि यहां विभिन्न अन्य उत्तरों में बताया गया है। इसे इस्तेमाल करो:

git reflog --date=local <branch>

शाखा का इतिहास दिखाने के लिए। इस सूची में अंतिम प्रविष्टि (शायद) वह बिंदु है जिस पर आपने शाखा बनाई थी।

यदि शाखा को हटा दिया गया है, तो 'शाखा' अब एक वैध पहचानकर्ता नहीं है, लेकिन आप इसके बजाय इसका उपयोग कर सकते हैं, जो आपको वह मिल सकता है जो आप चाहते हैं:

git reflog --date=local | grep <branch>

या Windows cmd शेल में:

git reflog --date=local | find "<branch>"

ध्यान दें कि रीफ़्लॉग दूरस्थ शाखाओं पर प्रभावी रूप से काम नहीं करेगा, केवल वही जो आपने स्थानीय स्तर पर काम किया है।


हम्म, मुझे यकीन नहीं है कि यह उत्तर अभी तक कितना उपयोगी है, मुझे इसे और बाद में अध्ययन करने की आवश्यकता होगी। हालांकि इसकी कीमत क्या है, हालांकि, आपने निश्चित रूप से कुछ व्यापक लिखने के प्रयास में एक अच्छा काम किया है , और केवल एक छोटा, आलसी आंशिक उत्तर नहीं है, इसलिए यह निश्चित रूप से अच्छा है। इसके अलावा, यह ध्यान रखना महत्वपूर्ण है कि आप इसके लिए केवल तब तक ही उपयोग कर सकते हैं जब तक कि आपकी शाखा gc.reflogexpireदिनों से पुरानी न हो , जैसा कि इस उत्तर और इस उत्तर में बताया गया है ।

4
मैं अन्य उत्तरों के रिफॉल्स के बारे में सभी अच्छी जानकारी की नकल नहीं करना चाहता था, लेकिन अगर आपको लगता है कि यह उपयोगी है तो gc.reflogexpire को जोड़ने में खुशी होगी। मेरा जवाब था (1) एक स्पष्ट शाखा प्रदान करने पर अधिक स्पष्टता प्रदान करता है और इसका "इतिहास" कुछ अस्पष्ट क्यों है, (2) उपयोगी आदेशों को सामने और केंद्र में रखा जाता है, जिसमें (3) एक शाखा पर कमिट दिखा रहा है और मास्टर नहीं है (4) हटाए गए शाखा के लिए रिफ्लग को grep-ing करें। प्रतिक्रिया का स्वागत करते हैं।
योयो

धन्यवाद @Cupcake मजेदार रूप से पर्याप्त रूप से मेरे पास मूल रूप से 'शाखा' के चारों ओर कोण कोष्ठक थे, लेकिन यह मेरे उत्तर पूर्वावलोकन से पूरे शब्द को अलग कर रहा था, इसलिए मैंने माना कि इसे गलती से (अमान्य) इनलाइन एचटीएमएल के रूप में माना गया था।
yoyo

इस विधि ने इंटेलीज और बिटबकेट के माध्यम से अच्छी तरह से काम कियाgit reflog --date=local <branch>
इस्हाक वेटर्स

41

सबसे पहले, अगर आप शाखा gc.reflogexpireदिनों के भीतर बनाई गई थी (डिफ़ॉल्ट 90 दिन, यानी लगभग 3 महीने), तो आप उपयोग कर सकते हैं git log -g <branch>या git reflog show <branch>पहली प्रविष्टि को रिफ्लॉग में ढूंढ सकते हैं , जो कि सृजन की घटना होगी, और नीचे (जैसे git log -g) कुछ दिखता है :

Reflog: <branch>@{<nn>} (C R Eator <creator@example.com>)
Reflog message: branch: Created from <some other branch>

आपको लगता है कि किसने एक शाखा बनाई, कितने ऑपरेशन पहले, और किस शाखा से (ठीक है, यह सिर्फ "हेड से बनाया गया" हो सकता है, जो बहुत मदद नहीं करता है)।

यही बात माइकसैप ने अपने जवाब में कही


दूसरा, यदि आपके पास इससे अधिक समय के लिए शाखा है gc.reflogexpireऔर आपने चलाया है git gc(या यह स्वचालित रूप से चलाया गया था), तो आपको उस शाखा से सामान्य पूर्वज को ढूंढना होगा, जिस शाखा से इसे बनाया गया था। कॉन्फ़िगर फ़ाइल पर एक नज़र डालें, शायद branch.<branchname>.mergeप्रविष्टि है, जो आपको बताएगी कि यह किस शाखा पर आधारित है।

यदि आप जानते हैं कि विचाराधीन शाखा को मास्टर शाखा (मास्टर शाखा से forking) से बनाया गया था, उदाहरण के लिए, आप सामान्य पूर्वज को देखने के लिए निम्न आदेश का उपयोग कर सकते हैं:

git show $(git merge-base <branch> master)

आप git show-branch <branch> masterविकल्प के रूप में भी कोशिश कर सकते हैं ।

यह वही है जो gbacon ने अपनी प्रतिक्रिया में कहा था


3
"गिट रिफ्लॉग शो <शाखा>" अच्छी तरह से काम करता है, बहुत स्पष्ट रूप से दिखाता है कि शाखा कब बनाई गई थी। ट्रेश ने "git show --summary <treesh>" में फ़ीड किया
paxos1977

1
'गिट लॉग-जी <शाखा>' वह था जिसने मेरे लिए काम किया था - बहुत सारे विवरण। इनमें से किसी का उपयोग करने के लिए शाखा पर होने की आवश्यकता है।
लिडिया

18

मैं अभी तक इसके लिए git कमांड के बारे में निश्चित नहीं हूं, लेकिन मुझे लगता है कि आप उन्हें रिफ्लॉग्स में पा सकते हैं।

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

मेरी फाइलें उनमें एक यूनिक्स टाइमस्टैम्प है।

अद्यतन: लॉग प्रिंट करते समय कमिट इतिहास के बजाय रिफ्लॉग इतिहास का उपयोग करने का विकल्प प्रतीत होता है:

git log -g

इस लॉग को आप तब भी फॉलो कर सकते हैं, जब आपने ब्रांच बनाया था। git logहालाँकि, जब आप कार्रवाई करते हैं, तो उस तारीख का दिनांक दिखा रहा है, जब आपने रिफ्लॉग में प्रविष्टि की थी। मुझे वह अभी तक नहीं मिला है, सिवाय ऊपर के रास्ते में वास्तविक रिफ्लॉग को देखकर।


12

इसे इस्तेमाल करे

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

3
आपको शायद %पहले की आवश्यकता होगी(refname)
Vor

1
@ मेरे लिए मैंने बदलाव किया
बीएनएम

मैंने इस | cut -c 5- | sort -r |महीने के लिए grep के माध्यम से पाइप किया और फिर मुझे एक सूची लिन रिवर्स कालानुक्रमिक आदेश दिया, अधिक या कम।
नौमेनन

2
@ नोमैनन: फॉर-प्रत्येक-रेफ आपके लिए क्रमित कर सकता है, उदाहरण के लिए --sort='-committerdate'(उल्टे कालानुक्रमिक क्रम के लिए कमिटेटर से पहले '-' पर ध्यान दें)।
पीट

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

याने कि:

  • शाखा विकास मास्टर से (चेकआउट-बी) बनाया जाता है

  • शाखा सुविधा- jira35 विकास से (चेकआउट-बी) बनाया गया है

  • शाखा सुविधा-जीरा-सुत -46 विकास से (चेकआउट-बी) बनाई गई है


2
लेकिन तारीखें कहाँ हैं? और आप कई बार हर शाखा को चेक-आउट करते हुए देखते हैं। क्या इसका मतलब यह है कि केवल प्रत्येक शाखा में होने वाली एफआईआरएस ही इसकी रचना है?
मत्ती श्नोर

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 में
वॉन मार्क

@ सज्जाद हिसैन खान इसने हमारे लिए काम किया क्योंकि हम कुछ गैर-तकनीकी लोगों को 'फ्रेंडली चीट-शीट टिप्स' प्रदान करना चाहते थे, जो कि कुछ पेचीदगियों के कारण थोड़े से खो गए थे।
14:22 पर क्रिस

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

एंड्रयू सोहन ( 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

1

यह मेरे लिए यह किया है: (10 साल बाद)

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

चूंकि शाखा निर्माण समय पर कोई संग्रहीत जानकारी नहीं होती है, इसलिए यह ऐसा होता है जो प्रत्येक शाखा के पहले कमिट को प्रदर्शित करता है ( --no-walk), जिसमें कमिट की तारीख भी शामिल होती है। उपयोग--remotesदूरस्थ शाखाओं के लिए , या स्थानीय शाखाओं के लिए इसे छोड़ दें।

चूँकि मैं किसी अन्य को बनाने से पहले एक शाखा में कम से कम एक प्रतिबद्ध करता हूं, इसने मुझे दस्तावेज़ीकरण के उद्देश्यों के लिए कुछ महीनों की शाखा रचनाओं (और देव-आरंभ) की अनुमति दी।

source: स्टैकएक्सचेंज पर AnoE


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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.