গিট দোষ - পূর্বের কমিট?


390

প্রদত্ত লাইনের প্রতিশ্রুতি দেওয়ার ইতিহাসের মতো প্রতিবেদনের আগে কে নির্দিষ্ট রেখাটি সম্পাদনা করেছে তা কি দেখা সম্ভব git blame?

উদাহরণস্বরূপ, আমি নিম্নলিখিতগুলি পরিচালনা করি (দুর্দান্ত uncrustifyপ্রকল্পে):

$ git blame -L10,+1 src/options.cpp
^fe25b6d (Ben Gardner 2009-10-17 13:13:55 -0500 10) #include "prototypes.h"

প্রতিশ্রুতি দেওয়ার আগে কে এই লাইনটি সম্পাদনা করেছিল তা আমি কীভাবে জানতে পারি fe25b6d? এবং এটি সম্পাদনার আগে কে এই প্রতিশ্রুতি?


7
আপনি যদি পূর্ববর্তী কমিটগুলি সন্ধান করছেন তার কারণ হ'ল হোয়াইটস্পেস পরিবর্তনগুলি -wবিকল্পটি ব্যবহার করে । রয়েছে -Mসরানো / কপি কোডের জন্য
brita_

প্রদত্ত শব্দের সাথে জড়িত সমস্ত
কমিটগুলি সন্ধানের জন্য,


3
অ্যারনহফম্যান পোস্ট করার সময় গিথুব দেখতে কেমন ছিলেন তা নিশ্চিত নন, তবে গিথুবটিতে এখন পূর্ববর্তী সংস্করণগুলির জন্য দোষারোপ করা - এবং দোষ দেওয়া সহজ
ruffin

উত্তর:


389
git blame -L 10,+1 fe25b6d^ -- src/options.cpp

গিট দোষের জন্য পুনর্নির্মাণটি সংশোধন করতে পারবেন (ডিফল্টের পরিবর্তে HEAD) থেকে ফিরে তাকানোর জন্য ; fe25b6d^অভিভাবক নেই fe25b6d


106
বিভিন্ন হ্যাশ দিয়ে কয়েকবার কমান্ডটি পুনরায় প্রবেশ না করেই কি আপনি একটি সম্পূর্ণ ইতিহাস পেতে পারেন?
অ্যান্ডার্স জোমমারিন

13
আমি বিশ্বাস করি না যে গিটের প্রতিটি লাইন নম্বর স্পর্শকারী প্রতিটি দোষ পাওয়ার একটি অন্তর্নির্মিত উপায় রয়েছে (যা ধরণের ধরণের অর্থ বোধ করে, যেহেতু সন্নিবেশ এবং মুছে ফেলার কারণে প্রদত্ত লাইনের কোনও ফাইলের ইতিহাস জুড়ে একটি সামঞ্জস্যপূর্ণ লাইন নম্বর নাও থাকতে পারে) লাইন)।
অ্যাম্বার

17
অ্যাম্বার: খুব নিশ্চিত যে আপনি ঠিক বলেছেন যে বৈশিষ্ট্যটির অস্তিত্ব নেই, তবে এটি মনে হয় কিছু সাধারণভাবে কী করবে তা নির্দোষভাবে প্রয়োগ করা যেতে পারে: একবার দোষারোপ করুন, রিপোর্ট করা তথ্যটি ধরুন, দোষ দিন , ইত্যাদি।
ক্যাস্যাবেল

15
সংস্করণগুলি ক্লিকযোগ্যযোগ্য হিসাবে গিট গুই কোনও লাইনের ইতিহাস পরীক্ষা করা বেশ সহজ করে তোলে।
জিট্রাক্স

5
@ শাদিয়াবি --সাধারণত কমান্ড লাইনের যুক্তিতে বিভাজক হিসাবে ব্যবহৃত হয় - গিটের ক্ষেত্রে এটি সাধারণত ফাইলের নামের তালিকা থেকে কমিট হ্যাশ জাতীয় জিনিস আলাদা করতে ব্যবহৃত হয়।
আম্বর

191

আপনি বিভিন্ন গতির লাইন বিবর্তন দেখতে গিট লগ-এল ব্যবহার করতে পারেন ।

উদাহরণ স্বরূপ :

git log -L 15,23:filename.txt

এর অর্থ "filename.txt নামের ফাইলটিতে 15 থেকে 23 লাইনের বিবর্তনের সন্ধান করুন"।


12
এটি একটি দৃ answer় উত্তর এবং সময়ের সাথে সাথে নির্দিষ্ট লাইনে পরিবর্তনগুলি কীভাবে দেখবেন সে বিষয়ে উপরের অ্যান্ডার্স জোমারমিনের প্রশ্নের সমাধান করে।
bigtex777

