প্রতিটি পরিবর্তিত ফাইল পিতা-মাতার একজনের সাথে একমত হওয়ার পরেও কীভাবে "গিট শো" সংযুক্ত ডিফের আউটপুটটির সাথে একীভূত প্রতিশ্রুতি করবেন?


184

একটি "সরল" একত্রিত করার পরে (কোনও দ্বন্দ্ব ছাড়াই), git showসাধারণত কেবল এমন কিছু দেখায়

commit 0e1329e551a5700614a2a34d8101e92fd9f2cad6 (HEAD, master)
Merge: fc17405 ee2de56
Author: Tilman Vogel <email@email>
Date:   Tue Feb 22 00:27:17 2011 +0100

Merge branch 'testing' into master

এটি কারণ, মার্জগুলির জন্য, git showসম্মিলিত পৃথক ফর্ম্যাটটি ব্যবহার করে যা কোনও ফাইলকে বাদ দেয় যা মূল সংস্করণগুলির সাথে একমত হয়।

সম্মিলিত ডিফ মোডে সমস্ত পার্থক্য এখনও দেখানোর জন্য গিটকে বাধ্য করার কোনও উপায় আছে?

করা git show -mপার্থক্যটি প্রদর্শন করবে (নতুন এবং সমস্ত মূল সংস্করণগুলির মধ্যে যথাক্রমে যুগলভাবে পৃথক পৃথক ব্যবহার করে) তবে আমি সম্মতিযুক্ত মোডের মতো সম্পর্কিত কলামগুলিতে +/- দ্বারা চিহ্নিত পার্থক্যগুলির সাথে থাকতে পছন্দ করব।


1
@ টিলম্যান ভোগেল: দয়া করে গৃহীত উত্তরটি পর্যালোচনা করুন - দেখে মনে হচ্ছে আরও ভাল উত্তর আছে
জয়ান

1
@ জায়ান অন্য উত্তরগুলি আরও জনপ্রিয় বলে এগুলিতে দরকারী ইঙ্গিত রয়েছে, তবে তারা আসলে আমার দ্বিধা দ্বিধাবিভক্ত করার কারণে আমার সমস্যার সাথে ঘনিষ্ঠ হয় না। আমি ত্রি-মুখের পার্থক্যের সন্ধান করছিলাম।
তিলম্যান ভোগেল

উত্তর:


-3

না, এটি করার কোনও উপায় নেই git show। তবে এটি অবশ্যই কখনও কখনও দুর্দান্ত হবে, এবং সম্ভবত গিট সোর্স কোডে এটি প্রয়োগ করা তুলনামূলকভাবে সহজ হবে (সর্বোপরি, আপনাকে কেবল এটি বাহ্যিক আউটপুট বলে যা মনে করেন তা ছাঁটাই না করার জন্য এটি বলতে হবে ), তাই প্যাচটি এটি করতে হবে সম্ভবত গিট রক্ষণাবেক্ষণকারীদের দ্বারা গ্রহণ করা হবে।

আপনি যা চান তা যত্নবান হন; তিন মাস আগে কাঁটাযুক্ত এক-লাইন পরিবর্তনের সাথে একটি শাখা মার্জ করাতে মূল লাইনটি বনাম এখনও একটি বিশাল পার্থক্য থাকবে এবং সুতরাং এইরকম একটি সম্পূর্ণ পার্থক্য প্রায় সম্পূর্ণ অপ্রয়োজনীয় হবে। তাই গিট এটি দেখায় না।


12
এটি সম্ভব হিসাবে স্পষ্টভাবে "এটি করার কোনও উপায়" বলবেন না - অন্যান্য উত্তর দেখুন। এটি বলতে খুব বিভ্রান্তিকর।
কেগ্রাডেক

1
গিট শো হেড HE ... হেড; # হিচাম_ইই এর সমাধান # প্রতি #
মাইকেল ডিম্মিট 18

গিট শো হেড ~ 1 ... হেড ~ 0 - নাম-কেবল; # আরও ভাল সিনট্যাক্স। জনসংযোগ পুনরাবৃত্তি জন্য।
মাইকেল ডিম্মিট

255

প্রতিশ্রুতি বার্তা দেখুন:

commit 0e1329e551a5700614a2a34d8101e92fd9f2cad6 (HEAD, master)
Merge: fc17405 ee2de56
Author: Tilman Vogel <email@email>
Date:   Tue Feb 22 00:27:17 2011 +0100

