দুটি ভিন্ন শাখা থেকে ফাইলগুলি কীভাবে তুলনা করবেন?


1537

আমার একটি স্ক্রিপ্ট রয়েছে যা একটি শাখায় ভাল কাজ করে এবং অন্য একটিতে ভাঙা। আমি পাশাপাশি দুটি সংস্করণ দেখতে চাই এবং কী আলাদা তা দেখতে চাই। এটি করার কোনও উপায় আছে?

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

git diff mybranch/myfile.cs master/myfile.cs

উত্তর:


2207

git diff দুটি চুক্তির মধ্যে পার্থক্য আপনাকে দেখাতে পারে:

git diff mybranch master -- myfile.cs

বা, সমতুল্য:

git diff mybranch..master -- myfile.cs

পরের সিনট্যাক্সটি ব্যবহার করে, উভয় দিক থাকলে HEADএটি বাদ দেওয়া যেতে পারে (যেমন master..তুলনা masterকরা HEAD)।

আপনি আগ্রহী হতে পারেন mybranch...master( git diffডক্স থেকে ):

এই ফর্মটি হ'ল <commit>উভয়ই সাধারণ পূর্বপুরুষ থেকে শুরু করে এবং দ্বিতীয়টিতে থাকা শাখায় পরিবর্তনগুলি দেখা <commit>git diff A...Bসমতূল্য git diff $(git-merge-base A B) B

অন্য কথায়, masterএটি যেহেতু এটি থেকে সরে গিয়েছে mybranch(তবে তার পরে নতুন পরিবর্তন ছাড়াই mybranch) এর পরিবর্তনের একটি ভিন্নতা দেয় ।


সব ক্ষেত্রে, --ফাইলের নামের আগে বিভাজক কমান্ড লাইন পতাকাগুলির সমাপ্তি নির্দেশ করে। যুক্তি যদি কোন অঙ্গীকার বা কোনও ফাইলকে বোঝায় তবে গিট বিভ্রান্ত হবেন না এটি alচ্ছিক, তবে এটি সহ কোনও খারাপ অভ্যাস নয় including কয়েকটি উদাহরণের জন্য https://stackoverflow.com/a/13321491/54249 দেখুন ।


git difftoolআপনার যদি একটি কনফিগার করা থাকে তবে একই আর্গুমেন্টগুলি পাস হতে পারে ।


44
এবং আপনি যে দুটি সংস্করণ তুলনা করতে চান তার কোনওটি যদি কাজের গাছ না হয় তবে আপনি ব্যবহার করতে পারেন git diff branch1 branch2 myfile.cs। ( --এটি আর প্রয়োজন হবে না, কারণ এটি কেবল দুটি পুনর্বিবেচনা যুক্তি নিতে পারে
ক্যাসাবেল

8
আমি এর প্রতিটি সংস্করণ চেষ্টা করেছি এবং কিছুই ঘটে না। আমি আমার ডিফ্টল কনফিগার করেছি (এটি মার্জ করার জন্য কাজ করে)। আমার কাছে bd.ps1 নামে একটি ফাইল আছে। আমি যে কমান্ডটি টাইপ করি তার প্রতিটি সংস্করণ কিছুই করে না। এমনকি কোনও ভুলকারীকে দেয় না। WTH!?!?!
মিকাহ

3
@ মিচাহ: আপনি কি এটিকেও আলাদা আলাদাভাবে চেষ্টা করে দেখছেন? আপনি কি সঠিকভাবে বর্তমান ডিরেক্টরিটি সম্পর্কিত পাথ টাইপ করছেন? (ফাইলটি উপস্থিত না থাকলে এটি নিঃশব্দে কোনও ভিন্নতা দেখায় না, এবং আপনি --সাধারণ এবং সহজ ভুলটি ব্যবহার করেন ))
ক্যাসকেবেল

5
আমি যেমন ফাইলের পুরো পথটি অন্তর্ভুক্ত না করি তবে এটি আমার পক্ষে কার্যকর হয়নি git diff --name-status branch1..branch2(সম্ভবত সুস্পষ্ট, তবে আমি ভেবেছিলাম যে অন্য কারওর মতো আমার যদি সমস্যা হয় তবে আমি এটিকে উল্লেখ করব)।
এইচবারেন্ট

4
মাইব্রাঞ্চ এবং মাস্টারের ক্রমটিও গুরুত্বপূর্ণ। প্রথম শাখায় ফাইলটি '-' উপসর্গ দিয়ে দেখানো হবে, দ্বিতীয় শাখার ফাইলটি '+' উপসর্গ দিয়ে দেখানো হবে।
টিম্বো

413

তুমি এটি করতে পারো: git diff branch1:path/to/file branch2:path/to/file

আপনার যদি ডিফ্টল টানটি কনফিগার করা থাকে তবে আপনি এটিও করতে পারেন: git difftool branch1:path/to/file branch2:path/to/file

