मैं उन सभी कमिटों के बीच अंतर कैसे प्राप्त कर सकता हूं जो गिट के साथ दो तिथियों के बीच हुई थीं?


116

या दो तारीखों के बीच होने वाले सभी कमिट्स? SVN में, आप कुछ ऐसा कर सकते हैं

svn diff -r{date}:{date}

इसे करने के लिए! मैं इस के बराबर एक गिट खोजने के लिए प्रतीत नहीं कर सकते।

विशेष रूप से मैं उस दिन और उसके द्वारा किए गए सभी कोड के साथ दैनिक ईमेल भेजने के लिए एक स्क्रिप्ट लिख रहा हूं।

जवाबों:


159

आप उपयोग कर सकते हैं git whatchanged --since="1 day ago" -p

यह एक --untilतर्क भी लेता है ।

डॉक्स


धन्यवाद! यह वही था जो मैं चाहता था, यह भी --कैमिटर पैरामीटर लेता है, हालांकि इसके प्रलेखन में सूचीबद्ध नहीं है! यह भी, 'git whatchanged' 'git help' में दिखाई नहीं दिया! पता नहीं क्यों ... फिर से धन्यवाद।
क्रिस

5
आपको इसे अपना चुना हुआ उत्तर बनाना चाहिए ताकि सेठ को कुछ कर्म मिलें।
स्कॉट

18
@brbob मुझे पता है कि यह एक लंबे समय से पहले उत्तर दिया गया था, लेकिन सिर्फ इस पर ठोकर खाने वाले किसी व्यक्ति के लिए (जैसा मैंने किया था) Git मदद कहती है: The command is kept primarily for historical reasons; fingers of many people who learned Git long before git log was invented by reading Linux kernel mailing list are trained to type it. तो, डॉक्स git logइसके बजाय का उपयोग करने के लिए प्रोत्साहित करते हैं git whatchanged; यह अंतिम कमांड git लॉग का -no-मर्ज विकल्प का भी उपयोग करता है, इसलिए वे उसी परिणाम को आउटपुट करते हैं।
Ramses


2
git whatchangedवर्तमान नवीनतम संस्करण 2.21.0 के रूप में निकाला गया है। सभी git whatchangedहासिल किया जा सकता है git logऔर यह केवल ऐतिहासिक कारणों से संरक्षित है। विवरण देखें git-scm.com/docs/git-whatchanged/2.21.0
Devy

60

पिछले सुझावों में कुछ कमियां हैं। मूल रूप से, मैं कुछ के बराबर देख रहा था cvs diff -D"1 day ago" -D"2010-02-29 11:11"। अधिक से अधिक जानकारी एकत्र करते हुए, मुझे एक समाधान मिला।

चीजें जो मैंने कोशिश की हैं:

  • git whatchanged --since="1 day ago" -pसे यहाँ

    लेकिन यह प्रत्येक कमिट के लिए एक भिन्नता देता है, भले ही एक फाइल में कई कमिट हों। मुझे पता है कि "डेट" जीट में एक ढीली अवधारणा है , मैंने सोचा कि ऐसा करने का कोई तरीका होना चाहिए।

  • git diff 'master@{1 day ago}..masterकुछ चेतावनी देता है warning: Log for 'master' only goes back to Tue, 16 Mar 2010 14:17:32 +0100.और सभी भिन्न नहीं दिखाता है।

  • git format-patch --since=yesterday --stdout मेरे लिए कुछ नहीं देता।

  • revs=$(git log --pretty="format:%H" --since="1 day ago");git diff $(echo "$revs"|tail -n1) $(echo "$revs"|head -n1) किसी तरह काम करता है, लेकिन जटिल लगता है और वर्तमान शाखा तक सीमित नहीं है।

आखिरकार:

मजेदार रूप से, git-cvsserver "cvs diff -D" का समर्थन नहीं करता है (इसके बिना यह कहीं पर प्रलेखित है)।


4
+1 git rev-list, जो मेरे द्वारा देखी जा रही समान समस्या को हल करने की दिशा में एक लंबा रास्ता तय किया।
me_and