Merge branch 'testing' into master

লাইনটি লক্ষ্য করুন:

Merge: fc17405 ee2de56

এই দুটি প্রতিশ্রুতিবদ্ধ আইডির নিন এবং তাদের বিপরীত করুন। যাতে আপনি চান তার ভিন্নতা পেতে যাতে আপনি তা করতে পারেন:

git diff ee2de56..fc17405

পরিবর্তিত ফাইলগুলির নামগুলি দেখানোর জন্য:

git diff --name-only ee2de56..fc17405

এবং এগুলি বের করার জন্য, আপনি এটি আপনার গিটকনফাইগে যুক্ত করতে পারেন:

exportfiles = !sh -c 'git diff $0 --name-only | "while read files; do mkdir -p \"$1/$(dirname $files)\"; cp -vf $files $1/$(dirname $files); done"'

তারপরে এটি ব্যবহার করে:

git exportfiles ee2de56..fc17405 /c/temp/myproject

পরামর্শের জন্য ধন্যবাদ তবে আমি মনে করি এটি আমার সমস্যার সমাধান করে না। সীমিত মন্তব্য মার্কআপ এবং ফর্ম্যাটের কারণে আমি আপনার মন্তব্যে আমার মন্তব্য যুক্ত করেছি। তার জন্য দুঃখিত! দৃশ্যমান হওয়া অবধি পীর-পর্যালোচনা করা দরকার।
টিলম্যান ভোগেল

6
দেখে মনে হচ্ছে, আমার সম্পাদনাটি অস্বীকার করা হয়েছিল। সংক্ষেপে: আপনার শাখাটি কোন শাখা থেকে কোন সংযোজন আসে তা দেখায় না। এবং আপনি পরিবর্তন করতে পারবেন না যে পরিবর্তনগুলি দ্বিতীয়টিতে যুক্ত হয়েছিল বা প্রথম শাখায় সরানো হয়েছিল।
তিলমান ভোগেল

45
আরও ভাল সমাধান হ'ল git diff fc17405...ee2de56- এটি fc17405 এর কমিটগুলি থেকে আগত ee2de56 এর সমস্ত পরিবর্তন দেখাবে, যা আমি বিশ্বাস করি আপনি যা চান তা। দুটি পরিবর্তে 3 টি বিন্দু নোট করুন।
ক্রিস নুটিকম্বে

1
@ ক্রিসনটিটি কমবে 3 টি বিন্দু এবং ক্রম। এবং আপনার মন্তব্যটি আমি যা খুঁজছিলাম, যা আমি মনে করি ওপি যা চেয়েছিল তার চেয়ে বেশি।
ইজকাটা

@KrisNuttycombe এই একরকম নয় কাজ করে git log, যা এখনও মত, সব করে দেখায় ..বৈকল্পিক। ..এবং ...একই জন্য log, কিন্তু diffতারা পৃথক !? এই শাখায় একীভূত প্রতিশ্রুতিগুলির তালিকা কীভাবে পাব?
রুডি

77

আরও ভাল সমাধান (@ ক্রিস নটটিকম্ব উল্লেখ করেছেন):

git diff fc17405...ee2de56

মার্জ কমিটের জন্য:

commit 0e1329e551a5700614a2a34d8101e92fd9f2cad6 (HEAD, master)
Merge: fc17405 ee2de56
Author: Tilman Vogel <email@email>
Date:   Tue Feb 22 00:27:17 2011 +0100

পরিবর্তন সব দেখানোর জন্য ee2de56যে করে থেকে পৌঁছানো হয় fc17405। প্রতিশ্রুতিবদ্ধ হ্যাশগুলির ক্রম নোট করুন - এটি মার্জ তথ্য হিসাবে দেখানো মত একই:Merge: fc17405 ee2de56

এছাড়াও ...দুটি পরিবর্তে 3 টি বিন্দু নোট করুন !

পরিবর্তিত ফাইলগুলির তালিকার জন্য আপনি ব্যবহার করতে পারেন:

git diff fc17405...ee2de56 --name-only

আমি +1 এর পরে ঠিক এটাই ছিল।
geedoubleya

এটি আসলে মার্জ সংঘাতের ফলাফল দেখায়, অন্য উত্তরগুলি দেয় না।
পোড

12

