একই শাখায় দুটি পৃথক কমিটের মধ্যে আমি একই ফাইলটি কীভাবে পৃথক করব?


1143

গিটে, আমি একই শাখায় দুটি পৃথক কমিটের (একই রকম নয়) উদাহরণস্বরূপ (উদাহরণস্বরূপ) মধ্যে একই ফাইলটি কীভাবে তুলনা করতে পারি?

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

উত্তর:


1475

git-diffম্যানপেজ থেকে :

git diff [--options] <commit> <commit> [--] [<path>...]

উদাহরণস্বরূপ, এখন এবং দুটি কমিটের মধ্যে একটি ফাইল "main.c" এর পার্থক্যটি দেখতে, এখানে তিনটি সমতুল্য কমান্ড রয়েছে:

$ git diff HEAD^^ HEAD main.c
$ git diff HEAD^^..HEAD -- main.c
$ git diff HEAD~2 HEAD -- main.c

43
..সত্যিই প্রয়োজনীয় যদিও তখন তার সঙ্গে (মোটামুটি পুরানো সংস্করণ ছাড়া, হয়তো) কাজ করব না। আপনি দু'জনের প্রতিশ্রুতি খুব দূরে থাকলে, ব্যবহার করতে git logবা gitkSHA1 গুলি ব্যবহার করতে পারেন। gitkএছাড়াও এর প্রসঙ্গ মেনুতে একটি "পৃথক নির্বাচিত -> এটি" এবং "এই পৃথক -> নির্বাচিত" রয়েছে।
ক্যাসাবেল

17
2 কমিটের মধ্যে ফাইলের নামটি সংশোধন করা হলেও এটি কী কাজ করবে?
পুনরায়জহন

26
সুতরাং "-"
ব্যবহারকারী 64141

29
@ user64141 --আপনি নামের একটি ফাইল আছে দরকারী যেমন হয় -p। স্ক্রিপ্টগুলিতে ব্যবহার করা ভাল, কেবলমাত্র অনুশীলনের ক্ষেত্রে বিরল ক্ষেত্রে।
পেরেক

13
দ্রষ্টব্য: আপনার রেপোর মূলের সাথে সম্পর্কিত পাথগুলি ব্যবহার করতে হবে। বর্তমান ওয়ার্কিং ডিরেক্টরি সম্পর্কিত পাথ কাজ করবে না।
কেভিন হুইলার

280

আপনি দুটি পৃথক সংশোধনীতে দুটি পৃথক ফাইলের তুলনা করতে পারেন, এটির মতো:

git diff <revision_1>:<file_1> <revision_2>:<file_2>


25
নোট দেখে মনে হচ্ছে যে ভালো যদি <file_1>এবং <file_2>শীর্ষ স্তরের Git পরিচালিত ডিরেক্টরির না, বর্তমান ডিরেক্টরির মধ্যে আছে, এক শুরুতে যোগ করা হয়েছে ./ইউনিক্স করুন:<revision_1>:./filename_1
আন্দ্রে Holzner

7
<পুনর্বিবেচনা>: বাদ দেওয়া যেতে পারে, তাই আপনি কোনও ফাইলের সাথে পার্থক্য করতে পারেন যা এখনও প্রতিশ্রুতিবদ্ধ হয়নি।
ইয়ারোস্লাভ নিকিতেনকো 6'15

2
নোট করুন যে উইন্ডোজটিতে ফাইলের জন্য '/' ব্যবহার করতে হবে, '\' নয়।
এনপি 8

87

আপনি যদি "ডিফ্টল" কনফিগার করে থাকেন তবে আপনি ব্যবহার করতে পারেন

git difftool revision_1:file_1 revision_2:file_2

উদাহরণ: একই শাখায় তার পূর্বের প্রতিশ্রুতি থেকে কোনও ফাইলের তুলনা করা: ধরে নেওয়া যে আপনি যদি আপনার প্রকল্পের মূল ফোল্ডারে থাকেন তবে

$git difftool HEAD:src/main/java/com.xyz.test/MyApp.java HEAD^:src/main/java/com.xyz.test/MyApp.java

আপনার ~ / .gitconfig বা প্রোজেক্ট / .git / কনফিগারেশন ফাইলে নিম্নলিখিত প্রবেশদ্বার থাকা উচিত। P4 विसর ইনস্টল করুন [এটি আমার পছন্দের ডিফ এবং সংযুক্তির সরঞ্জাম]