यह स्वीकृत उत्तर नहीं होना चाहिए, सेठ का अधिक संक्षिप्त और सही है।
ctford

6
@ctford, मेरे विचार में, यह सही नहीं है। यह रिपोर्ट कर सकता है कि एक फ़ाइल के लिए कई भिन्नताएँ होती हैं, न कि फ़ाइल के अनुसार कोई भिन्न फ़ाइल svn / cvs भिन्न होती है।
विडेनरिंड

1
@ वेडनड्रिंड +1, यह बहुत अधिक चतुर है
rostamn739

1
git diff 'master@{1 day ago}..masterवाक्य रचना का अर्थ है "जाँच reflog जहां शाखा बाहर और आंकड़ा masterबात करने के लिए प्रयोग किया जाता है अपने स्थानीय भंडार में 1 day ago "। विशेष रूप से, वर्तमान शाखा के वास्तविक प्रतिबद्ध इतिहास का उपयोग नहीं करेगा master। यह बहुत ही कम चीज है जो आप वास्तव में चाहते हैं।
मिकको रैंटलैनेन

22

"तारीख" गिट में एक ढीली अवधारणा का एक सा है। एक कमिट में एक लेखक की तारीख होगी जो अतीत में कुछ समय अच्छी तरह से हो सकती है, इससे पहले कि कोई वास्तव में अपनी रिपॉजिटरी में कमिट करता है / कमिट करता है, यह भी कि कमिट रिबेड किया जा सकता है और एक स्पष्ट रूप से नए कमिट के शीर्ष पर होने के लिए अद्यतन किया जा सकता है।

एक कमिट में एक कमिट डेट भी होती है जिसे अपडेट किया जाता है अगर किसी कमिट को किसी भी तरह से रिबेड या संशोधित किया जाता है। ये कमिटमेंट कुछ हद तक कालानुक्रमिक क्रम में होने की संभावना है, लेकिन आप अभी भी कमिटर की दया पर उसके कंप्यूटर पर सही समय निर्धारित कर रहे हैं और यहां तक ​​कि एक अनमॉडिटेड कमिटमेंट एक रिमोट रिपॉजिटरी पर फीचर शाखा में अनिश्चित काल के पहले बैठ सकता है। एक केंद्रीय भंडार के मास्टर शाखा में विलय किया जा रहा है।

आपके उद्देश्यों के लिए संभवतः सबसे उपयोगी क्या है प्रश्न में विशेष भंडार पर रिफॉल्ग तिथि। यदि आपके पास प्रति-शाखा रिफॉल्ज़ सक्षम (देखें git config core.logAllRefUpdates) हैं, तो आप यह निर्दिष्ट करने के लिए ref@{date}सिंटैक्स का उपयोग कर सकते हैं कि किसी विशेष समय में शाखा कहाँ थी।

उदाहरण के लिए

git log -p master@{2009-07-01}..master@{now}

आप 'फजी' वर्णनों का भी उपयोग कर सकते हैं जैसे:

git log -p "master@{1 month ago}..master@{yesterday}"

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

ध्यान दें कि प्रति-शाखा परिशोधक एक रिपॉजिटरी के लिए विशिष्ट है, इसलिए यदि आप क्लोन पर लॉग कमांड चला रहे हैं, और आप एक महीने के लिए (कहते हैं) नहीं खींचते हैं तो पिछले महीने के सभी परिवर्तनों को एक बार में खींच लें। फिर पिछले महीने के सभी परिवर्तन एक @{1 hour ago}..@{now}सीमा में दिखाई देंगे । यदि आप 'सेंट्रल' रिपॉजिटरी पर लॉग कमांड को चलाने में सक्षम हैं जिसे लोग पुश करते हैं, तो यह वह कर सकता है जो आप चाहते हैं।


बहुत अच्छा राइटअप और कहा गया सवाल का अच्छा जवाब ... लेकिन मुझे लगता है कि यह brbob का इरादा क्या करने में ज्यादा मदद नहीं करेगा।
जकुब नारबस्की

