मैं सबसे हाल ही में किए गए git को कैसे खोज सकता हूं जिसने एक फ़ाइल को संशोधित किया है?


180

मैं सबसे हालिया कमिटमेंट खोजना चाहता हूं जिसने एक सोर्स फाइल को संशोधित किया हो।

मैं git blameप्रत्येक पंक्ति द्वारा आने के लिए सभी तिथियों को देखने के लिए उपयोग कर सकता हूं , लेकिन यह देखना मुश्किल है कि फ़ाइल को छूने के लिए कौन सा प्रतिबद्ध अंतिम था।

मैं अपने जीआई रिपॉजिटरी में दी गई फ़ाइल को छूने वाली अंतिम प्रतिबद्धता कैसे पा सकता हूं?

जवाबों:


230

git log विशिष्ट फ़ाइलों (और निर्देशिकाओं) के इतिहास को देखने का समर्थन करता है, इसलिए आप इसे इस तरह से कॉल कर सकते हैं:

git log my/file.c

यदि आप वास्तव में केवल एक सबसे हालिया प्रतिबद्ध को सूचीबद्ध करना चाहते हैं, उदाहरण के लिए इसे स्क्रिप्ट में उपयोग करने के लिए, -n 1विकल्प का उपयोग करें :

git log -n 1 --pretty=format:%H -- my/file.c

--pretty=format:%hgit logकेवल हैश दिखाने के लिए कहता है। --Separater व्याख्या हो रही है के रूप में एक नाम के लिए प्रतिबद्ध से फ़ाइल नाम बंद हो जाता है, बस के मामले में यह अस्पष्ट है।


12
यदि आप जानना चाहते हैं कि पिछली बार किसी भी शाखा में कोई फ़ाइल संशोधित नहीं की गई थी, तो आप --allविकल्प जोड़कर सभी शाखाओं पर विचार कर सकते हैं ।
केसी

44

यदि आप अभी हाल की सबसे कमिटमेंट ढूंढना चाहते हैं, तो आप नहीं चाहते हैं git-log, आप चाहते हैं git-rev-list, जो उन कमिट पथों को सूचीबद्ध करता है, जो उस कमिट पथ में, सबसे हाल के एक (कालानुक्रमिक) से शुरू होते हैं। सीधे शब्दों में कहें:

git rev-list -1 <commit> <filename>

के लिए git-rev-listअपने मामले में, आप की आपूर्ति सिर्फ:

  • प्रतिबद्ध की संख्या शामिल करने के लिए, या -1 केवल सबसे हाल के लिए,
  • शाखा (या आईडी) से वापस देखना शुरू करने के लिए, HEAD यदि आप पहले से ही उस पर हैं, या - यदि आप सभी ज्ञात आवागमन चाहते हैं, और
  • आपकी फ़ाइल के सापेक्ष पथ।

यह वर्तमान शाखा में सबसे हालिया कमिट आईडी को उस फ़ाइल को बदलने के लिए लौटाता है, उदा: 215095e2e338525be0baeeebdf66bfbb304e7270

अधिक जटिल उदाहरण के लिए, आप टैग नामों और यहां तक ​​कि दूरस्थ संदर्भों का उपयोग कर सकते हैं, और वाइल्डकार्ड्स के साथ संबंधित पथ नाम शामिल कर सकते हैं, उदाहरण के लिए:

