গিট ডিফার নামকরণ করা ফাইল


105

আমি একটি ফাইল আছে a.txt

cat a.txt
> hello

বিষয়বস্তু a.txtহ্যালো "হ্যালো"।

আমি একটি প্রতিশ্রুতিবদ্ধ।

git add a.txt
git commit -m "first commit"

আমি তখন a.txtএকটি testদির মধ্যে সরানো ।

mkdir test
mv a.txt test

আমি তখন আমার দ্বিতীয় প্রতিশ্রুতিবদ্ধ।

git add -A
git commit -m "second commit"

পরিশেষে, আমি a.txtপরিবর্তে "বিদায়" বলতে সম্পাদনা করি ।

cat a.txt
> goodbye

আমি আমার শেষ প্রতিশ্রুতিবদ্ধ।

git add a.txt
git commit -m "final commit"

এখন এখানে আমার প্রশ্ন:

আমি a.txtআমার শেষ প্রতিশ্রুতি এবং আমার প্রথম প্রতিশ্রুতিবদ্ধতার মধ্যে কীভাবে বিষয়বস্তু আলাদা করতে পারি ?

আমি চেষ্টা করেছি: git diff HEAD^^..HEAD -M a.txtতবে তা কার্যকর হয়নি। git log --follow a.txtসঠিকভাবে নামটি সনাক্ত করে তবে এর সমতুল্য আমি খুঁজে পাচ্ছি না git diff। একটি আছে?


আমি মনে করি আপনি যদি 'git mv a.txt পরীক্ষা' করেন তবে তা একই রকম হয়? IE আপনি কেবল ফাইলটিকে একটি উপ-ডিরেক্টরিতে স্থানান্তরিত করার পরিবর্তে নামকরণ করেছেন।
সর্বোচ্চ ওয়াটারম্যান

উত্তর:


107

পার্থক্যটি HEAD^^এবং এর মধ্যে পার্থক্যটি HEADহ'ল সমস্যাটি হ'ল a.txtউভয় প্রতিশ্রুতিতে আপনার একটি মতামত রয়েছে, সুতরাং কেবলমাত্র সেই দুটি কমিটি বিবেচনা করে (যা কী আলাদা হয়) কোনও নামকরণ নেই, একটি অনুলিপি এবং পরিবর্তন রয়েছে।

অনুলিপিগুলি সনাক্ত করতে, আপনি এটি ব্যবহার করতে পারেন -C:

git diff -C HEAD^^ HEAD

ফলাফল:

index ce01362..dd7e1c6 100644
--- a/a.txt
+++ b/a.txt
@@ -1 +1 @@
-hello
+goodbye
diff --git a/a.txt b/test/a.txt
similarity index 100%
copy from a.txt
copy to test/a.txt

