সরানো / নাম পরিবর্তন করা ফাইলটিতে গিট ডিফারেশন কীভাবে করবেন?


128

আমি একটি ফাইল ব্যবহার করে সরানো git mv। পুরানো ফাইলের সাথে এটি তুলনা করতে এখন আমি নতুন ফাইলটিতে আলাদা করতে চাই (পুরানো, এখন অস্তিত্বহীন নামের সাথে)।

আমি এটা কিভাবে করবো?


4
শীঘ্রই (গিট 2.9, জুন 2016), একটি সরল git diff -- yourRenamedFileযথেষ্ট হবে be দেখুন নিচের আমার উত্তর
VonC

উত্তর:


145

আলাদা হওয়ার সময় গিটটি অটোডেটেক্ট করার জন্য আপনাকে -M ব্যবহার করতে হবে। ব্যবহার করে শুধু git diffknittl হিসাবে উল্লেখ করেছে আমার জন্য কাজ করে না।

সুতরাং সহজভাবে: git diff -Mএটি করা উচিত।

এই স্যুইচটির জন্য ডকুমেন্টেশন হ'ল:

-M[<n>], --find-renames[=<n>]
       Detect renames. If n is specified, it is a threshold on the similarity index 
       (i.e. amount of addition/deletions compared to the file’s size). For example, 
       -M90% means git should consider a delete/add pair to be a rename if more than
       90% of the file hasn’t changed.

7
Lifesaver হয়! আমার গিট ডিফস এখন অনেক ভাল। 1) এই বিকল্পটি সর্বদা ব্যবহার করা কি নিরাপদ? 2) আমি আমার ডিফল্ট আচরণ হিসাবে এই বিকল্পটি যুক্ত করতে পারি ~/.gitconfig?
কেভিনার্পে

5
নোট করুন যে পুরানো এবং নতুন দুটি ফাইলই প্রক্রিয়াজাত করা ফাইলগুলির সংগ্রহে উপস্থিত হলে পুনরায় নামকরণ সনাক্তকরণ কাজ করে git diff। চলমান git diff -Mএকটি একক (নাম পরিবর্তিত হয়ে) ফাইল একটি পুনঃনামকরণ প্রতিবেদন নেই।
লিওন

1
এটি আমার পক্ষে কাজ করে না, তবে git log --follow -- file_after_move.txtভাল কাজ করে। এটি স্থানান্তরের আগে সহ পুরো ইতিহাস দেখায়। কোন ধারনা? আমি দৌড়াচ্ছি git version 2.11.0.windows.1
বুভিয়ার

1
-Cকপি detecting জন্য বিকল্প দরকারী এবং অনুরূপ। আমি এটির -Mপরিবর্তনের জন্য এটি ব্যবহার করেছি যেখানে আমি একটি ফাইলকে দুটি করে রিফেক্টর করেছি (নামটির সাথে কোনও মিল নেই)।
cp.engr

85

নিটল যা লিখেছেন তা ছাড়াও আপনি সর্বদা ব্যবহার করতে পারেন:

git diff HEAD:./oldfilename newfilename

যেখানে HEAD:./oldfilenameবর্তমান ডিরেক্টরি অনুসারে সর্বশেষ প্রতিশ্রুতি (HEAD- এ) পুরানো ফাইলের নাম।

আপনার যদি নতুন পর্যাপ্ত গিট না থাকে তবে আপনার পরিবর্তে এটি ব্যবহার করতে হবে:

git diff HEAD:path/to/oldfilename newfilename

8
এর জন্য ধন্যবাদ. আপনি মাথার পরিবর্তে একটি নির্দিষ্ট প্রতিশ্রুতিও নির্দিষ্ট করতে পারেন, যেমনgit diff 39fa7c77e85c51d43ea0cf30d33aec8721812e9e:./oldfilename newfilename
ক্রিস ব্লুম

8
যদি এটি অস্পষ্ট থাকে তবে আপনি শাখার নাম বা অন্য কোনও রেফারেন্সও নির্দিষ্ট করতে পারেন, যেমন:git diff branch:old/filen.name newfilename
জ্রিচার

আপনি যদি cdডিরেক্টরিতে যোগ --করেন এবং commit:pathজোড়ার আগে যোগ না করেন তবে প্রথম ফর্মটি আমার জন্য কাজ করে । গিটটি এখানে সিনট্যাক্সের সাথে খুব পিকে বলে মনে হচ্ছে।
ধরদি

1
@ ধরডি <commit-ish>:<pathname>সিনট্যাক্স হ'ল অবজেক্ট শনাক্তকারী, গিট-ইশ; পরে --গীত শুধুমাত্র ফাইলের নামের প্রত্যাশা করে।
জাকুব নারেবস্কি

18