[merge]
    tool = p4merge
    keepBackup = false
[diff]
    tool = p4merge
    keepBackup = false
[difftool "p4merge"]
    path = C:/Program Files (x86)/Perforce/p4merge.exe
[mergetool]
    keepBackup = false
[difftool]
    keepBackup = false
[mergetool "p4merge"]
    path = C:/Program Files (x86)/Perforce/p4merge.exe
    cmd = p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"

50

পরীক্ষা করে দেখুন $ git log, কপি রয়েছে SHA-1 দুটি ভিন্ন করে এর আইডি, এবং চালানোর git diffঐ ID- র সঙ্গে কমান্ড। উদাহরণ স্বরূপ:

$ git diff (sha-id-one) (sha-id-two)

18
আপনি যদি কোনও নির্দিষ্ট ফাইলের জন্য পৃথক চান, কমান্ডের শেষে এটিতে পথ যুক্ত করুন।
hBrent

যদি দুটি কমিট বিবিধ শাখা জুড়ে থাকে তবে সম্পূর্ণ ট্রি তথ্যটি ডাউনলোড করতে একটি "গিট টান" করুন। অন্যথায় আপনি একটি "মারাত্মক: খারাপ বিষয়" ত্রুটি পাবেন।
ব্যবহারকারী 238607

4
git diff (sha-id-one) (sha-id-two) -- filename.ext ফাইল নাম ছাড়াই এটি দুটি কমিটের সমস্ত ফাইলের আলাদা তালিকা প্রদর্শন করবে ।
শেরিলহোমান

40

যদি আপনি প্রতিশ্রুতি দ্বারা প্রতিশ্রুতি ভিত্তিতে দুটি চুক্তির মধ্যে ফাইলের সমস্ত পরিবর্তন দেখতে চান তবে আপনি এটি করতেও পারেন

git log -u $start_commit..$end_commit -- path/to/file


"$ Start_commit" এবং "$ end_commit" কী? এগুলি কি আক্ষরিক, না থাকলে, আপনি একটি উদাহরণ দিতে পারেন?
পিটার মর্টেনসেন

সেগুলি শেল ভেরিয়েবলগুলির মধ্যে শুরু এবং শেষের পুনর্বিবেচনা ধারণ করে, যা পরিবর্তে sha1
আক্ষরিক

21

এখানে একটি পার্ল স্ক্রিপ্ট রয়েছে যা একটি প্রদত্ত ফাইলের জন্য গিট লগ কমান্ডে পাওয়া যায় এমন গিট ডিফার্ট কমান্ড মুদ্রণ করে।

যেমন

git log pom.xml | perl gldiff.pl 3 pom.xml

উৎপাদনের:

git diff 5cc287:pom.xml e8e420:pom.xml
git diff 3aa914:pom.xml 7476e1:pom.xml
git diff 422bfd:pom.xml f92ad8:pom.xml

যা পরে কাটা এবং শেল উইন্ডো সেশনে পেস্ট করা যায় বা এতে পাইপ করা যায় /bin/sh

মন্তব্য:

  1. সংখ্যা (এই ক্ষেত্রে 3) কত লাইন মুদ্রণ করতে হবে তা নির্দিষ্ট করে
  2. ফাইল (এই ক্ষেত্রে pom.xML) উভয় জায়গায় একমত হতে হবে (উভয় জায়গায় একই ফাইলটি সরবরাহ করতে আপনি এটি শেল ফাংশনটিতে আবদ্ধ করতে পারেন) বা শেল স্ক্রিপ্ট হিসাবে বাইনারি ডিরেক্টরিতে রেখে দিতে পারেন

কোড:

# gldiff.pl
use strict;

my $max  = shift;
my $file = shift;

die "not a number" unless $max =~ m/\d+/;
die "not a file"   unless -f $file;

my $count;
my @lines;

while (<>) {
    chomp;
    next unless s/^commit\s+(.*)//;
    my $commit = $1;
    push @lines, sprintf "%s:%s", substr($commit,0,6),$file;
    if (@lines == 2) {
        printf "git diff %s %s\n", @lines;
        @lines = ();
    }
    last if ++$count >= $max *2;
}