আপনি মার্জ হওয়ার আগে একটি কমিটে HEAD সেট করে শাখা তৈরি করতে পারেন। তারপরে, আপনি এটি করতে পারেন:

git merge --squash testing

এটি একীভূত হবে, তবে প্রতিশ্রুতিবদ্ধ হবে না। তারপর:

git diff

5

এখানে উত্তর দেওয়া মত মনে হচ্ছে: https://public-inbox.org/git/7vd392ezhx.fsf@alter.siamese.dyndns.org/

সুতরাং একইভাবে, চলমান

it গিট ডিফ

একটি সম্মিলিত প্যাচ দেখানো উচিত যা তার পিতামাতার এবং সংযুক্তির ভিত্তিতে রেকর্ড হওয়া রাজ্যের তুলনায় $ M তে রাজ্যকে ব্যাখ্যা করে।


আপনি কি জানেন যে কোনও সরঞ্জাম পাশাপাশি পার্শ্ববর্তী উপায়ে, যেমন কয়েকটি কলামে (যেমন IntelliJ মার্জ সংঘাতের রেজোলিউশন উইন্ডোতে) কনফারিজ করা যেতে পারে? আপনার উত্তরটি অবশ্যই আমি খুঁজছিলাম
ম্যাক্স

@ ম্যাক্স না আমি ভয় করি না আমি করি না। "এন-ওয়ে ভিজ্যুয়াল ডিফ" গুগলিং কিছু লিঙ্ক সরবরাহ করে, তাই আমি সেগুলি চেষ্টা করেছিলাম।
সর্বাধিক 630

4

আমি মনে করি আপনার কেবল 'গিট শো -c $ রেফ' দরকার। A8e4a59 এ গিট সংগ্রহস্থলটিতে এটি ব্যবহার করা একটি সম্মিলিত ডিফ দেখায় (2 কলামের মধ্যে একটিতে প্লাস / বিয়োগ চরগুলি)। গিট-শো ম্যানুয়াল হিসাবে উল্লেখ করা হয়েছে, এটি 'গিট ডিফ-ট্রি'-তে বেশিরভাগ প্রতিনিধিত্ব করে যাতে এই বিকল্পগুলি কার্যকর দেখায়।


3
না, একটি "সরল" মার্জারের জন্য, git show -c $refআমি উদ্ধৃত হিসাবে একই আউটপুট দেখায়, অর্থাত্ কোনও পার্থক্য নেই। -c'- সিসি', যা দেখুন git help showএবং দেখুন একত্রিত করার জন্য ডিফল্ট মোডের অনুরূপ একটি সংযুক্ত ডিফ মোড নির্বাচন করে git help diff-tree। উভয়ই সেই ফাইলটির মূল সংস্করণগুলির সাথে একমত হওয়া ফাইলগুলি পুরোপুরি বাদ দেয়।
তিলমান ভোগেল

a8e4a59প্রকৃতপক্ষে মার্জ কমিটের বিভাগে আসে না, আমি বলতে চাইছি। এই মার্জ কমিটটিতে প্রকৃতপক্ষে একটি ফাইল রয়েছে যা এর মূল সংস্করণ উভয় থেকে পৃথক। Documentation/git-fast-import.txtএকটি পিতা বা মাতার কাছ থেকে কিছু জিনিস যুক্ত হয়েছে some এর ফলে খালি খালি আউটপুট দেয় git diff-tree --cc। তবে, এই "বিরোধী" মামলার পরিবর্তনগুলি কেবলমাত্র দেখানো হয়েছে। সমস্ত "পরিষ্কার" মার্জ ফলাফল, দেখুন git show -m a8e4a59, মোটেও প্রদর্শিত হয় না।
টিলম্যান ভোগেল