গিট ২.৯ (জুন ২০১)) এর সাথে আপনাকে -Mআর যোগ করতে হবে না । ডিফল্টরূপে git diffব্যবহার -Mকরে।

দেখুন প্রতিশ্রুতি 5404c11 , প্রতিশ্রুতিবদ্ধ 9501d19 , প্রতিশ্রুতিবদ্ধ a9276a6 , অঙ্গীকার f07fc9e , 62df1e6 (25 ফেব্রুয়ারী 2016) ম্যাথিউ ময়moy দ্বারা প্রতিশ্রুতিবদ্ধ ( )
(দ্বারা একীভূত junio সি Hamano - gitster- মধ্যে কমিট 5d2a30d , 03 এপ্রিল 2016)

diff: diff.renamesডিফল্টরূপে সক্রিয় করুন

পুনঃনামকরণ সনাক্তকরণ একটি খুব সুবিধাজনক বৈশিষ্ট্য এবং নতুন ব্যবহারকারীদের এটি থেকে উপকৃত হওয়ার জন্য ডকুমেন্টেশনটি খনন করা উচিত নয়।

নামকরণ সনাক্তকরণ সক্রিয় করার সম্ভাব্য আপত্তি হ'ল এটি কখনও কখনও ব্যর্থ হয় এবং এটি কখনও কখনও ধীর হয়। তবে " git status" এবং " git merge" এর মতো বেশ কয়েকটি ক্ষেত্রে পুনরায় নাম সনাক্তকরণ ডিফল্টরূপে সক্রিয় করা হয়েছে , সুতরাং সক্রিয়করণটি diff.renamesপরিস্থিতিটিকে মৌলিকভাবে পরিবর্তন করে না। যখন পুনরায় নাম সনাক্তকরণ ব্যর্থ হয়, এটি এখন " git diff" এবং " git status" এর মধ্যে ধারাবাহিকভাবে ব্যর্থ হয় ।

এই সেটিংটি নদীর গভীরতানির্ণয় কমান্ডগুলিকে প্রভাবিত করে না, সুতরাং লিখিত স্ক্রিপ্টগুলি প্রভাবিত হবে না।

এই বৈশিষ্ট্যের জন্য নতুন পরীক্ষা এখানে


1

git diff -Mঅন্যরা যেমন বলেছে তেমন নামকরণ সনাক্তকরণকে সক্রিয় করে (এবং @ ভনসি দেখিয়েছে যে এটি গিট ২.৯ থেকে পূর্বনির্ধারিতভাবে সক্রিয় করা হয়েছে)। তবে আপনার যদি একটি বড় চেঞ্জসেট থাকে, অক্ষত পুনর্নবীকরণ সনাক্তকরণটি আবারও বন্ধ হয়ে যেতে পারে। গিট নীচের মত একটি সতর্কতা প্রদর্শন করবে, যা আপনি দেখছেন তার বিভেদগুলির মধ্যে মিস করা সহজ:

warning: inexact rename detection was skipped due to too many files.
warning: you may want to set your diff.renameLimit variable to at least 450 and retry the command.

সেক্ষেত্রে গিটের পরামর্শ অনুসারে কনফিগারেশন বিকল্পটি সেট করুন

git config diff.renamelimit 450

এবং আপনার ডিফ্ট কমান্ডটি পুনরায় রান করুন।


0

যে কোনও কারণে HEAD:./oldfilename(বা নিখুঁত পাথ) ব্যবহার করা আমার পক্ষে কাজ করে নি, তবে HEAD:oldfilenameকরেছে (ধন্যবাদ সিএমএন):

git diff HEAD:oldfilename newfilename
git diff 2a80f45:oldfilename f65f3b3:newfilename

আছে HTH


সম্ভবত আপনার গিট বুঝতে খুব পুরানো HEAD:./oldfilename?
জাকুব নারেবস্কি

-4

কেবল git diffকোনও যুক্তি ছাড়াই চালান , বাgit diff -- newfilename । ডানদিকের ফাইল / বিষয়বস্তুর তুলনা করার জন্য গিট যথেষ্ট স্মার্ট (যেমন নামের পরিবর্তিত সামগ্রীর সাথে পুনরায় নামকরণের পূর্বে মূল সামগ্রী)


2
গিট বেশিরভাগ ক্ষেত্রেই যথেষ্ট স্মার্ট নয়। কেবলমাত্র git mvএকটি একক ফাইল ইঙ্গিত করা এবং তারপরে স্টেজযুক্ত রাজ্যের সাথে অন্য কোনও-অভিন্ন শাখার সাথে তুলনা করলে ব্যবহার না করা হলে "সবকিছু মুছে ফেলা এবং পুনরায় পুনরায় তৈরি করা হয়েছিল" আলাদা হবে -M
রিন্ডেরিয়েন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.