4
এফওয়াইআই: গিট লগ -ল <স্টার্ট>, <end>: <ফাইল> গিটের প্রয়োজন 1.8.4+ দেখুন: git-scm.com/docs/git-log#git-log--lttstartgtltendgtltfilegt বাক্য বাক্য বিকল্পের জন্য
নিয়ন

30

আম্বরের উত্তরটি সঠিক তবে আমি এটি অস্পষ্ট দেখতে পেয়েছি; বাক্য গঠনটি হ'ল:

git blame {commit_id} -- {path/to/file}

দ্রষ্টব্য: --গাছ-ইশ sha1 সম্পর্কিত ফাইল পাথ থেকে পৃথক করতে ব্যবহৃত হয়। 1

উদাহরণ স্বরূপ:

git blame master -- index.html

সব কিছু জানার জন্য অ্যাম্বারকে সম্পূর্ণ ক্রেডিট ! :)


1
আমি আপনার অনুভূতির সাথে একমত মন্তব্য সিস্টেমটি তবে সমস্ত তথ্য পরিষ্কারভাবে উপস্থাপন করতে খুব সীমাবদ্ধ। আমি একটি মন্তব্যে এই উত্তরের সামগ্রী যুক্ত করেছি; তবে, আমি এই উত্তরটি অ্যাক্সেসের স্বাচ্ছন্দ্যের জন্য ছেড়ে দেওয়ার জোর দিয়েছি।
থারস্মমনার

1
এটি হয় আলাদা পোস্ট বা একটি সম্পাদনা হওয়া উচিত। আমি এটি একটি পৃথক উত্তর হিসাবে পছন্দ।
ফ্লিম 15

27

আপনি চেক আউট করতে পারেন:

git gui blame <filename>

"গিট দোষ" এর মতো পরিবর্তনের একটি দুর্দান্ত গ্রাফিকাল ডিসপ্লে দেয় তবে পূর্বের কমিটগুলিতে যাওয়ার জন্য প্রতি লাইন ক্লিকযোগ্য লিঙ্কগুলির সাথে। কমিটের বিবরণ সহ একটি পপআপ পেতে লিঙ্কগুলির উপরে ঘুরে দেখুন। আমার ক্রেডিট নয় ... এটি এখানে খুঁজে পেয়েছে:

http://zsoltfabok.com/blog/2012/02/git-blame-line-history/

git guiগিটের জন্য একটি গ্রাফিকাল টিসিএল / টিসি ইন্টারফেস। অন্য কোনও প্যারাম ছাড়াই এটি ফাইল, কৃপণতা বা একক লাইন এবং অন্যান্য অনুরূপ কমান্ডের সংশোধন, ফেরত দেওয়া, ধাক্কা দেওয়ার জন্য একটি দুর্দান্ত সহজ তবে দরকারী গ্রাফিকাল অ্যাপ্লিকেশন শুরু করে ... এটি গিট স্টক স্যুটটির অংশ। উইন্ডোজ এ এটি ইনস্টলার অন্তর্ভুক্ত করা হয়। ডিবিয়ানে - আমি অন্যান্য * নিক্স সিস্টেম সম্পর্কে জানি না - এটি আলাদাভাবে ইনস্টল করতে হবে:

apt-get install git-gui

ডক্স থেকে:

https://git-scm.com/docs/git-gui

বর্ণনা

গিটের কাছে একটি টিসিএল / টাকা ভিত্তিক গ্রাফিকাল ইউজার ইন্টারফেস। গিট গি ব্যবহারকারীদের নতুন কমিট করে, বিদ্যমান সংশোধন করে, শাখা তৈরি করে, স্থানীয় সংশ্লেষ সম্পাদন করে, এবং রিমোট রিপোজিটারিগুলিতে আনার / ঠেলাঠেলি করে তাদের সংগ্রহস্থলগুলিতে পরিবর্তন করার অনুমতি দেওয়ার উপর দৃষ্টি নিবদ্ধ করে।

গিটকের বিপরীতে, গিট গুই কমিট জেনারেশন এবং একক ফাইল টীকাতে মনোনিবেশ করে এবং প্রকল্পের ইতিহাস দেখায় না। তবে এটি গিট গিইয়ের মধ্য থেকে গিটক সেশন শুরু করতে মেনু ক্রিয়াকলাপ সরবরাহ করে।

গিট গুই সমস্ত জনপ্রিয় ইউএনআইএক্স সিস্টেম, ম্যাক ওএস এক্স, এবং উইন্ডোজ (সাইগউইন এবং এমএসওয়াইএস উভয়ের অধীনে) কাজ করার জন্য পরিচিত। যতটা সম্ভব ওএস নির্দিষ্ট ব্যবহারকারী ইন্টারফেসের নির্দেশিকা অনুসরণ করা হয়, গিট গি ব্যবহারকারীর জন্য মোটামুটি নেটিভ ইন্টারফেস তৈরি করে।

