মধ্যে কমিট না করে দুটি কমিটের মধ্যে পরিবর্তনগুলি কীভাবে দেখবেন?


641

এর git diffমধ্যে অন্য কমিটগুলি বাদ দিয়ে আপনি কেবলমাত্র দুটি কমিটের মধ্যে পার্থক্য দেখান?


15
"গিট ডিফ" সর্বদা দুটি কমিটের (বা কমিট এবং ওয়ার্কিং ডিরেক্টরি ইত্যাদি) এর মধ্যে পার্থক্য দেখায়।
জাকুব নারেবস্কি

21
@ জাকুবনারাইবস্কি, তিনি জিজ্ঞাসা করছেন যে কীভাবে একটি কমান্ড দ্বারা প্রবর্তিত পরিবর্তন এবং অন্য অঙ্গীকার দ্বারা প্রবর্তিত পরিবর্তনগুলির মধ্যে পার্থক্যটি দেখতে হবে। অন্য কথায়, ভিন্নতা বা ইন্টারডিফের পার্থক্য।
psusi

1
এবং যদি আপনি পৃথক কমান্ডে --dirstat = ফাইলের পরামিতি যুক্ত করেন, আপনি পরিবর্তনের শতাংশের সাথে একত্রে সঠিক প্রকল্প এবং পরিবর্তিত ফাইলগুলির জন্য খুব সুন্দর একটি স্ক্রিনশট নেবেন। এটির মতো: গিট ডিফ [কমিট-সংখ্যা] [কমিট-সংখ্যা] --dirstat = ফাইলগুলি
ফার্নান্ডেজ

উত্তর:


604

আপনি কেবল গিট ডিফার জন্য 2 টি কমিটগুলি পাস করতে পারেন:

-> git diff 0da94be  59ff30c > my.patch
-> git apply my.patch

1
এটি আমার পক্ষে কাজ করেছিল তবে এখন, আমি কীভাবে my.patchঅন্যান্য শাখায় আবেদন করতে পারি ?
nacho4d

2
@ nacho4d: গিট চেকআউট অন্যান্য-শাখা ও& গিট my.patch && গিট অ্যাড প্রয়োগ করুন। অ্যান্ড গিট কমিট-ইম "ম্যাসেজ"
ফেলিক্স রাবে

1
গিট প্রয়োগ বনাম প্যাচ ব্যবহারের সুবিধাটি হ'ল আপনি নাম এবং গিটের সাথে নির্দিষ্ট কিছু অন্যান্য পরিবর্তন অন্তর্ভুক্ত করতে পারেন। আমি গিট ফরম্যাট-প্যাচ এবং গিট am ব্যবহার করতে পছন্দ করি।
রাসেল

58
এই উত্তরটি প্রশ্নের সমাধান করতে পুরোপুরি ব্যর্থ, সুতরাং কেন এটি এত বেশি উপকার করেছে তা আমার কোনও ধারণা নেই। ওপি বিশেষত জিজ্ঞাসা করছে যে আপনি যে প্রথম আদেশটি দিচ্ছেন তা কীভাবে পাবেন না এবং দ্বিতীয়টির কোনও কিছুর সাথে কোনও সম্পর্ক নেই।
psusi

3
এই উত্তরটি কোনও উত্তর দিতে পুরোপুরি ব্যর্থ হয় না। এটি পুরোপুরি কাজ করে। যদি আপনি প্রশ্নে দুটি কমিটের পরে শাখাটি বন্ধ করেন, তবে এই নতুন শাখায় এটির ভিন্নতা প্রয়োগ করুন, আপনি বিরতিহীন কমিটির মাথা ব্যথা ছাড়াই দুটি কমিটের মধ্যে পরিবর্তনগুলি দেখতে পাবেন।
ক্রেগ Labenz

142

মধ্যবর্তী কমিটগুলি অন্তর্ভুক্ত না করে / পার্থক্যের / দু'জনের মধ্যে পার্থক্যের বিষয়ে জিজ্ঞাসা করা কিছুটা অর্থবোধ করে না। কমিটগুলি কেবলমাত্র সংগ্রহস্থলের সামগ্রীর স্ন্যাপশট; দু'জনের মধ্যে পার্থক্যের জন্য জিজ্ঞাসা করা তাদের অবশ্যই অন্তর্ভুক্ত। তাহলে প্রশ্নটি হল, আপনি আসলে কী খুঁজছেন?