সম্পর্কিত প্রশ্ন: আমি ভিজ্যুয়াল ডিফ প্রোগ্রামের সাথে গিট ডিফ আউটপুট কীভাবে দেখতে পারি


4
কলোন ব্যবহার করা সত্যিই দুর্দান্ত উপায় নয় - এর অর্থ হল আপনি গাছের বস্তুর মাধ্যমে ফাইলগুলি উল্লেখ করছেন, সুতরাং আপনার বর্তমান ডিরেক্টরিটির পরিবর্তে আপনাকে পুরো পথটি টাইপ করতে হবে।
ক্যাসকেবেল

13
@ জেফ্রোমি, এটি সম্ভবত সাম্প্রতিক সংস্করণে পরিবর্তিত হয়েছে তবে কমপক্ষে এখন আপনি আপেক্ষিক পথগুলি ব্যবহার করতে পারেন (উদাঃ branch1:./file)। ফাইলটি শাখাগুলির মধ্যে পৃথক স্থানে থাকলে (উদাহরণস্বরূপ git diff branch1:old/path/to/file branch2:new/path/to/file) এটিও কার্যকর ।
redbmk

4
@ রেডএমএম হ্যাঁ, এটি ২০১০ এবং এখনকার মাঝে ছিল! তবুও, যদি এটি উভয় শাখায় একই ফাইল হয় তবে ঠিক এটি করার দরকার নেই git diff branch1 branch2 path/to/file
ক্যাসাবেল

3
@ জেফ্রমি শীতল, কখন যে যুক্ত করা হয়েছিল তা সম্পর্কে আমি নিশ্চিত ছিলাম না। হ্যাঁ আমি সাধারণত আপনার উল্লিখিত বাক্য গঠনটি ব্যবহার করতাম, তবে টিমের উত্তর আমাকে কীভাবে ফাইলগুলির তুলনা করতে পারে তা বুঝতে সাহায্য করেছিল, যদিও প্রশ্নটি জিজ্ঞাসা করছে তা সত্য নয়
redbmk

1
যদিও আমি এই ধারণাটি পছন্দ করি, আমি এই সিনট্যাক্সটি কাজ করতে বা গিট ডিফ ডক্সে এর কোনও উল্লেখ পেতে পারি না। আমি কী মিস করছি? ধন্যবাদ!
yoyo

160

আরও আধুনিক বাক্য গঠন:

git diff ..master path/to/file

ডাবল-ডট প্রিফিক্সটির অর্থ "বর্তমান ওয়ার্কিং ডিরেক্টরি থেকে"। আপনি আরও বলতে পারেন:

  • master..অর্থাৎ উপরের বিপরীত। এই হিসাবে একই master
  • mybranch..master, বর্তমান কার্যক্ষম গাছ বাদে অন্য একটি রাষ্ট্রকে স্পষ্টভাবে উল্লেখ করে।
  • v2.0.1..master, অর্থাত্ একটি ট্যাগ রেফারেন্সিং।
  • [refspec]..[refspec], মূলত গিটের জন্য একটি কোড স্টেট হিসাবে শনাক্তযোগ্য কিছু।

33

দুটি ভিন্ন শাখা থেকে ফাইলের তুলনা করার বিভিন্ন উপায় রয়েছে:

  • বিকল্প 1: আপনি যদি এন নির্দিষ্ট শাখা থেকে অন্য নির্দিষ্ট শাখায় ফাইলটি তুলনা করতে চান:

    git diff branch1name branch2name path/to/file
    

    উদাহরণ:

    git diff mybranch/myfile.cs mysecondbranch/myfile.cs
    

    এই উদাহরণে আপনি “মাইক্রাঞ্চ” শাখায় থাকা ফাইলটিকে "মাইসেকেন্ডব্র্যাঞ্চ" শাখার সাথে তুলনা করছেন।

  • বিকল্প 2: সহজ উপায়:

     git diff branch1:file branch2:file
    

    উদাহরণ:

     git diff mybranch:myfile.cs mysecondbranch:myfile.cs
    

    এই উদাহরণটি বিকল্প 1 এর অনুরূপ।

  • বিকল্প 3: আপনি যদি আপনার বর্তমান ওয়ার্কিং ডিরেক্টরিটি কোনও শাখার সাথে তুলনা করতে চান:

    git diff ..someBranch path/to/file
    

    উদাহরণ:

    git diff ..master myfile.cs
    

    এই উদাহরণে আপনি আপনার প্রকৃত শাখা থেকে ফাইলকে মাস্টার শাখায় থাকা ফাইলের সাথে তুলনা করছেন।


12

আমি কেবল করি git diff branch1 branch2 path/to/file

এই ফাইলগুলির মধ্যে পার্থক্য পরীক্ষা করে। পরিবর্তনগুলি branch1লাল হবে। পরিবর্তনগুলি branch2সবুজ হবে।

এটি ধরে নেওয়া হয়েছে যে branch1অতীত এবং branch2ভবিষ্যত। আপনি বিভিন্ন শাখার ক্রমটি বিপরীত করে এটিকে বিপরীত করতে পারেন:git diff branch2 branch1