यह निर्भर करता है, यह मदद कर सकता है यदि वह वास्तव में उस चीज़ को पार्स करना चाहता है जिसे एक निश्चित केंद्रीय भंडार पर एक निश्चित शाखा में धकेल दिया गया था और लॉग आदेश उस भंडार पर चलाया गया था। मुझे लगता है कि एक संपादन क्रम में है ...
सीबी बेली

"प्रतिबद्ध तिथि जो किसी भी तरह से प्रतिबद्ध होने या संशोधित होने पर अद्यतन की जाती है", वास्तव में तारीख कभी नहीं बदली जाती है; पूरे कमिट को दूसरी कमेटी के साथ बदल दिया जाता है (हालाँकि पेड़ को माना जा सकता है)।
hasen

2
@ जसेन: तकनीकी रूप से, आप सही हैं। कमिटमेंट अपरिवर्तनीय हैं। जब आप किसी कमिट को रिबेट या संशोधन करते हैं और एक नई कमिट बनाते हैं, तो मौजूदा कमिट मैसेज, ऑथर डिटेल्स और ऑथर डेट को अक्सर पुराने कमिट से कॉपी कर लिया जाता है, इसलिए ऐसा लगता है कि आप कमिट को नए कमिट आईडी और कमिट डेट के साथ अपडेट कर रहे हैं।
CB बेली

ध्यान दें कि @{time spec}सिंटैक्स हमेशा आपके स्थानीय रिफ्लॉग को संदर्भित करता है । यह वास्तविक प्रतिबद्ध इतिहास (डीएजी) का उल्लेख नहीं करता है। यदि आप अंतर को नहीं समझते हैं, तो इस वाक्यविन्यास का उपयोग न करें!
मिको रानाल्टेन

14
git diff --stat @{2013-11-01}..@{2013-11-30}

या

git diff --stat @{2.weeks.ago}..@{last.week}

क्या यह निर्भरता पर निर्भर करता है? क्योंकि यदि ऐसा होता है, तो आप वास्तव में इसका उपयोग नहीं कर सकते हैं यदि आप जिस रेपो में यह कमांड चला रहे हैं वह कमिटेड हिस्ट्री से नया (यानी ताजे क्लोन) है।

2
हां, यह पूरी तरह से रिफ्लॉग पर निर्भर करता है। और हां, यह केवल स्थानीय कॉपी इतिहास में काम करता है, लेकिन थोड़ा सुविधाजनक कमांड है।
ए.ए.

1
हां, मैं निश्चित रूप से सहमत हूं कि यह सुविधाजनक है, जब तक कि आप इसे समर्थन करने के लिए पुरानी प्रविष्टियों को फिर से भर दें।

धन्यवाद ए.ए. आपके उत्तर का उपयोग करते हुए, मैं करने में सक्षम था: git annotate --stat .. @ {2017-08-8} फ़ाइल नाम | कम; git annotate --stat .. @ {5.days.ago} फ़ाइल नाम; इसलिए मैं संदर्भ में बदलाव देख सकता हूं।
क्रिस

ध्यान दें कि @{time spec}सिंटैक्स हमेशा आपके स्थानीय रिफ्लॉग को संदर्भित करता है । यह वास्तविक प्रतिबद्ध इतिहास (डीएजी) का उल्लेख नहीं करता है। यदि आप अंतर को नहीं समझते हैं, तो इस वाक्यविन्यास का उपयोग न करें!
मिको रानाल्टेन

4

शायद

$ git format-patch --committer=<who> --since=yesterday --stdout

क्या है जो आप चाहते हैं ('या' बिना रुके)?


1
क्विक क्वेश्चन, क्या - क्या कमिट डेट का इस्तेमाल करता है?
सीबी बेली

3

मेरा मानना ​​है कि सामान्य समाधान का उपयोग करना है:

git rev-list -n1 --first-parent --until=<a date string> <a ref>

