গিটের সাথে দুটি তারিখের মধ্যে ঘটে যাওয়া সমস্ত কমিটের মধ্যে আমি কীভাবে পার্থক্য পেতে পারি?


116

বা কেবল দুটি তারিখের মধ্যে ঘটে যাওয়া সমস্ত কমিট? এসভিএন-তে আপনি এমন কিছু করতে পারেন

svn diff -r{date}:{date}

এটা করতে! আমি এর সমান একটি গিট খুঁজে পাচ্ছি না।

বিশেষত আমি সেই দিনের প্রতিশ্রুতিবদ্ধ সমস্ত কোড এবং কারা দ্বারা প্রতিদিনের ইমেলগুলি প্রেরণের জন্য একটি স্ক্রিপ্ট লেখার দিকে তাকিয়ে আছি।

উত্তর:


159

আপনি ব্যবহার করতে পারেন git whatchanged --since="1 day ago" -p

এটিও লাগে --until যুক্তি ।

ডক্স


ধন্যবাদ! আমি যা চেয়েছিলাম এটি ঠিক ছিল, এটি - কমপিটার প্যারামিটারও নেয়, যদিও এটি তার ডকুমেন্টেশনে তালিকাভুক্ত নয়! এছাড়াও, 'গিট হোয়াট চেঞ্জড' 'গিট হেল্প' তে উপস্থিত হয়নি! কেন জানি না ... আবার ধন্যবাদ।
ক্রিস

5
আপনার এটিকে আপনার নির্বাচিত উত্তর করা উচিত যাতে শেঠ কিছু কর্মফল পান।
স্কট

18
@ ব্রবব আমি জানি যে এটির উত্তর অনেক আগেই দেওয়া হয়েছিল, তবে কেবল যে কেউ এ বিষয়ে হোঁচট খায় (যেমন আমি করেছি) গিট সহায়তা বলেছেন: 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; এই শেষ কমান্ডটি গিট লগের - না-মার্জ বিকল্পটি ব্যবহার করে, সুতরাং তারা একই ফলাফল আউটপুট দেয়।
রামসেস

2
গিট হোয়াটজেড হ'ল গিট লগের ডক
ভিনসেন্ট

2
git whatchangedবর্তমান সর্বশেষতম সংস্করণ 2.21.0 হিসাবে অবহিত করা হয়েছে। সমস্ত git whatchangedঅর্জন অর্জন করা যায় git logএবং এটি কেবল historicalতিহাসিক কারণে সংরক্ষণ করা হয়। Git-scm.com/docs/git- কিচেন পরিবর্তন
২.২১.০

60

আগের পরামর্শগুলিতে কিছু ত্রুটি রয়েছে। মূলত, আমি এর সমতুল্য কিছু খুঁজছিলাম cvs diff -D"1 day ago" -D"2010-02-29 11:11"। আরও এবং বেশি তথ্য সংগ্রহ করার সময়, আমি একটি সমাধান খুঁজে পেয়েছি।

আমি যে জিনিসগুলি চেষ্টা করেছি:

  • git whatchanged --since="1 day ago" -pথেকে এখানে

    তবে এটি প্রতিটি প্রতিশ্রুতির জন্য আলাদা দেয়, এমনকি যদি একটি ফাইলে একাধিক কমিট থাকে। আমি জানি যে "তারিখ" গিটের মধ্যে কিছুটা looseিলে conceptালা ধারণা , আমি ভেবেছিলাম এটি করার কিছু উপায় থাকতে হবে।

  • 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) একরকম কাজ করে তবে জটিল মনে হয় এবং বর্তমান শাখায় সীমাবদ্ধ করে না।

অবশেষে:

মজাদারভাবে, গিট-সিভিসারবার "সিভিএস ডিফারফ-ডি" সমর্থন করে না (এটি ছাড়া এটি কোথাও নথিভুক্ত করা হয়)।


4
+1 এর জন্য git rev-list, যা আমি দেখতে পাচ্ছিলাম একইরকম সমস্যা সমাধানের দিকে অনেক এগিয়ে গেছে।
আমি_আর

এটি গ্রহণযোগ্য উত্তর হওয়া উচিত নয়, শেথ আরও সংক্ষিপ্ত এবং সঠিক।
সিটিফোর্ড 30'14

6
@ ক্যাকফোর্ড আমার দৃষ্টিতে এটি সঠিক নয়। এটি এক ফাইলের জন্য একাধিক পৃথকীকরণের প্রতিবেদন করতে পারে, এসএনএন / সিভিএস পৃথক হিসাবে প্রতি ফাইলের জন্য আলাদা হয় না।
ওয়েডেনরিন্দে

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}ব্যাপ্তিতে উপস্থিত হবে । লোকেরা যে 'কেন্দ্রীয়' পুনরায় পোস্টারে লগ কমান্ড চালাতে সক্ষম হয় তা যদি আপনি চান তবে তা করতে পারে।


