যখন আমি একটি git diff
বা একটি করি git log -p
, আমি কীভাবে উত্স ফাইলের লাইন নম্বরগুলি আউটপুটের সাথে মিলিত করব?
আমি এটি সন্ধান করার চেষ্টা করেছি man git-diff | grep "line numbers"
এবং গুগল করার চেষ্টা করেছি তবে দ্রুত কিছুই পেলাম না।
যখন আমি একটি git diff
বা একটি করি git log -p
, আমি কীভাবে উত্স ফাইলের লাইন নম্বরগুলি আউটপুটের সাথে মিলিত করব?
আমি এটি সন্ধান করার চেষ্টা করেছি man git-diff | grep "line numbers"
এবং গুগল করার চেষ্টা করেছি তবে দ্রুত কিছুই পেলাম না।
উত্তর:
git diff
পাশে লাইন নম্বরগুলি উল্লম্বভাবে প্রদর্শন করার জন্য বর্তমানে কোনও বিকল্প নেই git diff
।
এই তথ্যগুলি (গ) হঙ্ক শিরোনামগুলিতে পৃথক প্রতিটি পরিবর্তনের জন্য পাওয়া যায় যদিও এটি কেবল ইউনিফাইড-ডিফর্ম্যাট বিন্যাসে রয়েছে :
@@ -start,count +start,count @@
ফাইলটির মূল অবস্থাটি এর সাথে উপস্থাপিত হয় -
এবং নতুন রাষ্ট্রের সাথে এটি উপস্থাপিত হয় +
(এর অর্থ হুন শিরোনামে সংযোজন এবং মুছে ফেলার অর্থ নয় start
the ফাইলটির প্রতিটি সংস্করণের প্রারম্ভিক লাইন নম্বর উপস্থাপন করে এবং count
কতগুলি লাইন অন্তর্ভুক্ত রয়েছে তা উপস্থাপন করে , সূচনা পয়েন্ট থেকে শুরু।
diff --git a/osx/.gitconfig b/osx/.gitconfig
index 4fd8f04..fcd220c 100644
--- a/osx/.gitconfig
+++ b/osx/.gitconfig
@@ -11,7 +11,7 @@ <== HERE!
[color "branch"]
upstream = cyan
[color "diff"]
- meta = yellow
+ meta = cyan
plain = white dim
old = red bold
new = green bold
হুঙ্ক শিরোনাম
@@ -11,7 +11,7 @@
বলেছেন যে ফাইলটির পূর্ববর্তী সংস্করণটি 11 লাইন থেকে শুরু হবে এবং এতে 7 টি লাইন রয়েছে:
11 [color "branch"]
12 upstream = cyan
13 [color "diff"]
14 - meta = yellow
14 + meta = cyan
15 plain = white dim
16 old = red bold
17 new = green bold
যখন ফাইলটির পরবর্তী সংস্করণটি 11 লাইনেও শুরু হয় এবং এর মধ্যে 7 টি লাইনও রয়েছে।
আপনি সম্ভবত বলতে পারেন যে, ইউনিফাইড-ডিফ ফরমেট লাইন সংখ্যাগুলি নির্ধারণ করা সহজ করে না (কমপক্ষে আপনি যদি মেশিন না হন)। আপনি যদি পড়তে পারেন এমন লাইন নম্বরগুলি যদি আপনি চান তবে আপনার একটি পৃথক সরঞ্জাম ব্যবহার করতে হবে যা সেগুলি আপনার জন্য প্রদর্শিত হবে।
--unified=0
বা -U0
, যদিও তা কার্যকর হয়।
git diffn
, একটি ড্রপ-ইন রিপ্লেসমেন্ট (মোড়ক) git diff
যার জন্য লাইন নম্বরগুলি দেখায় এবং এর সমস্ত ব্যবহার এবং বিকল্পের সাথে সম্পূর্ণ সামঞ্জস্য রয়েছে git diff
: স্ট্যাকওভারফ্লো
অ্যান্ডি টকোভস্কির কোডটি প্রসারিত করে এখানে আরও দুটি সমাধান।
সাধারণ পাঠ্য:
git diff | gawk 'match($0,"^@@ -([0-9]+),[0-9]+ [+]([0-9]+),[0-9]+ @@",a){left=a[1];right=a[2];next};\
/^(---|\+\+\+|[^-+ ])/{print;next};\
{line=substr($0,2)};\
/^-/{print "-" left++ ":" line;next};\
/^[+]/{print "+" right++ ":" line;next};\
{print "(" left++ "," right++ "):"line}'
রঙিন পাঠ্য, ধরেই \033[66m
নেওয়া রঙ কোডগুলির ফর্ম্যাট:
git diff --color=always | \
gawk '{bare=$0;gsub("\033[[][0-9]*m","",bare)};\
match(bare,"^@@ -([0-9]+),[0-9]+ [+]([0-9]+),[0-9]+ @@",a){left=a[1];right=a[2];next};\
bare ~ /^(---|\+\+\+|[^-+ ])/{print;next};\
{line=gensub("^(\033[[][0-9]*m)?(.)","\\2\\1",1,$0)};\
bare~/^-/{print "-"left++ ":" line;next};\
bare~/^[+]/{print "+"right++ ":" line;next};\
{print "("left++","right++"):"line;next}'
কোডটি যথাক্রমে এবং এর সাথে শুরু হওয়া লাইন -
এবং কিছু +
না দিয়ে শুরু হওয়া লাইনগুলি পরিবর্তন করে । নম্বরগুলি সংশ্লিষ্ট ফাইলের লাইন নম্বর।-1:-
+1:+
(5,6):
git diff
সাবধানে প্রান্তিককরণ বজায় রাখে। এই কোডটি এই মুহুর্তে আমার মাথার উপরে রয়েছে, তাই আপনি কি এটি সংশোধন করতে রাজি হন? অন্য কথায়, যখন একটি লাইন বলে +240:+
এবং পরের লাইনটি বলে (241,257):
, আপনার কোডটি নিম্ন রেখা থেকে কোডের সাথে সঠিক প্রান্তিককরণ এবং প্রবর্তন বজায় রাখতে শীর্ষ লাইনে কিছু অতিরিক্ত স্পেস যুক্ত করতে হবে। সম্ভবত এটি সহজে মুদ্রণ দিয়ে করা যেতে পারে?
printf
।
git diffn
। এখানে দেখুন: stackoverflow.com/a/61997003/4561887 । আপনার উত্তরের জন্য ধন্যবাদ @ পিডফুড আমি এটি অধ্যয়ন করেছি এবং এটি শিখতে ব্যবহার করেছি, তারপর স্ক্র্যাচ থেকে শুরু করে লিখেছি git diffn
। একবার ফর্ম্যাট করা হয়েছিল যাতে আমি আপনার কোডটি পড়তে পারি (ধন্যবাদ @ এডমার্টন), আমি এটি থেকে কিছু দুর্দান্ত জিনিস শিখতে সক্ষম হয়েছি যা আমাকে সহায়তা করেছিল।
এখানে এমন একটি স্ক্রিপ্ট রয়েছে যা এটি ঠিক করার চেষ্টা করে - রাগে এটি পরীক্ষা করা হয়নি তবে এটি ঠিক আছে বলে মনে হচ্ছে। এটি গিট ডিফ উত্পাদন করে রেকর্ডগুলির উপর নির্ভর করে এবং লাইন গণনা বজায় রাখার জন্য awk ব্যবহার করে।
# Massage the @@ counts so they are usable
function prep1() {
cat | awk -F',' 'BEGIN { convert = 0; }
/^@@ / { convert=1; }
/^/ { if ( convert == 1 ) { print $1,$2,$3;
} else { print $0;
}
convert=0;
}'
}
# Extract all new changes added with the line count
function prep2() {
cat | awk 'BEGIN { display=0; line=0; left=0; out=1;}
/^@@ / { out=0; inc=0; line=$4; line--; display=line; left=line; }
/^[-]/ { left++; display=left; inc=0; }
/^[+]/ { line++; display=line; inc=0; }
/^[-+][-+][-+] / { out=0; inc=0; }
/^/ {
line += inc;
left += inc;
display += inc;
if ( out == 1 ) {
print display,$0;
} else {
print $0;
}
out = 1;
inc = 1;
display = line;
}'
}
git diff $1 | prep1 | prep2
একটি দ্রুত উপায় ব্যবহার করা হয় git diff -U0
। এটি প্রসঙ্গের রেখাগুলি 0 তে নির্ধারণ করবে যা @@ মানগুলি প্রকৃত পরিবর্তিত লাইনের সাথে মেলে তুলবে। ডিফল্টরূপে, @@ মানগুলিতে প্রসঙ্গের আগে / পরে 3 টি লাইন অন্তর্ভুক্ত থাকে যা মানুষের পক্ষে সুবিধাজনক নয়।
উদাহরণ:
git diff # default
@@ -10,8 +10,8 @@
পরিবর্তিত রেখার লাইন সংখ্যা গণনা করা শক্ত কারণ কারণ লাইন 10 পূর্বের প্রসঙ্গে প্রথম লাইনের উল্লেখ করে। প্রথম পরিবর্তিত লাইনের আসল লাইন সংখ্যাটি 10 + 3 = 13। পরিবর্তিত রেখার সংখ্যা গণনা করতে, আপনাকে প্রসঙ্গের আগে ও পরে বিয়োগ করতে হবে: 8-3-3 = = 2।
git diff -U0
@@ -13,2 +13,2 @@
আপনি দেখতে পাচ্ছেন, প্রসঙ্গ = 0 নির্ধারণ করা @@ মানকে পড়া সহজ করে তোলে। আপনি দেখতে পাবেন যে পরিবর্তিত রেখাগুলি 13 লাইন থেকে শুরু হবে এবং 2 টি পরিবর্তিত রেখা রয়েছে।
এটি নিখুঁত নয়, কারণ এটি প্রতিটি ব্লকের জন্য কেবল লাইন নম্বরটি দেখায়। আপনি যদি প্রতিটি লাইনের জন্য লাইন নম্বর দেখতে চান তবে কোনও বাহ্যিক সম্পাদকের জন্য ডিফ্টল ব্যবহার করুন। Https://stackoverflow.com/a/50049752 দেখুন
আপনি git difftool
বহিরাগত সম্পাদকের সাথে পৃথক করতে ব্যবহার করতে পারেন যা লাইন সংখ্যা প্রদর্শন করবে। ভিএম / ভিমডিফ দিয়ে এটি কীভাবে করবেন তা এখানে:
গিমের ডিফ্টল হিসাবে ভিমডিফ সেট করুন:
git config --global diff.tool vimdiff
~/.vimrc
ভিমডিফ ব্যবহার করার সময় স্বয়ংক্রিয়ভাবে লাইন নম্বরগুলি দেখানোর জন্য কনফিগার করুন :
if &diff
set number
endif
গিট ডিফ্ট্টোল চালান, যা লাইন সংখ্যার সাথে ভিমডিফ ব্যবহার করবে:
git difftool
আমি ব্যবহার করতে চান git difftool
সঙ্গে মেশানো আমার difftool হিসাবে। এটির তুলনায় git diff
এটি দেখতে আরও সহজ , পাশাপাশি পাশাপাশি গুই তুলনাও রয়েছে এবং প্রতিটি পাশের লাইন সংখ্যাগুলি দেখায়।
আমি কমান্ড-লাইনে git diffn
একটি ড্রপ-ইন প্রতিস্থাপন হতে শেষ কয়েকদিন ধরে লিখেছি git diff
। ইহাকে একটি লাথি দাও. আমার অন্যান্য উত্তর এখানে দেখুন ।
২২ শে মে ২০২০ পর্যন্ত, আপনি এখন git diffn
এই উদ্দেশ্যে তৃতীয় পক্ষের সরঞ্জাম (সম্পূর্ণ প্রকাশ: আমি এটি লিখেছি) ব্যবহার করতে পারি। এটি প্রায় হালকা ওজনের মোড়ক git diff
, awk
প্যাটার্ন / অ্যাকশন-ভিত্তিক প্রোগ্রামিং ভাষায় লেখা। এখানে চলমান থেকে একটি নমুনা আউটপুট git diffn
:
থেকে উপরেরgit-diffn.sh
:
বর্ণনা:
git-diffn.sh
একটি ড্রপ-ইন প্রতিস্থাপন git diff
যার জন্য লাইন 'n'সংখ্যাও দেখায়! এটি ব্যবহার করুন ঠিক মত git diff
ছাড়া তুমি ভালো সহায়তা দিতে আপনার পরিবর্তনগুলি জানার এই সুন্দর লাইন সংখ্যা দেখতে পাবেন।
যেহেতু এটি কেবলমাত্র হালকা ওজনের অজ-ভাষা-ভিত্তিক মোড়কের চারপাশে git diff
, এটি সমস্ত বিকল্প এবং পরামিতি git diff
গ্রহণ করে যা গ্রহণ করে। উদাহরণ:
git diffn HEAD~
git diffn HEAD~3..HEAD~2
আপনার git diff
পছন্দসই রঙ ব্যবহার করলেও আপনার যে কোনও রঙিন সেটিংসের সাথে কাজ করে
কীভাবে কাস্টম ডিফার্ট কালার সেট করতে হয় সেইসাথে কাস্টম-কালার আউটপুটটির স্ক্রিনশটটি দেখতে এখানে আমার উত্তর দেখুন git diffn
: গিট ডিফের মধ্যে আপনি কীভাবে ডিফ হেডারটির রঙ কাস্টমাইজ করতে পারেন?
git config
কাস্টম git diff
রঙ এবং বৈশিষ্ট্যগুলি (পাঠ্য বিন্যাস) সেট করতে উপরে আমার উত্তর থেকে কিছু নমুনা আদেশ রয়েছে :
git config --global color.diff.meta "blue"
git config --global color.diff.old "black red strike"
git config --global color.diff.new "black green italic"
git config --global color.diff.context "yellow bold"
ইন git diffn
, রঙ আউটপুট ডিফল্ট হিসাবে চালু হয়; আপনি যদি আউটপুট রঙটি অক্ষম করতে চান তবে আপনাকে অবশ্যই ব্যবহার করতে হবে --no-color
বা --color=never
। দেখুন man git diff
বিস্তারিত জানার জন্য। উদাহরণ:
git diffn --color=never HEAD~
git diffn --no-color HEAD~3..HEAD~2
gawk
। যদি তাই হয়, চেষ্টা এই : brew install gawk
।বিকল্প 1 (আমার প্রস্তাব): পুরো রেপো ডাউনলোড করুন এবং তারপরে প্রোগ্রামটিতে একটি সিমিলিংক তৈরি করুন যাতে আপনি git pull
যখনই চান রেপো থেকে সহজেই আপডেটগুলি পেতে পারেন।
প্রথমে cd
আপনি যেখানেই এটি ইনস্টল করতে চান সেখানে যান। তারপরে চালান:
git clone https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles.git
cd eRCaGuy_dotfiles/useful_scripts
mkdir -p ~/bin
ln -si "${PWD}/git-diffn.sh" ~/bin/git-diffn
সম্পন্ন! এখন শুধু নীচের চূড়ান্ত পদক্ষেপটি করুন!
বিকল্প 2 (যারা কেবল 1 টি ফাইল চান তাদের জন্য): একবারে একটি ফাইল ডাউনলোড করুন।
mkdir -p ~/bin
cd ~/bin
wget https://raw.githubusercontent.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/master/useful_scripts/git-diffn.sh
chmod +x git-diffn.sh
mv git-diffn.sh git-diffn
সম্পন্ন! এখন শুধু নীচের চূড়ান্ত পদক্ষেপটি করুন!
শেষ ধাপ:
এখন আপনার টার্মিনালটি বন্ধ করুন এবং পুনরায় খুলুন, বা এটির সাথে পুনরায় উত্স করুন . ~/.bashrc
এবং আপনার কাজ শেষ হয়েছে!
git diffn
এখন ঠিক একটি ড্রপ-ইন প্রতিস্থাপন হিসাবে কাজ করবে git diff
!
এখানে একটি ডেমো রয়েছে:
git diffn
:এই ফাইলটি তৈরি করুন:
হ্যালো_ওয়ার্ল্ড। সি:
#include <stdio.h>
int main()
{
printf("Hello World\n");
return 0;
}
এটি প্রতিশ্রুতিবদ্ধ:
git add hello_world.c
git commit -m "add hello_world.c"
এটিতে এটি পরিবর্তন করুন এবং ফাইলটি সংরক্ষণ করুন:
হ্যালো_ওয়ার্ল্ড। সি:
// Basic hello world example
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("Hello Gabriel\n");
int i = 700;
printf("i = %i\n", i);
return 0;
}
এখন চালান:
git diff
git diff
তুলনা উদ্দেশ্যে প্রথম আউটপুট এখানে :
$ git diff
diff --git a/hello_world.c b/hello_world.c
index e01704a..e971b73 100644
--- a/hello_world.c
+++ b/hello_world.c
@@ -1,8 +1,12 @@
+// Basic hello world example
+
#include <stdio.h>
-int main()
+int main(int argc, char *argv[])
{
- printf("Hello World\n");
-
+ printf("Hello Gabriel\n");
+
+ int i = 700;
+ printf("i = %i\n", i);
return 0;
-}
\ No newline at end of file
+}
রঙ দেখানোর জন্য একটি স্ক্রিনশট। মনে রাখবেন যে লাল হাইলাইট করা অংশটি খালি সাদা স্থান (এই ক্ষেত্রে ফাঁকা স্থানগুলি) দেখাচ্ছে যা মুছতে পারে:
এখন এখানে আউটপুট git diffn
। লক্ষ্য করুন এটি নিখুঁতভাবে সমস্ত লাইন সংখ্যা দেখায়!
-
দিকে রয়েছে এবং :
আপনাকে আরও ভাল দেখতে আপনাকে সাহায্য করতে ডানদিকে বাম এবং ডানদিকে একটি চিহ্ন দেখান - আপনার চোখটি কোলনের ডানদিকে স্ক্যান করতে পছন্দ করে বা দূরে নীচে পর্দার বাম+
বাম এবং ডানদিকে উভয়দিকে একটি চিহ্ন দেখায় :
।,
।এর আউটপুট git diffn
:
$ git diffn
diff --git a/hello_world.c b/hello_world.c
index e01704a..e971b73 100644
--- a/hello_world.c
+++ b/hello_world.c
@@ -1,8 +1,12 @@
+ 1:+// Basic hello world example
+ 2:+
1, 3: #include <stdio.h>
2, 4:
- 3 :-int main()
+ 5:+int main(int argc, char *argv[])
4, 6: {
- 5 :- printf("Hello World\n");
- 6 :-
+ 7:+ printf("Hello Gabriel\n");
+ 8:+
+ 9:+ int i = 700;
+ 10:+ printf("i = %i\n", i);
7, 11: return 0;
- 8 :-}
\ No newline at end of file
+ 12:+}
রঙ দেখানোর জন্য একটি স্ক্রিনশট। লক্ষ্য করুন যে কলামগুলি বাম এবং ডানদিকে আশেপাশের পাঠ্যের সাথে মেলানোর জন্য রঙিন বা স্টাইলাইজড নয়। এটি ইচ্ছাকৃত এবং ডিজাইন-ইন আচরণটি বামদিকে যুক্ত হওয়া লাইন সংখ্যা এবং git diff
ডানদিকে মূল আউটপুটটির মধ্যে ভিজ্যুয়াল বিভাজক হিসাবে কাজ করার জন্য।
আপনি চেষ্টা করতে পারেন
git blame
ফাইলের উপর এটি আপনাকে প্রতিবেদক, প্রতিশ্রুতিবদ্ধ আইডি এবং ফাইলের প্রতিটি লাইনের জন্য লাইন নম্বর দেখায়।
git blame
কেবল লাইন সংখ্যা সহ ফাইলের বর্তমান অবস্থা প্রদর্শন করবে।
git blame
কোনওভাবেই প্রশ্নের উত্তর দেয় না; আমি এখানে উঁচুতে বেশ চমকে উঠছি
প্রথমে আপনার গিট ডিফ সরঞ্জামটি কনফিগার করুন, যেমন মেল্ড
git config --global diff.tool meld
তারপরে, কিছু ফাইলের সাথে আপনার ডিফ্টলটি ইয়াঙ্ক করুন:
git difftool -y config.rb
আপনার ডিফ সরঞ্জামটির পছন্দটিতে লাইনের নম্বরটি সেট করা মনে রাখবেন।
git diff --unified=0 | grep -Po '^\+\+\+ ./\K.*|^@@ -[0-9]+(,[0-9]+)? \+\K[0-9]+(,[0-9]+)?(?= @@)'