ঘটনাক্রমে, আপনি যদি নিজের পার্থক্যকে কেবল একটি পথে সীমাবদ্ধ করে থাকেন (যেমনটি আপনি করেন তবে নাম এবং git diff HEAD^^ HEAD a.txtকপিগুলি কখনই দেখতে পাবেন না কারণ আপনি একক পথ বাদ দিয়ে সমস্ত কিছু বাদ দিয়েছেন এবং নাম বা কপিগুলি - সংজ্ঞা অনুসারে - দুটি জড়িত পাথ।


2
বলুন প্রতিশ্রুতিতে একাধিক ফাইল পরিবর্তন রয়েছে। আমি কীভাবে এটি একটি একক ফাইলের মধ্যে আলাদা করতে পারি?
কেন হিরাকাওয়া

3
@ কেনহিরাকাওয়া ব্যবহার করুন -- <old-path> <new-path>... আমার উত্তর দেখুন।
নোলান অ্যামি

আমার ক্ষেত্রে, আমি ফাইলটির পুনরায় নামকরণ করা হয়েছে এমন প্রতিশ্রুতি সম্পর্কিত বিশদটি দেখাতে চেয়েছিলাম, তবে এটি কেবল দেখিয়েছিল যে একটি ফাইল মুছে ফেলা হয়েছে এবং একটি ফাইল যুক্ত করা হয়েছিল ... আমি দৌড়ে গিয়েছিলাম git show -C [commit]এবং এটি ফাইলটির নামটি সনাক্ত করে এবং আমাকে দেখিয়েছিল ফাইলের মধ্যে পার্থক্য। পারফেক্ট।
জেসন

83

একটি নির্দিষ্ট ফাইলের নাম পরিবর্তন করতে পার্থক্য করতে, ব্যবহার করুন -M -- <old-path> <new-path>( -Cএছাড়াও কাজ করে)।

তাই আপনি যদি উভয় নতুন নামকরণ এবং গত একটি ফাইল পরিবর্তন কমিট আপনার সাথে পরিবর্তন দেখতে পারেন:

git diff HEAD^ HEAD -M -- a.txt test/a.txt

এটি উত্পাদন করে:

diff --git a/a.txt b/test/a.txt
similarity index 55%
rename from a.txt
rename to test/a.txt
index 3f855b5..949dd15 100644
--- a/a.txt
+++ b/test/a.txt
@@ -1,3 +1,3 @@
 // a.txt

-hello
+goodbye

( // a.txtগিটারটির নামটি সনাক্ত করতে সহায়তার জন্য যুক্ত রেখা)


যদি গিটটি পুনরায় নামটি সনাক্ত করছে না, আপনি -M[=n]1% এর সাথে নিম্ন সাদৃশ্য প্রান্তিক নির্দিষ্ট করতে পারেন :

git diff HEAD^ HEAD -M01 -- a.txt test/a.txt

থেকে Git পরিবর্তন ডক্স :

-এম [<n>] - অন্বেষণ-পুনরায় নামকরণ [= <n>]

নামগুলি সনাক্ত করুন। যদি nনির্দিষ্ট করা থাকে তবে এটি অনুরূপ সূচকের (একটি ফাইলের আকারের সাথে তুলনায় সংযোজন / মোছার পরিমাণ) একটি প্রান্তিক। উদাহরণস্বরূপ, এর -M90%মানে যদি গিটের 90% এরও বেশি ফাইল পরিবর্তন না হয় তবে একটি মুছুন / যুক্তটিকে পুনরায় নাম হিসাবে বিবেচনা করা উচিত। কোনও %চিহ্ন ছাড়াই সংখ্যাটি ভগ্নাংশ হিসাবে পড়তে হবে, এর দশমিক পয়েন্ট সহ। অর্থাৎ, -M50.5 হয়, এবং এইভাবে একই -M50%। একইভাবে, -M05হিসাবে একই -M5%। সঠিক নামগুলিতে সনাক্তকরণ সীমাবদ্ধ করতে, ব্যবহার করুন -M100%। ডিফল্ট অনুরূপ সূচক 50%।


... অবশ্যই, যখন পরিবর্তন এবং পুনর্নামকরণ মূল উদাহরণ হিসাবে পৃথক কমিটে থাকে তখনও কাজ করে:git diff HEAD^^ HEAD -M -- a.txt test/a.txt
নোলান এমি

1
কেবল তখনই যখন ফাইলগুলির বিষয়বস্তুগুলি আলাদা হওয়ার জন্য যথেষ্ট পরিমাণে থাকে তবে একটি সাদৃশ্য সূচক আসে। উভয় অপশন ব্যবহার করে (-M এবং -C) একটি ফাইলের মধ্যে / dev / null an / dev / null থেকে পৃথক দেখায় যা নাম বদলে দেওয়া হয়েছিল এবং পুরোপুরি পরিবর্তিত হয়েছে (ইনডেন্ট বুদ্ধিমান সহ), উপেক্ষা করার পরেও এটি ধরেনা হোয়াইটস্পেস।
ডেভিডজি

37

আপনি এটি করতে পারেন:

git diff rev1:file1 rev2:file2

যা আপনার উদাহরণের জন্য হবে

git diff HEAD^^:./a.txt HEAD:./test/a.txt

সুস্পষ্ট দ্রষ্টব্য ./- এই ফর্ম্যাটটি অন্যথায় পথগুলি রেপোর মূলের সাথে সম্পর্কিত বলে ধরে নিয়েছে। (আপনি যদি রেপোর মূলে থাকেন তবে অবশ্যই আপনি তা বাদ দিতে পারেন))

এটি মোটেও নামটি সনাক্তকরণের উপর নির্ভর করে না, কারণ ব্যবহারকারী স্পষ্টভাবে কী তুলনা করতে হবে তা উল্লেখ করছে। (সুতরাং, এটি অন্যান্য কিছু পরিস্থিতিতে যেমন গিট-এসএনএন পরিবেশে বিভিন্ন এসএনএন শাখার মধ্যে ফাইলগুলির তুলনা করার ক্ষেত্রেও কার্যকর হয়))


1
ওহ, এটি দুর্দান্ত!
নোলান অ্যামি

একত্রীকরণের মাধ্যমে অতিরিক্ত ফাইলের পরিবর্তনের নাম পরিবর্তনের জন্য এটিই আমার পক্ষে কাজ করেছে answer ধন্যবাদ!
লেন রেটিগ

1

যদি আপনার পুনর্নবীকরণ প্রতিশ্রুতি মঞ্চায়িত হয় তবে এখনও প্রতিশ্রুতিবদ্ধ না হয় তবে আপনি ব্যবহার করতে পারেন:

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