গিট ডিফের কোন সংস্করণ এটি করতে পারে? আমি যে সংস্করণটি চালাচ্ছি (২.৯.২.২ উইন্ডোজ .১) এটি সমর্থন করে বলে মনে হচ্ছে না।
ভিন্স বাউডরেন

9

আপনি যদি বর্তমান শাখার চেয়ে আলাদা করতে চান তবে আপনি এটি বাদ দিতে এবং ব্যবহার করতে পারেন:

git diff $BRANCH -- path/to/file

এইভাবে এটি বর্তমান শাখার থেকে রেফারেন্স করা শাখায় পৃথক হবে ( $BRANCH)।


5

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

git diff branch master -- filepath/filename.extension > filename.diff --cached

2

আমার ক্ষেত্রে, আমি নীচের কমান্ডটি ব্যবহার করি:

git diff <branch name> -- <path + file name>

এই কমান্ডটি আপনাকে দুটি ভিন্ন শাখায় একই ফাইলের তুলনা করতে সহায়তা করতে পারে


1

এটি করার সর্বোত্তম উপায় হ'ল git diffনিম্নলিখিত পদ্ধতি ব্যবহার করে : git diff <source_branch> <target_branch> -- file_path

এটি branches শাখাগুলির মধ্যে ফাইলগুলির মধ্যে পার্থক্য পরীক্ষা করবে। গিট কমান্ড এবং তারা কীভাবে কাজ করে সে সম্পর্কে আরও তথ্যের জন্য এই নিবন্ধটি একবার দেখুন ।


1

প্রতিশ্রুতিবদ্ধ হ্যাশগুলি এটি হিসাবে ব্যবহার করুন:

git diff <hash1> <hash2> <filename>

যেখানে hash1 কোনো হতে পারে কোনো শাখা, একই থেকে কমিট hash2


1

ফাইলগুলির তুলনা করার জন্য দুটি পরিস্থিতি রয়েছে:

পরিস্থিতি 1: দূরবর্তী শাখায় ফাইলের তুলনা করুন (উভয় শাখা দূরবর্তী সংগ্রহস্থলে থাকা উচিত)

পরিস্থিতি 2: স্থানীয় ফাইলগুলি (স্থানীয় ওয়ার্কিং এরিয়া কপির সাথে) দূরবর্তী সংগ্রহস্থলের ফাইলগুলির সাথে তুলনা করুন।

যুক্তিটি সহজ। যদি আপনি দুটি শাখার নাম পৃথক করে সরবরাহ করেন তবে এটি সর্বদা দূরবর্তী শাখাগুলির সাথে তুলনা করবে এবং যদি আপনি কেবল একটি শাখার নাম সরবরাহ করেন তবে এটি সর্বদা আপনার স্থানীয় কার্যকরী অনুলিপি রিমোট রেপো (আপনি যে সরবরাহ করেছেন) এর সাথে তুলনা করবে। দূরবর্তী সংগ্রহস্থল সরবরাহ করতে আপনি ব্যাপ্তি ব্যবহার করতে পারেন।

যেমন একটি শাখা চেকআউট

git checkout branch1
git diff branch2 [filename]

এই ক্ষেত্রে, আপনি যদি ফাইলের নাম সরবরাহ করেন তবে এটি আপনার স্থানীয় স্থানীয় অনুলিপিটিকে " ব্রাঞ্চ 2 " নামে প্রত্যন্ত শাখার সাথে তুলনা করবে ।

git diff branch1 branch2 [filename]

এই ক্ষেত্রে, এটি " ব্রাঞ্চ 1 " বনাম " ব্রাঞ্চ 2 " নামের প্রত্যন্ত শাখাগুলির ফাইলের সাথে তুলনা করবে

git diff ..branch2 [filename]

এই ক্ষেত্রেও, এটি " ব্রাঞ্চ 1 " বনাম " ব্রাঞ্চ 2 " নামের প্রত্যন্ত শাখাগুলির ফাইলের সাথে তুলনা করবে । সুতরাং, এটি উপরে হিসাবে একই। তবে, আপনি যদি এখনই অন্য একটি শাখা থেকে একটি শাখা তৈরি করেছেন, "মাস্টার" বলুন এবং আপনার বর্তমান শাখা দূরবর্তী সংগ্রহস্থলে উপস্থিত নেই, এটি দূরবর্তী " মাস্টার " বনাম দূরবর্তী " শাখা 2 " এর সাথে তুলনা করবে ।

আশা করি এর কার্যকর।


0

গিট ব্যাশে দুটি ফাইলের তুলনা করতে আপনার কমান্ডটি ব্যবহার করতে হবে:

git diff <Branch name>..master -- Filename.extension   

এই কমান্ডটি ব্যাশের মধ্যে দুটি ফাইলের মধ্যে পার্থক্য প্রদর্শন করবে।

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