এর পিতামাতার সাথে কোন প্রতিশ্রুতি আলাদা করতে কিভাবে?


460

কোনও নাম বা স্ক্রিপ্ট লেখার পাশাপাশি, কোনও বিশেষ কমিটের জন্য আলাদা করার জন্য একটি সংক্ষিপ্ত আদেশ রয়েছে?

git diff 15dc8^..15dc8

যদি আপনি কেবল একক প্রতিশ্রুতি আইডি দেন git diff 15dc8, তবে হেডের বিরুদ্ধে প্রতিশ্রুতিবদ্ধতার চেয়ে আলাদা।


এটি সম্পর্কে দুর্দান্ত জিনিসটি হ'ল এটি "গিট ডিফ্ট্টোল" এর সাথে কাজ করবে, ডিফগুলি দেখানোর জন্য সরঞ্জামগুলি ব্যবহার করে।
orip

রেফারেন্সের জন্য, এই অন্যান্য প্রশ্নের উত্তরটি বোঝায় যে আপনি কীভাবে উপরেরটি
নিক

উত্তর:


641

ব্যবহার git show $COMMIT। এটি আপনাকে প্রতিশ্রুতি দেওয়ার জন্য লগ বার্তা এবং সেই বিশেষ প্রতিশ্রুতির ভিন্নতা দেখাবে।