बिना -फर्स्ट-पैरेंट के, आपको एक शाखा से एक कमिट मिल सकती है जिसे बाद में मर्ज a refकर दिया गया था लेकिन इसमें विलय नहीं किया गया था a date string

यहाँ एक विकल्प का उपयोग कर रहा है --childrenऔर grepइसके बजाय -n1:

mlm_git_ref_as_of() {
    # # Examples #
    #
    # Show all commits between two dates:
    #
    #     git log $(mlm_git_ref_as_of '2012-05-21 09:00:00-0400')..$(mlm_git_ref_as_of '2012-05-21 17:00:00-0400')
    #
    # Show diffs of all commits between two dates:
    #
    #     git diff $(mlm_git_ref_as_of '2012-05-21 09:00:00-0400')..$(mlm_git_ref_as_of '2012-05-21 17:00:00-0400')
    local as_of="$1"
    local ref="${2:-HEAD}"
    # Get the most recent commit (--children, grep -v ' ') that was on
    # the given branch ($ref, --first-parent) as of a given date
    # ($as_of)
    git rev-list --children --first-parent --until="$as_of" "$ref" | grep -v ' '
}

मैं git whatchangedइस प्रश्नोत्तर को पढ़ने से पहले परिचित नहीं था , लेकिन यह मेरे लिए बहुत अलग परिणाम देता है, इसलिए मुझे यकीन नहीं है कि यह क्या कर रहा है।


3

एक और सरल तरीका है कि आप एक निश्चित तिथि के बाद से सभी परिवर्तनों का एक हिस्सा प्राप्त कर सकते हैं, बस Xउस तारीख को या उसके बाद होने वाले पहले कमिट को ढूंढना है , फिर उपयोग करें

git diff X

इसका लाभ यह है कि यह एक ताज़ा क्लोन में रीफ़्लॉग प्रविष्टियों पर निर्भर नहीं करता है, इसके विपरीत

git diff <reference>@{n}..
git log <reference>@{n}..

में समाधान


2

यह एक मज़ेदार जवाब है, क्योंकि वहाँ एक बेहतर तरीका है। यह आज के लिए सभी प्रतिबद्ध हैश दिखाएगा।

git log --pretty="format:%H %ai" | grep `date +"%Y-%m-%d"` | awk {'print $1'}`

; ·)


2

आप पैच (डिफरेंशियल) तैयार करने और ईमेल के माध्यम से भेजने के लिए गिट-फॉर्मेट-पैच का भी उपयोग कर सकते हैं ।

कमिट रेंज निर्दिष्ट करने के लिए [चूंकि] या [संशोधन रेंज] विकल्पों का उपयोग करें।


2

अपनी शाखा पर डेट से डेट तक के बदलावों को देखने के लिए, निम्न सूत्र का उपयोग करें:

  1. अपनी शाखा की जाँच करें।
  2. दूरस्थ रिपॉजिटरी से परिवर्तन खींचना और अपडेट करना
  3. तारीख से तारीख सीमा तक अलग-अलग फाइलें देखें

सूत्र :

git checkout <branch>
git pull
git diff --stat @{fromDate}..@a{toDate}

ध्यान दें कि तारीखें YYYY-MM-DD प्रारूप पर हैं:

git diff --stat @{2019-08-20}..@a{2019-08-21}

यदि आप विशिष्ट समय सीमा में विशिष्ट फ़ाइल पर परिवर्तनों का निरीक्षण करना चाहते हैं (कोड में अलग-अलग देखें), तो वर्तमान फ़ाइल को नेविगेट करें:

उदाहरण :

git diff @{2019-01-01}..@{2019-01-02} ~/dev/myApp/package.json

0

मैं उस तरीके से फेंकूंगा जो मैं करता हूं: git logएक तारीख के लिए आपको वर्तमान शाखा के लिए प्रतिबद्ध हैश देता है। फिर मैं बस कुछ का उपयोग करता हूं, git diff 8fgdfg8..565k4l5जो मुझे फाइलों द्वारा समुचित अंतर देता है। आशा है कि यह मदद करता है, हालांकि बहुत परीक्षण नहीं किया गया है

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