উইলিয়ামের পরামর্শ অনুসারে, চেরি-পিকিং আপনাকে অন্যের উপরে একক প্রতিশ্রুতি দেবে। এটাই:

$ git checkout 012345
$ git cherry-pick -n abcdef
$ git diff --cached

এটি 'আবদাদেফ' নেয়, এটি তার পূর্ববর্তী পূর্বের সাথে তুলনা করে, তারপরে '012345' শীর্ষে এই পার্থক্যটি প্রয়োগ করে। এই নতুন পার্থক্যটি তখন প্রদর্শিত হবে - প্রসঙ্গটি 'আবদদেফের তাত্ক্ষণিক পূর্বসূরীর পরিবর্তে' 012345 'থেকে আসে only অবশ্যই, আপনি বিবাদ এবং অন্যান্য পেতে পারেন, তাই এটি বেশিরভাগ ক্ষেত্রে খুব কার্যকর প্রক্রিয়া নয়।

আপনি যদি নিজেকে কেবল আবদেফের প্রতি আগ্রহী হন তবে আপনি এটি করতে পারেন:

$ git log -u -1 abcdef

এটি অ্যাকডেফকে তার তাত্ক্ষণিক পূর্বপুরুষের সাথে একাকী তুলনা করে এবং সাধারণত আপনি যা চান তা হয়।

এবং অবশ্যই

$ git diff 012345..abcdef

আপনাকে এই দুটি কমিটের মধ্যে সমস্ত পার্থক্য দেয়।

আপনি কী অর্জন করতে চাইছেন সে সম্পর্কে আরও ভাল ধারণা পেতে এটি আপনাকে সহায়তা করবে - যেমনটি আমি উল্লেখ করেছি যে, দুটি চুক্তির মধ্যে পার্থক্য জিজ্ঞাসা করার মধ্যে যা কিছু আছে তা আসলে বোঝা যায় না।


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

9
@ ক্রিসক্লিল্যান্ড, সেই ক্ষেত্রে ইন্টারডিফ ইউটিলিটি কার্যকর হতে পারে। তাত্ক্ষণিক পিতামাতার বিরুদ্ধে প্রতিটি প্রতিশ্রুতির ভিন্নতা পেতে গিট ডিফ ব্যবহার করুন, তারপরে ভিন্নতাগুলির সাথে তুলনা করতে ইন্টারডিফ ব্যবহার করুন।
বিডনলান

3
@ ক্রিসক্লিল্যান্ড, গিট প্যাচগুলি সংরক্ষণ করে না। এটি ফাইলের সামগ্রী সংরক্ষণ করে stores এটিতে একটি সংক্ষেপণ স্কিম রয়েছে যা ডেল্টাস ব্যবহার করে তবে ডেল্টা উত্সগুলি অগত্যা ফাইলগুলির প্রকৃত ইতিহাসের সাথে সম্পর্কিত নয়।
বিডনলান

11
তাদের নিজ নিজ শাখায় অন্যান্য কমিট বাদ দিয়ে উভয় চুক্তির মধ্যে পার্থক্যটি সঠিকভাবে বোঝায়: একটি প্রতিশ্রুতি অন্যটি থেকে চেরি নেওয়া হয়েছিল, তবে কিছু সূক্ষ্ম পার্থক্য থাকতে পারে। দুটি শাখার মধ্যে পৃথক যে সমস্ত অপ্রাসঙ্গিক বিড়ম্বনা রয়েছে তার সাথে বিশৃঙ্খলা না করে আপনি কী দেখতে চান তা দেখতে চান।
psusi

2
অথবা বলুন যে আপনি কোনও বৈশিষ্ট্য শাখায় মাস্টারকে রিবাজ করেছেন এবং অবশ্যই বিরোধগুলি সমাধান করবেন। এরপরে তুলনা origin/featurebranch#HEADকরা local/featurebranch#HEADআপনাকে দ্বন্দ্ব-সমাধানের সময় কোনও কিছুকে কুঁকড়ে না তা নিশ্চিত করতে সহায়তা করতে পারে।
lefnire

91

দুটি গিট কমিট 12345 এবং প্যাচ হিসাবে abcdef হিসাবে পৃথক কমান্ড ব্যবহার করতে পারেন

diff <(git show 123456) <(git show abcdef)

8
আপনি গিটের সাথে জিএনইউ পৃথক কেন ব্যবহার করবেন?
OneOfOne