খুব ভাল লিখনআপ এবং বর্ণিত প্রশ্নের উত্তরের উত্তর ... তবে আমার মনে হয় ব্রবব যা করতে চেয়েছিল তা করার ক্ষেত্রে এটি তেমন কিছু করতে পারে না।
জাকুব নরবস্কি

এটি নির্ভর করে, যদি তিনি একটি নির্দিষ্ট কেন্দ্রীয় ভান্ডারে নির্দিষ্ট শাখায় যে ধাক্কা দেওয়া হয়েছিল তা পার্স করতে চান এবং লপ কমান্ডটি সেই সংগ্রহস্থলটিতে চালিত হয় তবে এটি নির্ভর করে। আমি মনে করি যে একটি সম্পাদনা ক্রমে রয়েছে ...
সিবি বেলি

"প্রতিশ্রুতি পুনর্নির্মাণ বা কোনওভাবে সংশোধন করা হলে আপডেট হওয়া আপডেটের তারিখ", আসলে তারিখটি কখনই পরিবর্তন হয় না; সম্পূর্ণ প্রতিশ্রুতি অন্য প্রতিশ্রুতি দ্বারা প্রতিস্থাপিত হয় (যদিও গাছটি সম্ভবত একই হতে পারে)।
হেসেন

2
@ হাসেন জে: প্রযুক্তিগতভাবে, আপনি সঠিক বলেছেন। কমিটস অপরিবর্তনীয়। আপনি যখন কোনও কমিটকে রিবেস বা সংশোধন করেন এবং একটি নতুন কমিট তৈরি করেন, তখন বিদ্যমান কমিট ম্যাসেজ, লেখকের বিবরণ এবং লেখকের তারিখটি প্রায়শই পুরানো কমিট থেকে অনুলিপি করা হয় যাতে আপনি নতুন কমিট আইডি এবং প্রতিশ্রুতি তারিখের সাথে কমিটকে আপডেট করছেন like
সিবি বেইলি

নোট করুন যে @{time spec}সিনট্যাক্স সর্বদা আপনার স্থানীয় রিফ্লগকে নির্দেশ করে । এটি প্রকৃত প্রতিশ্রুতিবদ্ধ ইতিহাস (ডিএজি) বোঝায় না। আপনি যদি পার্থক্যটিকে আন্ডারটাইড না করেন তবে এই সিনট্যাক্সটি ব্যবহার করবেন না!
মিক্কো রেন্টালাইনেন

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

অথবা

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

এটি কি রিফ্লগের উপর নির্ভর করে? কারণ যদি এটি হয় তবে আপনি বাস্তবে এটি ব্যবহার করতে পারবেন না যদি আপনি এই কমান্ডটি চালাচ্ছেন এমন রেপো এতে থাকা কমিটের ইতিহাসের চেয়ে নতুন (অর্থাত্ সতেজ ক্লোনযুক্ত) হয়ে থাকে।

2
হ্যাঁ, এটি সম্পূর্ণরূপে রিফলগের উপর নির্ভর করে। এবং হ্যাঁ, এটি কেবল স্থানীয় অনুলিপি ইতিহাসে কাজ করে তবে এটি একটি সুবিধাজনক আদেশ।
এএ।

1
হ্যাঁ, আমি অবশ্যই স্বীকার করছি যে এটি সুবিধাজনক, যতক্ষণ না আপনি এটিকে সমর্থন করার জন্য পর্যাপ্ত পুরানো রিফ্লগ রয়েছে।

ধন্যবাদ এএ। আপনার উত্তরটি ব্যবহার করে, আমি করতে পেরেছি: গিট এনোটেট - স্ট্যাট .. @ {2017-08-8} ফাইলের নাম | কম; গিট এনোটেট - স্ট্যাট .. @ {5.days.ago} ফাইলের নাম; সুতরাং আমি প্রসঙ্গে পরিবর্তনগুলি দেখতে পাচ্ছি।
ক্রিস

নোট করুন যে @{time spec}সিনট্যাক্স সর্বদা আপনার স্থানীয় রিফ্লগকে নির্দেশ করে । এটি প্রকৃত প্রতিশ্রুতিবদ্ধ ইতিহাস (ডিএজি) বোঝায় না। আপনি যদি পার্থক্যটিকে আন্ডারটাইড না করেন তবে এই সিনট্যাক্সটি ব্যবহার করবেন না!
মিক্কো রেন্টালাইনেন


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যা আমাকে ফাইলগুলি দ্বারা একত্রিত করে উপযুক্ত পার্থক্য দেয়। আশা করি এটি অনেকটা পরীক্ষিত হলেও সহায়তা করে much

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.