কমান্ড

দোষ

প্রদত্ত সংস্করণে নির্দিষ্ট ফাইলটিতে দোষী দর্শকের সূচনা করুন (বা যদি বর্ণিত ডিরেক্টরিটি নির্দিষ্ট না করা থাকে)।

ব্রাউজার

নির্দিষ্ট প্রতিশ্রুতিতে সমস্ত ফাইল দেখাচ্ছে একটি ট্রি ব্রাউজার শুরু করুন। ব্রাউজারের মাধ্যমে নির্বাচিত ফাইলগুলি দোষ দর্শকের জন্য খোলা হয়।

citool

গিট গুই শুরু করুন এবং শেল থেকে বেরিয়ে আসার আগে ঠিক একটি কমিট করার ব্যবস্থা করুন। ইন্টারফেসটি কেবল ক্রিয়া সম্পাদনের মধ্যেই সীমিত, অ্যাপ্লিকেশনটির প্রারম্ভকালীন সময়টি কিছুটা কমিয়ে মেনুবারটি সরল করে।

সংস্করণ

গিট গুইয়ের বর্তমানে চলমান সংস্করণ প্রদর্শন করুন।


এটি আমার পক্ষে কাজ করে না। আমি প্রদত্ত লাইনের পরিবর্তনের উপর ক্লিক করতে পারি, তবে এটি সেই প্রতিশ্রুতিবদ্ধ হওয়ার জন্য দৃষ্টিভঙ্গিটি পরিবর্তিত করে এবং বর্তমান লাইনটি এখন দেখায় this: তবে আমি কীভাবে রেখার পূর্ববর্তী সংস্করণটি দেখতে পাব এবং কখন এটি যুক্ত হয়েছিল?
BeeOnRope

এই একটাই ব্যবহারের ক্ষেত্রে আমি জানি যেখানে গিট গুই সবচেয়ে ভাল সমাধান
ক্যামবুনকটিয়াস

17

পূর্ববর্তী উত্তরের উপর ভিত্তি করে, এই ব্যাশ ওয়ান-লাইনার আপনাকে যা খুঁজছে তা দেওয়া উচিত। এটি সর্বশেষ 5 টি সংশোধনীর মাধ্যমে একটি নির্দিষ্ট ফাইলের একটি নির্দিষ্ট রেখার জন্য গিট দোষের ইতিহাস প্রদর্শন করে:

LINE=10 FILE=src/options.cpp REVS=5; for commit in $(git rev-list -n $REVS HEAD $FILE); do git blame -n -L$LINE,+1 $commit -- $FILE; done

এই কমান্ডের আউটপুটে আপনি লাইন পরিবর্তনের বিষয়বস্তু দেখতে পাবেন, বা নির্দিষ্ট রেটিংয়ের জন্য প্রদর্শিত লাইন নম্বর এমনকি পরিবর্তিত হতে পারে।

এটি প্রায়শই নির্দেশ করে যে লাইনটি প্রথমবারের জন্য নির্দিষ্ট কমিটের পরে যুক্ত করা হয়েছিল was এটি ফাইলের অন্য অংশ থেকে লাইন সরানো হয়েছে তাও নির্দেশ করতে পারে।


5
দ্রষ্টব্য যে এটি সর্বশেষ $ REVS সংশোধনগুলি যেখানে $ লাইন পরিবর্তিত সর্বশেষ $ REVS সংশোধনগুলির চেয়ে ILE ফাইলটি পরিবর্তিত হয়েছিল।
সর্বাধিক ন্যানসি

আপনি কোন উত্তরটি উল্লেখ করছেন?
ফ্লিম 15

আমার আর মনে নেই। সম্ভবত আমি আমার উত্তর আরও ভাল প্রমাণ করতে পারে।
উইল শেপার্ড


11

এই সমস্যার একটি খুব অনন্য সমাধান গিট লগ ব্যবহার করা হচ্ছে:

গিট লগ-পি-এম --ফলো - স্ট্যাট - পাথ / টু / আপনার / ফাইল

যেমনটি আন্দ্রে এখানে ব্যাখ্যা করেছেন


1
আমি এটি ব্যবহারের জন্য একটি নাম তৈরি করেছি: git config --global alias.changes 'log -p -M --follow --stat --'এবং তারপরে আমি কেবল টাইপ করতে পারিgit changes path/to/your/file
Tizio Fittizio