git rev-list origin/user/bob/testbranch -1 src/bfiles/*.txt

... जो आपको बताएगा कि उस शाखा के इतिहास में वाइल्डकार्ड मैच के लिए सबसे हालिया परिवर्तन क्या था। रि-लिस्ट के विकल्प चरम हैं, यह सबसे महत्वपूर्ण प्लंबिंग कमांड में से एक है, इसलिए आप केवल उन मानदंडों के बारे में शामिल कर सकते हैं या बाहर कर सकते हैं जिनकी आप कल्पना कर सकते हैं।

बेशक, git-Rev-list (1) मैनुअल पेज देखें


आपने वास्तव में यह नहीं बताया कि क्यों का उपयोग git-logकरना हीन है।
पियोट्र डोब्रोगोस्ट

7
मैं हीन नहीं कहूंगा, बस यह डिफ़ॉल्ट रूप से बाहरी जानकारी प्रदान करता है। git-Rev-list सिर्फ कमिटेड ID लौटाती है, जो कि आप चाहते हैं कि अगर आप किसी स्क्रिप्ट या अन्य ऑटोमेशन प्रक्रिया में प्रतिक्रिया फीड करने जा रहे हैं। git-log रिटर्न चयनित कमिट्स के बारे में जानकारी देता है, पहले कमिट आईडी इकट्ठा करने के लिए git-rev-list का उपयोग करके, फिर प्रत्येक कमिट पर जानकारी एकत्रित करता है। यदि आप केवल प्रतिबद्ध जानकारी को फ़िल्टर करने और आईडी का उपयोग करने जा रहे हैं, तो आप पहली जगह में git-rev-list का उपयोग कर सकते हैं। चूंकि लॉग रि-लिस्ट पर आधारित है, इसलिए यह अधिकांश समान फ़िल्टर पैरामीटर लेता है।
माइकल एरिकसन

3
git-logचीनी मिट्टी के बरतन है, git-rev-listनलसाजी है।
ब्लिटजेन 9872

27

यदि आप फ़ाइलों के एक विशेष सेट को संशोधित करने के लिए नवीनतम कमिट का हैश प्राप्त करना चाहते हैं (और बचना चाहते हैं awk) तो आप इसका उपयोग कर सकते हैं:

git log -n 1 --pretty=format:%h -- <path>

यह बाद में उपयोग करने के लिए प्रतिबद्ध हैश प्राप्त करने के लिए उपयोगी हो सकता है git describe

उदाहरण के लिए (मामले में यह किसी के लिए उपयोगी है) ...

मैं किसी भी स्रोत फ़ाइल को बदलने के लिए नवीनतम प्रतिबद्ध पर विचार करके एक वर्तमान संस्करण आईडी बनाता हूं (जैसे आप टैग के साथ संस्करण चिह्नित करते हैं mycode-1.2.1):

COMMIT=$(git log -n 1 --pretty=format:%h -- *.c *.h)
if VN=$(git describe --always --abbrev=5 --match "mycode-*" $COMMIT 2>/dev/null) &&
case "$VN" in
mycode-*)
    git update-index -q --refresh
    test -z "$(git diff-index --name-only HEAD *.c *.h)" ||
    VN="$VN-mod" ;;
*) VN="mycode-unknown-g$VN" ;;
esac
then
    continue
else
VN="mycode-unknown"
fi

यह आईडी का निर्माण करता है जैसे:

  • mycode-1.2.1 - जब स्रोत फ़ाइलों की वर्तमान स्थिति टैग किए गए संस्करण से मेल खाती है
  • mycode-1.2.1-g3k7s2 - जब स्रोत फ़ाइलों की वर्तमान स्थिति टैग किए गए संस्करण का पालन करने के लिए मेल खाती है
  • mycode-1.2.1-g3k7s2-mod - जब स्रोत फ़ाइलों की वर्तमान स्थिति को टैग किए गए संस्करण के बाद अंतिम प्रतिबद्ध के बाद संशोधित किया गया है
  • mycode-unknown - जब वहाँ अभी तक एक संस्करण टैग नहीं बनाया गया है

5
$VNकुछ बुरा सपना की तरह दिखता है SVN
ThorSummoner

10

मुझे यकीन नहीं है कि यह वही है जो आप चाहते हैं, लेकिन यदि आप git log <thefile>उस फ़ाइल को बदलने के लिए कमिट करते हैं। आप सबसे ऊपर उठा सकते हैं। यह वह होना चाहिए जिसकी आप तलाश कर रहे हैं।


4
यदि आप संसाधनों का उपयोग करते हैं git log -n1 -- <thefile>(या head -1यदि आप संसाधनों को बर्बाद करना चाहते हैं तो पाइप का उपयोग करते हैं) तो आपको मैन्युअल रूप से शीर्ष पंक्ति लेने की जरूरत नहीं है (जो लिस का जवाब देखें )
तोबियस किंज़लर

4
अच्छी बात। मुझे लगता है कि आप सीधे भी इसे छोड़ सकते हैं -nऔर उपयोग कर सकते -1हैं।
नौफल इब्राहिम

3

केवल एक लाइन पर रेफरी पाने के लिए, कोशिश करें:

git log -n1 --oneline <path> | awk '{print $1;}'

2

एक बार जब आपके पास उस कमेटी की SHA आईडी होती है जिसका आप उपयोग करना चाहते हैं git log FILENAME, तो आपको यह देखने में सक्षम होना चाहिए git show SHA_ID_HEREकि आपने उस विशेष कमिट के लिए क्या किया है। आपको पूरी आईडी दर्ज करने की भी आवश्यकता नहीं है; पहले 6 अक्षर पर्याप्त होने चाहिए।


4
ओपी द्वारा पूछे जाने की तुलना में थोड़ा अधिक है, लेकिन FYI करें आप इसे एक-लाइनर में जोड़ सकते हैं:git show $(git log -1 --pretty="%H" -- FILENAME)
टोबियास किंजलर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.