7
@OneOfOne git diff <(git show 123456) <(git show abcdef)কাজ করে না; diff <(...) <(...)আছে। (আমি কেবল এটি চেষ্টা করেছি)।
মেনাচেম

@Menachem git diff 123456 abcdef
ওয়ানঅফনে

15
@ ওনওফোন এটি একই কাজ করে না। আপনি কি তুলনা হবে প্রস্তাবিত গাছ প্রতিটি কমিট, একটি দেখাচ্ছে একক প্যাচ । আমি (এবং @ আপেলক্সস) যা করছি তা দুটি প্যাচের সাথে তুলনা করছি , প্রত্যেকটি পৃথক কমিট দ্বারা প্রবর্তিত হয়েছে - অন্য কথায়, diffদুটি diffএস থেকে আউটপুটকে যুক্ত করে । এর মধ্যে দুটি ইনপুট স্ট্রিম পড়া এবং তুলনা করা জড়িত। diff(জিএনইউ বা ইউনিক্স diff) এটি করতে পারে, যখন git diffপারে না। কেউ কেউ ভাবতে পারেন যে কেউ কেন এটি করতে চায়। আমি এখনই এটি করার মাঝখানে আছি, খারাপ হয়ে যাওয়া একীভূতকরণ পরিষ্কার করছি।
মেনাচেম

1
এতে কি গিট ডিফের সমস্ত মেটাডেটারের gnu ডিফ অন্তর্ভুক্ত করা যাবে না?
joelb

61
git diff <a-commit> <another-commit> path

উদাহরণ:

git diff commit1 commit2 config/routes.rb

এটি সেই কমিটগুলির মধ্যে সেই ফাইলের মধ্যে পার্থক্য দেখায়।


24

সম্পূর্ণ পরিবর্তনগুলি পরীক্ষা করার জন্য:

  git diff <commit_Id_1> <commit_Id_2>

শুধুমাত্র পরিবর্তিত / যুক্ত / মুছে ফেলা ফাইলগুলি পরীক্ষা করার জন্য:

  git diff <commit_Id_1> <commit_Id_2> --name-only

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


20

যাক বলুন আপনার এটি আছে

A
|
B    A0
|    |
C    D
\   /
  |
 ...

এবং আপনি নিশ্চিত করতে চান যে Aএটি একই রকম A0

এটি কৌশলটি করবে:

$ git diff B A > B-A.diff
$ git diff D A0 > D-A0.diff
$ diff B-A.diff D-A0.diff

3
@Plexoos দ্বারা উত্তর হিসাবে ঠিক ওয়ান-লাইনার হিসাবে সংক্ষিপ্তও করা যেতে পারে : diff <(git diff B A) <(git diff D A0)(গিট শোয়ের সাথে একই ফলাফল)
পোগোসামা

14

মনে করুন আপনি 012345 ও abcdef এর মধ্যে পার্থক্য দেখতে চান। নিম্নলিখিত আপনি যা চান তা করা উচিত:

it গিট চেকআউট 012345
it গিট চেরি-পিক-এন অ্যাবসিডিফ
it গিট ডিফ - কেচড

ধন্যবাদ, স্কোয়াশিং কমিট করার পরে আপনার ফলাফলটি পরীক্ষা করা ভাল ধারণা। উদাহরণস্বরূপ আপনি অ-স্কোয়াশড কমিটের সাহায্যে আপনার শাখাটি চেকআউট করতে পারেন এবং চেরি ইন্টার্েক্টিভ রিবেসটির সাথে সবকিছু মসৃণ হয়েছে কিনা তা দেখার জন্য আপনার স্কোয়াশেড কমিট বেছে নিতে পারেন। অতিরিক্ত হিসাবে যখন মাস্টার শাখা এগিয়ে চলেছে।
akostadinov

10

এই সম্পর্কে কি:

git diff abcdef 123456 | less

আপনি যদি উড়তে অনেক ভিন্ন ভিন্নতার তুলনা করতে চান তবে কেবল এটি কম পাইপ করা সহজ।


6

গিট ২.১৯, যেহেতু আপনি সহজভাবে ব্যবহার করতে পারেন:

git range-diff rev1...rev2 - দুটি সাধারণ গাছের তুলনা করুন, তাদের সাধারণ পূর্বপুরুষ দ্বারা শুরু করে

বা git range-diff rev1~..rev1 rev2~..rev2 - প্রদত্ত 2 টি কমিট দ্বারা প্রবর্তিত পরিবর্তনের তুলনা করুন