14

আপনি যদি @ মিপাডি দ্বারা নির্দিষ্ট পদ্ধতি অনুসারে একাধিক ফাইলের সাথে আলাদা করতে চান:

উদাহরণস্বরূপ HEADএবং masterসমস্ত .coffeeফাইল খুঁজে পেতে আপনার মধ্যে :

git diff master..HEAD -- `find your_search_folder/ -name '*.coffee'`

এটি আপনার your_search_folder/সমস্ত .coffeeফাইলের জন্য পুনরাবৃত্তভাবে অনুসন্ধান করবে এবং তাদের এবং তাদের masterসংস্করণগুলির মধ্যে একটি পার্থক্য তৈরি করবে ।


13

আপনার যদি বেশ কয়েকটি ফাইল বা ডিরেক্টরি থাকে এবং অবিচ্ছিন্ন কমিটের তুলনা করতে চান, আপনি এটি করতে পারেন:

একটি অস্থায়ী শাখা তৈরি করুন ( এই উদাহরণে "পুনর্বিবেচনা" )

git checkout -b revision

প্রথম কমিট টার্গেটে রিওয়াইন্ড করুন

git reset --hard <commit_target>

যারা আগ্রহী তাদের উপর চেরী বাছাই করা

git cherry-pick <commit_interested> ...

ডিফ প্রয়োগ করুন

git diff <commit-target>^

যখন আপনি করেছেন

git branch -D revision

2
এই সমাধানের জন্য ধন্যবাদ। এটি আমার ব্যবহারের ক্ষেত্রে ভাল কাজ করেছে। কেবলমাত্র আমি আপডেট করব তা হল এটি করা হয়ে গেলে আপনি শাখাটি সরিয়ে না দেওয়া পর্যন্ত আপনি মুছতে পারবেন না।
স্টিভেন ডিক্স

9

গিটের দুর্দান্ততা ব্যবহারের আরও একটি উপায় ...

git difftool HEAD HEAD@{N} /PATH/FILE.ext

আমি এই উত্তরটি থেকে একটি উপাধি সংজ্ঞায়িত করেছি যা difftool-file = "!git difftool HEAD@{\"$2\"} HEAD \"$1\" #"
ব্যাশের

2

আপনি যদি উইন্ডোজে কোনও সাধারণ ভিজ্যুয়াল তুলনা করতে চান যেমন ভিজ্যুয়াল সোর্সসেফ বা টিম ফাউন্ডেশন সার্ভারে (টিএফএস) পেতে পারেন তবে এটি চেষ্টা করে দেখুন:

  • ফাইল এক্সপ্লোরার ফাইলটিতে ডান ক্লিক করুন
  • 'গিট ইতিহাস' নির্বাচন করুন

দ্রষ্টব্য: উইন্ডোজ 10 এ আপগ্রেড করার পরে আমি গিট প্রসঙ্গ মেনু বিকল্পগুলি হারিয়েছি। তবে আপনি কমান্ড উইন্ডোতে 'গিটক' বা 'গিটক ফাইলনাম' ব্যবহার করে একই জিনিস অর্জন করতে পারেন।

আপনি একবার 'গিট ইতিহাস' কল করলে, গিট জিইউআই সরঞ্জামটি শুরু হবে, উপরের বাম দিকের ফলকের ফাইলটির ইতিহাস নিয়ে। আপনি যে সংস্করণ তুলনা করতে চান তার একটি নির্বাচন করুন। তারপরে দ্বিতীয় সংস্করণে ডান ক্লিক করুন এবং যে কোনও একটি চয়ন করুন

এই পৃথক -> নির্বাচিত

অথবা

ডিফ নির্বাচিত -> এটি

রঙ-কোডেড পার্থক্য নীচের বাম-হাতের ফলকে প্রদর্শিত হবে।


ডাউনওয়োটারদের জন্য নোট: এটি একটি সহজ সমাধান, কার্যকর করা সহজ এবং ওপি'র ইস্যুটিকে সম্বোধন করে। এটি উইন্ডোজে কাজ করে যা ওপি স্পষ্টভাবে ব্যবহার করছে (প্রশ্নে টিএফএস এবং ভিএসএসের উল্লেখ দেখুন)।
রিসোর্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.