1
@ টিলম্যানভোগেল: আউটপুটটির বাইরে থাকা "অবিবেচিত" ফাইল একীভূত করে তুলে ধরার জন্য ধন্যবাদ git show -c। (এটি man git-diff-treeকি বলে যে "এটি কেবলমাত্র সেই সমস্ত ফাইলের তালিকা দেয় যা সমস্ত পিতা-মাতার কাছ থেকে পরিবর্তিত হয়েছিল" "তবে আমি অবশ্যই এটি খুঁজে পাইনি))
পল হুইটেকার

3

আপনার ক্ষেত্রে আপনার শুধু প্রয়োজন

git diff HEAD^ HEAD^2

বা আপনার প্রতিশ্রুতিবদ্ধ হওয়ার জন্য কেবল হ্যাশ:

git diff 0e1329e55^ 0e1329e55^2

4
না, এটি কেবলমাত্র দুটি পিতা-মাতার মধ্যে দ্বি-পথের পার্থক্য করে। আমি কি জন্য জিজ্ঞাসা ছিল একটি মোড আছে যেগুলো একই সঙ্গে মধ্যে পরিবর্তন দেখায় ছিল git merge-base HEAD^ HEAD^2এবং HEAD^এবং HEAD^2একই স্টাইল ফাইল বিবাদের সঙ্গে মিশে গিয়ে তৈরি সেটা সম্পন্ন করা হয় হবে।
টিলম্যান ভোগেল

3

যদি আপনার মার্জ প্রতিশ্রুতি উপরের মত 0e1329e5 প্রতিশ্রুতিবদ্ধ হয় তবে আপনি এই মার্জটিতে অন্তর্ভুক্ত থাকা ভিন্নতা পেতে পারেন:

git diff 0e1329e5^..0e1329e5

আশা করি এটা কাজে লাগবে!


3

আপনি যদি একীভূত প্রতিশ্রুতিতে বসে থাকেন তবে এটি বিভিন্নতা দেখায়:

git diff HEAD~1..HEAD

আপনি যদি মার্জ কমিটে না থাকেন তবে কেবলমাত্র মার্চ কমিটের সাথে হেডকে প্রতিস্থাপন করুন। এই পদ্ধতিটি সহজ এবং স্বজ্ঞাত হিসাবে মনে হচ্ছে।


1
এটি "সংযুক্ত ডিফ" আউটপুট নয়। পিতা-মাতার এবং জুটির প্রতিটি জুটির মধ্যে পার্থক্য পাওয়া এখানে সমস্যা নয়।
তিলম্যান ভোগেল

2

আপনি -c পতাকা সহ ডিফ-ট্রি কমান্ড ব্যবহার করতে পারেন। এই কমান্ডটি আপনাকে দেখায় যে মার্জ কমিটে কোন ফাইলগুলি পরিবর্তন হয়েছে changed

git diff-tree -c {merged_commit_sha}

গিট-স্কেম থেকে আমি -c পতাকাটির বর্ণনা পেয়েছি :

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


2
এই বিষয়টিতে একটি ভাল নিবন্ধের মতো দেখাচ্ছে: haacked.com/archive/2014/02/21/reviewing- विसর- কমিট এবং সম্ভবত এটিও: longair.net/blog/2009/04/16/git-fetch-and- विसর
ডেভিন জি রোড

1

আমি একত্রীকরণের কমিটিতে বিভিন্ন ক্রিয়াকলাপ করার জন্য একটি সাধারণ-উদ্দেশ্য পদ্ধতি তৈরি করেছি।

প্রথম ধাপ : সম্পাদনা করে গিটে একটি উপনাম যুক্ত করুন ~/.gitconfig:

[alias]
  range = "!. ~/.githelpers && run_on_merge_range"

দ্বিতীয় ধাপ : ইন ~/.githelpers, একটি বাশ ফাংশন সংজ্ঞায়িত করুন:

run_on_merge_range() {
  cmd=$1; shift
  commit=$1; shift
  range=$(git show $commit | grep Merge: | awk '{print $2 "..." $3}')
  echo "git $cmd $range $@"
  if [ -z $range ]; then
    echo "No merge detected"
    exit 1
  fi
  git $cmd $range $@
}

তৃতীয় ধাপ : লাভ!

git range log <merge SHA> --oneline
git range diff <merge SHA> --reverse -p
git range diff <merge SHA> --name-only

উন্নতির জন্য এখানে সম্ভবত প্রচুর জায়গা রয়েছে, একটি বিরক্তিকর পরিস্থিতি পেরিয়ে যাওয়ার জন্য আমি কেবল এটি একসাথে চাবুক দিয়েছি। আমার বাশ সিনট্যাক্স এবং / বা যুক্তি নির্দ্বিধায় নির্দ্বিধায়।


মনে রাখবেন আপনি উপর নির্ভর করে "awk" বিট মধ্যে ".." পরিবর্তন করতে পারেন "...", আপনি কি প্রয়োজন এবং কি কমান্ড চালাচ্ছেন: stackoverflow.com/questions/462974/...
Nerdmaster
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.