4

ফাইলগুলিতে আমার aliasসেটিংস এর ~/.bashrcজন্য git diff:

alias gdca='git diff --cached' # diff between your staged file and the last commit
alias gdcc='git diff HEAD{,^}' # diff between your latest two commits

2

ফাইলগুলিতে আমার aliasসেটিংস এর ~/.zshrcজন্য git diff:

alias gdf='git diff HEAD{'^',}' # diff between your recent tow commits

ধন্যবাদ @ জিনমিয়াও লুও


git diff HEAD~2 HEAD

সর্বশেষ 2 য় কমিট এবং বর্তমানের মধ্যে সম্পূর্ণ পরিবর্তন।

HEAD সুবিধাজনক


1

আমি একটি স্ক্রিপ্ট লিখেছিলাম যা দুটি কমিটের মধ্যে আলাদা হয়, উবুন্টুতে ভাল কাজ করে।

https://gist.github.com/jacobabrahamb4/a60624d6274ece7a0bd2d141b53407bc

#!/usr/bin/env python
import sys, subprocess, os

TOOLS = ['bcompare', 'meld']

def getTool():
    for tool in TOOLS:
        try:
            out = subprocess.check_output(['which', tool]).strip()
            if tool in out:
                return tool
        except subprocess.CalledProcessError:
            pass
    return None

def printUsageAndExit():
    print 'Usage: python bdiff.py <project> <commit_one> <commit_two>'
    print 'Example: python bdiff.py <project> 0 1'
    print 'Example: python bdiff.py <project> fhejk7fe d78ewg9we'
    print 'Example: python bdiff.py <project> 0 d78ewg9we'
    sys.exit(0)

def getCommitIds(name, first, second):
    commit1 = None
    commit2 = None
    try:
        first_index = int(first) - 1
        second_index = int(second) - 1
        if int(first) < 0 or int(second) < 0:
            print "Cannot handle negative values: "
            sys.exit(0)
        logs = subprocess.check_output(['git', '-C', name, 'log', '--oneline', '--reverse']).split('\n')
        if first_index >= 0:
            commit1 = logs[first_index].split(' ')[0]
        if second_index >= 0:
            commit2 = logs[second_index].split(' ')[0]
    except ValueError:
        if first != '0':
            commit1 = first
        if second != '0':
            commit2 = second
    return commit1, commit2

def validateCommitIds(name, commit1, commit2):
    if commit1 == None and commit2 == None:
        print "Nothing to do, exit!"
        return False
    try:
        if commit1 != None:
            subprocess.check_output(['git', '-C', name, 'cat-file', '-t', commit1]).strip()
        if commit2 != None:
            subprocess.check_output(['git', '-C', name, 'cat-file', '-t', commit2]).strip()
    except subprocess.CalledProcessError:
        return False
    return True

def cleanup(commit1, commit2):
        subprocess.check_output(['rm', '-rf', '/tmp/'+(commit1 if commit1 != None else '0'), '/tmp/'+(commit2 if commit2 != None else '0')])

def checkoutCommit(name, commit):
    if commit != None:
        subprocess.check_output(['git', 'clone', name, '/tmp/'+commit])
        subprocess.check_output(['git', '-C', '/tmp/'+commit, 'checkout', commit])
    else:
        subprocess.check_output(['mkdir', '/tmp/0'])

def compare(tool, commit1, commit2):
        subprocess.check_output([tool, '/tmp/'+(commit1 if commit1 != None else '0'), '/tmp/'+(commit2 if commit2 != None else '0')])

if __name__=='__main__':
    tool = getTool()
    if tool == None:
        print "No GUI diff tools"
        sys.exit(0)
    if len(sys.argv) != 4:
        printUsageAndExit()

    name, first, second = None, 0, 0
    try:
        name, first, second = sys.argv[1], sys.argv[2], sys.argv[3]
    except IndexError:
        printUsageAndExit()

    commit1, commit2 = getCommitIds(name, first, second)

    if not validateCommitIds(name, commit1, commit2):
        sys.exit(0)

    cleanup(commit1, commit2)
    checkoutCommit(name, commit1)
    checkoutCommit(name, commit2)

    try:
        compare(tool, commit1, commit2)
    except KeyboardInterrupt:
        pass
    finally:
        cleanup(commit1, commit2)
    sys.exit(0)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.