এটি এখন পর্যন্ত সেরা উত্তর এবং ঠিক আমি যা খুঁজছিলাম। সহজ এবং মার্জিত।
maesk

10

আপনি যদি জেটব্রেইন আইডিয়া আইডিই ব্যবহার করছেন (এবং ডেরিভেটিভস) আপনি কয়েকটি লাইন নির্বাচন করতে পারেন, প্রসঙ্গ মেনুর জন্য ডান ক্লিক করুন, তারপরে গিট -> নির্বাচনের জন্য ইতিহাস দেখান। নির্বাচিত লাইনগুলিকে প্রভাবিত করছে এমন কমিটগুলির তালিকা আপনি দেখতে পাবেন:

এখানে চিত্র বর্ণনা লিখুন


এটি আমার জন্য অন্যান্য উত্তরগুলির চেয়ে ভাল কাজ করেছে (ইন্টেলিজি ব্যবহার করে)। সমস্ত সংশোধনগুলি লোড করতে কিছুটা সময় নিয়েছে তবে অপেক্ষাটি মূল্যবান।
স্টিভ চেম্বারস

1

উইল শেপার্ডের উত্তরের উপর ভিত্তি করে, তার আউটপুটটিতে এমন কোনও কমিটের জন্য সদৃশ লাইন অন্তর্ভুক্ত থাকবে যেখানে কোনও পরিবর্তন হয়নি, আপনি নিম্নলিখিতগুলি ফিল্টার করতে পারেন (এই উত্তরটি ব্যবহার করে )

LINE=1 FILE=a; for commit in $(git rev-list HEAD $FILE); do git blame -n -L$LINE,+1 $commit -- $FILE; done | sed '$!N; /^\(.*\)\n\1$/!P; D'

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


1

ডেভিডএন এর উত্তরে বিল্ডিং এবং আমি নাম পরিবর্তিত ফাইলটি অনুসরণ করতে চাই:

LINE=8 FILE=Info.plist; for commit in $(git log --format='%h%%' --name-only --follow -- $FILE | xargs echo | perl -pe 's/\%\s/,/g'); do hash=$(echo $commit | cut -f1 -d ','); fileMayRenamed=$(echo $commit | cut -f2 -d ','); git blame -n -L$LINE,+1 $hash -- $fileMayRenamed; done | sed '$!N; /^\(.*\)\n\1$/!P; D'

রেফ: গিট লগে ফাইলের পুনরায় নামকরণের ইতিহাসটি সুন্দরভাবে প্রদর্শন করুন


1

গিট ২.২৩ হিসাবে আপনি ব্যবহার করতে পারেন গিট দোষ --ignore-rev

প্রশ্নে দেওয়া উদাহরণের জন্য এটি হ'ল:

git blame -L10,+1 src/options.cpp --ignore-rev fe25b6d

(তবে এটি একটি কৌশল প্রশ্ন কারণ ফাই 25 বি 6 ডি ফাইলটির প্রথম সংশোধন!)


0

আমি দোষের ইতিহাসটি দেখার জন্য এই ছোট্ট বাশ স্ক্রিপ্টটি ব্যবহার করি।

প্রথম প্যারামিটার: দেখার জন্য ফাইল

পরবর্তী প্যারামিটারগুলি: গিট দোষে উত্তীর্ণ হয়েছে

#!/bin/bash
f=$1
shift
{ git log --pretty=format:%H -- "$f"; echo; } | {
  while read hash; do
    echo "--- $hash"
    git blame $@ $hash -- "$f" | sed 's/^/  /'
  done
}

আপনি -L 70, + 10 এর মতো দোষ-প্যারামিটার সরবরাহ করতে পারেন তবে গিট দোষের পুনরায়-অনুসন্ধান ব্যবহার করা ভাল কারণ লাইন সংখ্যাগুলি সময়ের সাথে সাথে সাধারণত "পরিবর্তন" করে।


0

নির্মাণ stangls এর উত্তর , আমি আমার পথ (Windows এ এমনকি) Git-BH হিসাবে এই স্ক্রিপ্টের করা:

এটি আমাকে এমন সমস্ত প্রতিশ্রুতি সন্ধান করতে দেয় যেখানে কোনও শব্দ জড়িত ছিল:

git bh path/to/myfile myWord

লিপি:

#!/bin/bash
f=$1
shift
csha=""
{ git log --pretty=format:%H -- "$f"; echo; } | {
  while read hash; do
    res=$(git blame -L"/$1/",+1 $hash -- "$f" 2>/dev/null | sed 's/^/  /')
    sha=${res%% (*}
    if [[ "${res}" != "" && "${csha}" != "${sha}" ]]; then
      echo "--- ${hash}"
      echo "${res}"
      csha="${sha}"
    fi
  done
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.