কমিটের মধ্যে পার্থক্য দেখান


236

আমি গিট অন উবুন্টু 10.04 (লুসিড লিংক) ব্যবহার করছি ।

আমি আমার মালিকের কাছে কিছু চুক্তি করেছি।

তবে আমি এই কমিটগুলির মধ্যে পার্থক্য পেতে চাই। তারা সবাই আমার মাস্টার শাখায় রয়েছে।

উদাহরণ স্বরূপ:

commit dj374
made changes

commit y4746
made changes

commit k73ud
made changes

আমি k73ud এবং dj374 এর মধ্যে পার্থক্য পেতে চাই। তবে, আমি যখন নিম্নলিখিতগুলি করেছি তখন আমি যে পরিবর্তনগুলি করেছি তা দেখতে পেলাম না k73ud

git diff k73ud..dj374 > master.patch

উত্তর:


275

চেষ্টা

git diff k73ud^..dj374

k73udফলাফলগুলি মধ্যে সমস্ত পরিবর্তন অন্তর্ভুক্ত নিশ্চিত করার জন্য ।

git diffদুটি সমাপ্তি বিন্দু ( কমিট রেঞ্জের পরিবর্তে ) তুলনা করে । যেহেতু ওপি পরিবর্তন দ্বারা চালু দেখতে চাই k73ud, তিনি / সে পার্থক্য মধ্যে প্রয়োজন প্রথম পিতা বা মাতা এর কমিট k73ud:k73ud^ (অথবা k73ud^1অথবাk73ud~ )।

এই ভাবে, diffফলাফল পরিবর্তনের অন্তর্ভুক্ত করা হবে যেহেতু k73ud পিতা বা মাতা (থেকে পরিবর্তন সহ অর্থ k73udনিজেই), চালু পরিবর্তনের পরিবর্তে যেহেতু k73ud (আপ থেকে dj374)।

এছাড়াও আপনি চেষ্টা করতে পারেন:

git diff oldCommit..newCommit
git diff k73ud..dj374 

এবং (1 স্থান, বেশি নয়):

git diff oldCommit newCommit
git diff k73ud dj374

এবং যদি আপনার কেবল ফাইলের নাম (যেমন হটফিক্সগুলি ম্যানুয়ালভাবে অনুলিপি করা প্রয়োজন) পেতে হয়:

git diff k73ud dj374 --name-only

এবং আপনি পরিবর্তনগুলি অন্য একটি শাখায় প্রয়োগ করতে পারেন:

git diff k73ud dj374 > my.patch
git apply my.patch

5
তুমি কি নিশ্চিত? Git 275e8922ab4e995f47a753b88b75c3027444a54c..a8d9d944c32e945cbb9f60b3f724ecc580da86ae কাজ বিবিধতা কিন্তু Git পরিবর্তন 275e8922ab4e995f47a753b88b75c3027444a54c ^ .. a8d9d944c32e945cbb9f60b3f724ecc580da86ae পেতে ত্রুটি বার্তা - "অজানা সংস্করণ বা পথ কাজ গাছে নয়"
দীমা

@ ডেমাস: আমার মেশিনে কাজ করে;) আপনিও git diff 275e8^ a8d9d9এটি ব্যবহার করতে পারেন যেহেতু এটি তখন একই same ..'
ভোনসি

4
@ ভনসি আমার মেশিনে, to
xi.lin

5
@ ভনসি উবুন্টু ১৪.০৪। কেবল git diff k73ud..dj374ঠিক আছে
xi.lin

1
@ ব্র্যাডিডাউলিং একমত এবং আপনার যদি জনসংযোগ পরিবর্তন দেখতে চাই, তাই আপনাকে কমান্ড লাইনে নতুন করতে পারেন gh: CLI stackoverflow.com/a/62031065/6309
VonC

126

এর মধ্যে পার্থক্যটি দেখতে:

আপনার কাজের অনুলিপি এবং মঞ্চ অঞ্চল:

% git diff

মঞ্চ অঞ্চল এবং সর্বশেষ প্রতিশ্রুতি:

% git diff --staged

আপনার কাজের অনুলিপি এবং 4ac0a6733 প্রতিশ্রুতিবদ্ধ:

% git diff 4ac0a6733

4ac0a6733 এবং সর্বশেষ প্রতিশ্রুতিবদ্ধ প্রতিশ্রুতিবদ্ধ:

% git diff 4ac0a6733 HEAD

4ac0a6733 প্রতিশ্রুতিবদ্ধ এবং 826793951 প্রতিশ্রুতিবদ্ধ

% git diff 4ac0a6733 826793951

আরও ব্যাখ্যার জন্য অফিসিয়াল ডকুমেন্টেশন দেখুন


7
এছাড়াও, যদি আপনি সত্যিই কেবল সেই সমস্ত কমিটগুলির মধ্যে একটি ফাইলের ভিন্নতা দেখতে চান তবে এই উদাহরণগুলির মধ্যে git diff {x} {y} -- filenameকোথায় {x}এবং কোনওটি রয়েছে {y}। এছাড়াও দেখুন git log -p, যেহেতু কিছুটা ওভারল্যাপ রয়েছে।
মাইকেল 25

54

আপনি যদি প্রতিটি প্রতিশ্রুতি দিয়ে প্রবর্তিত পরিবর্তনগুলি দেখতে চান, "গিট লগ-পি" চেষ্টা করুন


13
  1. gitk --all
  2. প্রথম প্রতিশ্রুতি নির্বাচন করুন
  3. অন্যটিতে ডান ক্লিক করুন, তারপরে পৃথক নির্বাচন করুন → এটি