45
খুব খারাপ, এটা difftool ব্যবহার করতে পারবেন না :(
orip

1
@ অরিপ আপনি সর্বদা GIT_EXTERNAL_DIFF কোনও স্ক্রিপ্টে সেট করতে পারেন যা আপনার ডিফ্টল হিসাবে একই কাজ করে।
অস্পষ্টতা

7
আমি JakubNarebski এর উত্তর পছন্দ করেন, হিসেবে দেওয়া অভিব্যক্তি কমিট অনেক প্রেক্ষিতে অনেক কাজ করবে: stackoverflow.com/a/449128/992887
RichVel

1
যদি সেখানে ভিন্নতা না দেখানো হয় তবে সম্ভবত কোনও আসল পরিবর্তন হবে না, যেমন মার্জ কমিটের জন্য
ডেভিন জি রোড

6
@ পিটিউইথ: প্রশ্নটি ছিল, "একটি বিশেষ প্রতিশ্রুতি দেওয়ার জন্য পৃথকীকরণের জন্য একটি ছোট কমান্ড আছে কি?", যা এই প্রশ্নের উত্তর দেয়।
মিপাদি

439

ব্যবহার করুন:

git diff 15dc8^!

গিট-রেভ-পার্স (1) ম্যানপেজ ( বা আধুনিক গিট গিটারভিভিশনস (7) ম্যানপেজ ) এর নিম্নলিখিত খণ্ডে বর্ণিত হিসাবে :

একটি সেট নামকরণের জন্য অন্য দুটি শর্টহ্যান্ডস যা একটি প্রতিশ্রুতিবদ্ধ দ্বারা গঠিত এবং এর পিতামাতার অঙ্গীকারগুলি বিদ্যমান। R1 ^ @ স্বরলিপি অর্থ r1 এর সমস্ত পিতামাতাকে। R1 ^! কমিট r1 অন্তর্ভুক্ত করে তবে এর সমস্ত পিতামাতাকে বাদ দেয়।

এর অর্থ হল আপনি ব্যবহার করতে পারেন 15dc8^!জন্য একটি সাঁটে লেখার হিসাবে 15dc8^..15dc8Git যে কোন জায়গায় যেখানে পুনর্বিবেচনা প্রয়োজন হয়। ডিফার্ট কমান্ডের জন্য কম্যান্ডের git diff 15dc8^..15dc8বোঝা যায় git diff 15dc8^ 15dc8, যার অর্থ কমিট ( 15dc8^) এবং কমিট ( 15dc8) এর পিতামাতার মধ্যে পার্থক্য ।

দ্রষ্টব্য : git-rev-parse(1)মানচিত্রের বিবরণটি পুনর্বিবেচনার পরিসীমা সম্পর্কে আলোচনা করে , যেখানে একাধিক পিতামাতার সাথে একত্রীকরণের জন্যও এটির কাজ করা প্রয়োজন। তারপরে r1^!" r1 --not r1^@" অর্থাৎ " r1 ^r1^1 ^r1^2 ..."


এছাড়াও, আপনি git show COMMITকমিটের বিবরণ পেতে এবং কমিটের জন্য আলাদা করতে ব্যবহার করতে পারেন । আপনি যদি কেবল ভিন্নতা চান তবে আপনি ব্যবহার করতে পারেনgit diff-tree -p COMMIT


7
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত, এটি অনেক পরিষ্কার। যাইহোক, গিট-রেভ-পার্স এক্সট্রাক্টের শেষ বাক্যটি বরং বিভ্রান্তিকর - মনে হচ্ছে এটির অর্থ 'এই প্রতিশ্রুতিবদ্ধদের পিতামাতার থেকে শুরু করে এই প্রতিশ্রুতি পর্যন্ত রেঞ্জ'।
রিচভেল

1
@ রিচভেল: এটি কিছুটা বিভ্রান্তিকর কারণ এটি কমিটের একাধিক পিতামাতার যে পরিস্থিতি রয়েছে তা বর্ণনা করার চেষ্টা করে (এটি একটি মার্জ কমিট)। R1 ^! প্রত্যাশার পরেও কাজ করে।
জাকুব নরবস্কি

@ জাকুবনারাইবস্কি: ভাল কথা, একক পিতা-মাতা এবং বহু-পিতামাতার ক্ষেত্রে আপনার বোঝার সংক্ষিপ্তসার হিসাবে আপনি নিজের উত্তরটি সম্পাদনা করতে পারেন - প্রতিটি বিষয়ে পৃথক বিবৃতি বুঝতে সহজতর হতে পারে।
রিচভেল

1
@ জাকুবনারাইবস্কি: হ্যাঁ, আরও ভাল! আমি এখন এই শর্টকাটটি সর্বদা ব্যবহার করি - ধন্যবাদ।
রিচভেল

1
^!পিতা বা মাতা সাঁটে লেখার স্বরলিপি স্বাভাবিক করে জন্য difftool সাথে যথাযথভাবে কাজ করে কিন্তু পরিবর্তন একত্রীকরণ করে জন্য বিপরীত। কেন এমন?
hIpPy

56

যদি আপনি কতটা পিছন থেকে জানেন তবে আপনি এর মতো কিছু চেষ্টা করতে পারেন:

# Current branch vs. parent
git diff HEAD^ HEAD

# Current branch, diff between commits 2 and 3 times back
git diff HEAD~3 HEAD~2

পূর্বে এইরকম কিছু কাজের প্রতিশ্রুতিবদ্ধ:

# Parent of HEAD
git show HEAD^1

# Grandparent
git show HEAD^2

কমিটগুলি নির্দিষ্ট করতে পারেন এমন অনেকগুলি উপায় রয়েছে:

# Great grandparent
git show HEAD~3

বিশদ জন্য এই পৃষ্ঠা দেখুন ।


2
হেড ^ 2 পিতামহ নয়, যদি হেড ^ 1 বাবা হয়, তবে হেড ^ 2 মায়ের হয় my বাবার বাবার জন্য হেড ~ 2 ব্যবহার করুন।
বাইনারি

11

@ মিপাদি যেমন উল্লেখ করেছেন, আপনি ব্যবহার করতে পারেন git show $COMMITতবে এটি কিছু শিরোনাম এবং প্রতিশ্রুতি বার্তাও দেখায়। আপনি যদি একটি সরাসরি পার্থক্য চান, ব্যবহার করুন git show --pretty=format:%b $COMMIT

এটি স্পষ্টতই খুব ছোট হাত নয়, তাই আমি এই উপনামটি আমার .gitconfig এ রাখছি

    [alias]
      sd = show --pretty=format:%b

এটি আমার ব্যবহার করতে সক্ষম git sd $COMMITকরার জন্য পরিবর্তন দেন


1
এই উপনামটিতে --color অন্তর্ভুক্ত থাকতে পারে যা পড়া সহজ করে তোলে: sd = শো
রঙ

পছন্দ করুন খুব ভাল পয়েন্ট। আপনি যদি গিটটিতে ডিফল্টরূপে রঙগুলি সক্ষম করে থাকেন তবে আপনার এই স্যুইচটির প্রয়োজন হবে না। আমি সাধারণত এটিই করি।
ইস্টিন স্টিমলার

5

উল্লিখিত উদাহরণগুলির মধ্যে অনেকগুলি (উদাহরণস্বরূপ git diff 15dc8^!, বা git diff 15dc8^..15dc8) আপনি zsh ব্যবহার করছেন এবং extendedglobবিকল্প সেট রেখে কাজ করেন না। আপনি নিম্নলিখিত তিনটি পদ্ধতির একটি দ্বারা এটি ঠিক করতে পারেন:

  1. unsetopt extendedglob (এবং / অথবা এটি .zshrc থেকে সরান)

  2. setopt NO_NOMATCH (এবং / অথবা এটিকে .zshrc এ সেট করুন)

  3. ক্যারেট থেকে বেরিয়ে আসুন এবং প্রতিবার ব্যাকস্ল্যাশ দিয়ে ঠুং শব্দ করুন git diff 15dc8\^\!



2

উপরের পলের সমাধান আমি যা আশা করছিলাম তা করেছিল did

$ git diff HEAD^1

এছাড়াও, উল্লেখ করা শখগুলির মতো উপকরণ যুক্ত করা দরকারী, যদি আপনি নিম্নলিখিতটি আপনার alias / .gitconfig ফাইলের [عرف] বিভাগে রাখেন তবে আপনি মাথা এবং পূর্বের মধ্যে পার্থক্য দেখতে সংক্ষিপ্ত হাত ব্যবহার করতে পারেন।

[alias]
    diff-last = diff HEAD^1

তারপরে it গিট ডিফ-লাস্ট চালানো আপনাকে আপনার ফলাফল এনে দেবে। নোট করুন যে এর মধ্যে এমন কোনও পরিবর্তন অন্তর্ভুক্ত থাকবে যা আপনি এখনও প্রতিশ্রুতিবদ্ধ হননি এবং পাশাপাশি কমিটগুলির মধ্যে পার্থক্যও অন্তর্ভুক্ত করবেন। আপনি যদি এখনও প্রতিশ্রুতিবদ্ধ না এমন পরিবর্তনগুলি উপেক্ষা করতে চান , তবে আপনি সরাসরি তার পিতামাতার সাথে হেডের তুলনা করতে ডিফ ব্যবহার করতে পারেন:

$ git diff HEAD^1 HEAD

0

উপকরণ ব্যবহার করে, তাই আপনার প্রশ্নের সঠিক উত্তর দেয় না তবে আপনি যা চান তা করার জন্য আমি এগুলি দরকারী বলে মনে করি ...

alias gitdiff-1="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 2|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git diff"
alias gitdiff-2="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 3|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git diff"
alias gitdiff-3="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 4|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git diff"

alias gitlog-1="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 2|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git log --summary"
alias gitlog-2="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 3|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git log --summary"
alias gitlog-3="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 4|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git log --summary"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.