আমি কীভাবে সর্বাধিক সাম্প্রতিক গিট প্রতিবেদনটি আবিষ্কার করব যা কোনও ফাইলকে সংশোধন করেছে?


180

আমি সর্বাধিক সাম্প্রতিক প্রতিশ্রুতি সন্ধান করতে চাই যা কোনও উত্স ফাইলকে পরিবর্তিত করেছে।

আমি git blameপ্রতিটি লাইনের মাধ্যমে কমিটের জন্য সমস্ত তারিখ দেখতে ব্যবহার করতে পারি , তবে ফাইলটি স্পর্শ করার জন্য কোনটি প্রতিশ্রুতিবদ্ধ ছিল তা হ'ল দেখা ঠিক difficult

আমার গিট সংগ্রহস্থলটিতে প্রদত্ত ফাইলটিকে ছুঁয়ে যাওয়া শেষ প্রতিশ্রুতিটি কীভাবে খুঁজে পাব?

উত্তর:


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 কেবলমাত্র সাম্প্রতিক সময়ে,
  • শাখা (অথবা আইডি কমিট) থেকে, ফিরে খুঁজছেন শুরু করার জন্য মস্তক যদি আপনি এটি ইতিমধ্যে, অথবা --all যদি আপনি সেই সমস্ত পরিচিত করে চান, এবং
  • আপনার ফাইলের আপেক্ষিক পথ।

এটি কেবলমাত্র সেই শাখার সর্বাধিক সাম্প্রতিক কমিট আইডিটি সেই ফাইলটি পরিবর্তনের জন্য ফিরিয়ে দেয়, প্রাক্তন: 215095e2e338525be0baeeebdf66bfbb304e7270

আরও জটিল উদাহরণের জন্য, আপনি ট্যাগের নাম এবং দূরবর্তী রেফারেন্সগুলিও ব্যবহার করতে পারেন এবং ওয়াইল্ডকার্ড সহ প্রাসঙ্গিক পথের নাম অন্তর্ভুক্ত করতে পারেন:

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

... যা আপনাকে জানাবে যে সেই শাখার ইতিহাসের ওয়াইল্ডকার্ড ম্যাচে সবচেয়ে সাম্প্রতিক পরিবর্তনটি কী ছিল। পুনঃ-তালিকার বিকল্পগুলি চূড়ান্ত, এটি অন্যতম গুরুত্বপূর্ণ নদীর গভীরতানির্ণয় আদেশ, যাতে আপনি কল্পনা করতে পারেন এমন কোনও মানদণ্ডকে অন্তর্ভুক্ত করে বা বাদ দিতে পারেন।

অবশ্যই, গিট-রেভ-তালিকা (1) ম্যানুয়াল পৃষ্ঠাটি দেখুন


কেন আপনি ব্যবহার git-logনিকৃষ্ট হয় তা সত্যিই ব্যাখ্যা করেন নি ।
পাইওটর ডব্রোগোস্ট

7
আমি নিকৃষ্ট বলব না, কেবল এটি ডিফল্টরূপে বহিরাগত তথ্য সরবরাহ করে। গিট-রেভ-তালিকা কেবল কমিট আইডিটি দেয়, আপনি যা চান তা যদি আপনি কোনও স্ক্রিপ্ট বা অন্য অটোমেশন প্রক্রিয়াতে প্রতিক্রিয়াটি ফিড করতে চান। গিট-লগ নির্বাচিত কমিট সম্পর্কে তথ্য দেয়, প্রথমে কমিট আইডি সংগ্রহ করার জন্য গিট-রেভ-তালিকা ব্যবহার করে, এবং প্রতিটি প্রতিশ্রুতি সম্পর্কিত তথ্য সংগ্রহ করে। আপনি যদি কেবল প্রতিশ্রুতিবদ্ধ তথ্য ফিল্টার করতে এবং আইডিগুলি ব্যবহার করতে চলেছেন তবে আপনি প্রথমে গিট-রেভ-তালিকাটি ব্যবহার করতে পারেন। যেহেতু লগটি রেভ-তালিকার ভিত্তিতে, তাই এটি একই ফিল্টার পরামিতিগুলির বেশিরভাগ অংশ নেয়।
মাইকেল এরিকসন

3
git-logচীনামাটির বাসন, git-rev-listনদীর গভীরতানির্ণয় হয়।
blitzen9872

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একরকম দুঃস্বপ্নের মতো দেখে মনে হচ্ছে আনডেড এসভিএন
থারস্ম্মোনার

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
এটি ওপি যা চেয়েছিল তার চেয়ে কিছুটা বেশি, তবে এফওয়াইআই আপনি এটিকে ওয়ান লাইনারে সংযুক্ত করতে পারেন:git show $(git log -1 --pretty="%H" -- FILENAME)
টোবিয়াস কেইনজলার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.