আমি গিটকে একটু কম বিশ্বাস করতে শুরু করছি কারণ এটি আসল চিত্রের চেয়ে আলাদা কমিটর লেখক দেখাচ্ছে।
সিয়াসটো পাইকার্জ

10

আমি gitkপার্থক্যটি দেখতে ব্যবহার করি :

gitk k73ud..dj374

এটিতে একটি জিইউআই মোড রয়েছে যাতে পর্যালোচনা আরও সহজ হয়।


7

দুটি পৃথক কমিটের মধ্যে পার্থক্য দেখতে (আসুন তাদের কল করুন aএবং b) ব্যবহার করুন

git diff a..b
  • মনে রাখবেন যে, এর মধ্যে পার্থক্য aএবং bথেকে বিপরীত bএবং a

আপনার শেষ প্রতিশ্রুতিবদ্ধ এবং এখনও প্রতিশ্রুতিবদ্ধ পরিবর্তনগুলির মধ্যে পার্থক্য দেখতে, ব্যবহার করুন

git diff

আপনি যদি পরে এই পার্থক্যে ফিরে আসতে সক্ষম হতে চান তবে আপনি এটি একটি ফাইলে সংরক্ষণ করতে পারেন।

git diff a..b > ../project.diff

5

সর্বশেষ 2 পরিবর্তনগুলি যাচাইয়ের পরে সবচেয়ে সহজ টান দেওয়ার পরে কমিট করে:

git diff HEAD~2 

3

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

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

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

TOOLS = ['bcompare', 'meld']

def execute(command):
    return subprocess.check_output(command)

def getTool():
    for tool in TOOLS:
        try:
            out = execute(['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 = execute(['git', '-C', name, 'log', '--oneline', '--reverse']).splitlines()
        if first_index >= 0:
            commit1 = logs[first_index].split(' ')[0]
        if second_index >= 0:
            commit2 = logs[second_index].split(' ')[0]
    except ValueError:
        if first is not '0':
            commit1 = first
        if second is not '0':
            commit2 = second
    return commit1, commit2

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

def cleanup(commit1, commit2):
        execute(['rm', '-rf', '/tmp/'+(commit1 if commit1 else '0'), '/tmp/'+(commit2 if commit2 else '0')])

def checkoutCommit(name, commit):
    if commit:
        execute(['git', 'clone', name, '/tmp/'+commit])
        execute(['git', '-C', '/tmp/'+commit, 'checkout', commit])
    else:
        execute(['mkdir', '/tmp/0'])

def compare(tool, commit1, commit2):
        execute([tool, '/tmp/'+(commit1 if commit1 else '0'), '/tmp/'+(commit2 if commit2 else '0')])

if __name__=='__main__':
    tool = getTool()
    if not tool:
        print "No GUI diff tools, install bcompare or meld"
        sys.exit(0)
    if len(sys.argv) is not 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 validateCommitIds(name, commit1, commit2) is False:
        sys.exit(0)

    cleanup(commit1, commit2)

    try:
        checkoutCommit(name, commit1)
        checkoutCommit(name, commit2)
        compare(tool, commit1, commit2)
    except KeyboardInterrupt:
        pass
    finally:
        cleanup(commit1, commit2)
    sys.exit(0)

1
আকর্ষণীয় স্ক্রিপ্ট। +1
ভোনসি

2

গৃহীত উত্তর ভাল।

এটি আবার এখানে রাখুন, যাতে এটি বোঝা সহজ হয় এবং ভবিষ্যতে চেষ্টা করে

git diff c1...c2 > mypatch_1.patch  
git diff c1..c2  > mypatch_2.patch  
git diff c1^..c2 > mypatch_3.patch  

উপরের সমস্ত কমান্ডের জন্য আমি একই রকম পার্থক্য পেয়েছি।

উপরের সাহায্যে
1. কমিট সি 1 এবং অন্য কমিট সি
2 এর মধ্যে পার্থক্য দেখে ২. একটি প্যাচ ফাইল তৈরি করে যা আলাদা দেখায় এবং অন্য শাখায় পরিবর্তন প্রয়োগ করতে ব্যবহৃত হতে পারে

যদি এটি সঠিকভাবে পার্থক্য না দেখায়
তবে সি 1 এবং সি 2 ভুলভাবে নেওয়া যেতে পারে
সি 1 এবং সি 2 কে তাই সি 1 থেকে সি 0 এর মতো প্রতিশ্রুতি দেওয়ার আগে বা সি 2 থেকে সি 3 এর মতো একটিতে সামঞ্জস্য করুন

ব্যবহার gitkকমিট SHAs দেখতে , প্রথম 8 টি অক্ষর সেগুলিকে c0, c1, c2 বা c3 হিসাবে ব্যবহার করার জন্য যথেষ্ট। আপনি গিটল্যাব> সংগ্রহশালা> কমিটস ইত্যাদি থেকে কমিটস আইডিকেও দেখতে পাবেন

আশা করি এইটি কাজ করবে.


0

ধরা যাক আপনার নীচে আরও একটি প্রতিশ্রুতিবদ্ধ (পুরানো), তবে এটি বেশ সহজ হয়ে যায়:

commit dj374
made changes

commit y4746
made changes

commit k73ud
made changes

commit oldestCommit
made changes

এখন, নীচে ব্যবহার করা সহজেই উদ্দেশ্যটি সার্ভার করবে।

git diff k73ud oldestCommit

-2

কমিট এবং স্টেস্টেড না পার্থক্যের জন্য এই কমান্ডটি ব্যবহার করুন:

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