दो रिपॉजिटरी के बीच अंतर प्राप्त करना


184

हम दो गिट रिपॉजिटरी के बीच अंतर कैसे प्राप्त कर सकते हैं?

परिदृश्य: हमारे पास एक repo_a और repo_b है। उत्तरार्द्ध repo_a की एक प्रति के रूप में बनाया गया था। बाद में दोनों रिपॉजिटरी में समानांतर विकास हुआ है। क्या कोई तरीका है जिससे हम इन दो रिपॉजिटरी के वर्तमान संस्करणों के अंतर को सूचीबद्ध कर सकते हैं?


जवाबों:


250

रेपो_ए में:

git remote add -f b path/to/repo_b.git
git remote update
git diff master remotes/b/master
git remote rm b

3
क्या होगा यदि आपको repo_a / मास्टर को repo_b के विशिष्ट टैग से तुलना करने की आवश्यकता है?
डेविड टोरेस

2
मेरे लिए काम नहीं कर रहा है, यह फेंक रहा है: घातक: अस्पष्ट तर्क 'रिमोट / बी / मास्टर': अज्ञात संशोधन या काम करने वाले पेड़ में नहीं। संशोधनों से पथों को अलग करने के लिए '-' का प्रयोग करें, जैसे: 'git <कमांड> [<revision> ...] - [<file> ...]' यहाँ कोई विचार?
एंड्रयू हीकिन

2
मैं @AndrewHeekin जैसा ही हूं। क्या किसी के पास एक समाधान है?
संसद

4
मुझे origin/masterनंगे के बजाय निर्दिष्ट करने की आवश्यकता है master। इसके अलावा, यह मास्टर शाखाओं के बीच अंतर पाता है, इसलिए यदि आप सभी शाखाओं को अलग-अलग खोजना चाहते हैं तो क्या होगा? उदाहरण के लिए एक रिपॉजिटरी बैकअप की स्थिति की जांच करने के लिए?
davidA

1
क्या आप बता सकते हैं कि हर लाइन क्या कर रही है? धन्यवाद !
एनरिक

34

Meld निर्देशिकाओं की तुलना कर सकते हैं:

meld directory1 directory2

बस दो गिट रेपो की निर्देशिका का उपयोग करें और आपको एक अच्छी चित्रमय तुलना मिलेगी:

यहां छवि विवरण दर्ज करें

जब आप नीले आइटमों में से एक पर क्लिक करते हैं, तो आप देख सकते हैं कि क्या बदल गया है।


1
मेरे वीएस समाधान में परियोजनाओं की तुलना करते समय मेल्ड फ़्रीज हो जाता है, बियोंडकॉमफ़ायर नहीं है।
साशा बॉन्ड

4
OSX में: -rq folder1 folder2
Mark

1
अद्भुत लिंक! बहुत ही सरल कार्यक्रम, मैं अब इसे ओएसएक्स के लिए मेरे अलग कार्यक्रम के रूप में उपयोग कर रहा हूं।
dmanexe

1
यह बिल्कुल प्यारा है! साझा करने के लिए धन्यवाद।
शिहाब खान

मुझे यकीन नहीं है कि अगर git द्वारा अनदेखी की गई फ़ाइलों को संभालने में meld सक्षम है - तो आपको इसका उपयोग करते समय इस पर विचार करना चाहिए
noamgot

11

आप अपने वर्तमान रेपो में रिमोट के रूप में पहले अन्य रेपो जोड़ सकते हैं:

git remote add other_name PATH_TO_OTHER_REPO

फिर उस रिमोट से ब्राच लाएँ:

git fetch other_name branch_name:branch_name

यह आपके वर्तमान रेपो में एक नई शाखा के रूप में उस शाखा का निर्माण करता है, फिर आप उस शाखा को अपनी किसी भी शाखा के साथ अलग कर सकते हैं, उदाहरण के लिए, नई शाखा (Branch_name) के विरुद्ध वर्तमान शाखा की तुलना करने के लिए:

git diff branch_name

8

एक बार जब आपके पास एक रिपॉजिटरी में दोनों शाखाएं होती हैं, तो आप कर सकते हैं git diff। और उन्हें एक भंडार में प्राप्त करना उतना ही आसान है जितना कि

git fetch /the/other/repo/.git refs/heads/*:refs/remotes/other/*

क्या इतिहास को थोड़ा बदलाव के साथ चेरी-पिक करने का एक तरीका है: उदाहरण के लिए रिमोट रेपो फ़ाइल को एक निर्देशिका में रखा गया है, लेकिन मैं उसी फ़ाइल में परिवर्तन लागू करना चाहता हूं लेकिन जिसे स्थानीय रेपो में अलग निर्देशिका में रखा गया है?
यूजेन कोनकोव

यदि आप एक छोटे से बदलाव के बारे में बात कर रहे हैं, तो मुझे लगता है कि सबसे आसान होगा कि आप केवल एक बदलाव करें और फिर इसे पैच का उपयोग करके दूसरी फ़ाइल पर दोबारा लागू करें।
माइकल क्रेलिन -

पैच एक ही फाइल के बावजूद अलग-अलग फ़ाइल नामों के कारण लागू नहीं होते हैं
यूजेन कोनकोव

ओह, मैं केवल विभिन्न निर्देशिकाओं के बारे में सोच रहा था, न कि फ़ाइल नाम (निर्देशिकाओं को पैच विकल्पों के माध्यम से आसानी से संभाला जा सकता है)। खैर, फ़ाइल नाम के लिए मैं उन्हें मैन्युअल रूप से या स्क्रिप्ट के माध्यम से बदलूंगा। उस ने कहा, मैं यह नहीं कह रहा हूं कि कोई बेहतर उपाय नहीं है, बस मैं कहीं भी खुदाई किए बिना आ सकता हूं।
माइकल क्रेलिन - हैकर

क्या होगा अगर मैं सभी शाखाओं की तुलना करना चाहता हूं, हालांकि?
एंडोलिथ

7
git diff master remotes/b

यह गलत है। remotes/bरिमोट है, लेकिन ब्रांच नहीं है।

इसे काम करने के लिए, मुझे करना पड़ा:

git diff master remotes/b/master

2
यह वास्तव में प्रासंगिक उत्तर पर एक टिप्पणी होनी चाहिए।
EntangledLoops

6

Http://git.or.cz/gitwiki/GitTips , "सामान्य" में "दो स्थानीय रिपॉजिटरी की तुलना कैसे करें" अनुभाग देखें ।

संक्षेप में, आप GIT_ALTERNATE_OBJECT_DIRECTORIES पर्यावरण चर का उपयोग अन्य रिपॉजिटरी के ऑब्जेक्ट डेटाबेस तक पहुंच के लिए कर रहे हैं, और SHA-1 पहचानकर्ता के लिए अन्य रिपॉजिटरी में प्रतीकात्मक नाम बदलने के लिए / GIT_DIR के साथ git Rev-parse का उपयोग कर रहे हैं --git-dir

आधुनिक संस्करण कुछ इस तरह दिखाई देगा (यह मानते हुए कि आप 'रेपो_ए' में हैं):

GIT_ALTERNATE_OBJECT_DIRECTORIES = .. / repo_b / .git / ऑब्जेक्ट्स
   git $ $ (git --git-dir = .. / repo_b / .it Rev-parse - HEAD HEAD पढ़ें

../repo_b/.gitrepo_b में ऑब्जेक्ट डेटाबेस के लिए रास्ता कहाँ है (यदि यह नंगे रिपॉजिटरी था तो repo_b.it होगा)। बेशक आप मनमाने संस्करणों की तुलना कर सकते हैं, न केवल HEADs की।


ध्यान दें कि यदि repo_a और repo_b एक ही रिपॉजिटरी हैं, तो उन दोनों को एक ही रिपॉजिटरी में रखने के लिए अधिक समझदारी हो सकती है, या तो git remote add -f ...बार-बार अपडेट के लिए रिपॉजिटरी के लिए उपनाम (s) बनाने के लिए " " का उपयोग कर सकते हैं , या "बंद git fetch ..." कर सकते हैं; जैसा कि अन्य प्रतिक्रियाओं में वर्णित है।


5

मैं PyCharm का उपयोग करता हूं जिसमें फ़ोल्डर्स और फ़ाइलों के बीच तुलना करने की बहुत अच्छी क्षमता है।

बस रेपो के लिए मूल फ़ोल्डर खोलें और जब तक यह अनुक्रमित न हो जाए, प्रतीक्षा करें। तब आप किसी फोल्डर या फाइल पर राइट क्लिक का उपयोग कर सकते हैं औरCompare to... दूसरी ओर संबंधित फ़ोल्डर / फ़ाइल को चुन सकते हैं।

यह दिखाता है कि न केवल फाइलें अलग हैं, बल्कि उनकी सामग्री भी है। कमांड लाइन की तुलना में बहुत आसान है।


2

आपकी सबसे अच्छी शर्त यह है कि आप अपने स्थानीय मशीन पर दोनों रिपॉजिट करें और मापदंडों के रूप में दो निर्देशिकाओं के साथ linux diff कमांड का उपयोग करें:

diff -r repo-A repo-B


2
यह प्रयोग करने योग्य बनाने का एकमात्र तरीका .गित निर्देशिकाओं में से एक का नाम बदलना है। इससे मतभेदों की दो पंक्तियों वाले पृष्ठों में कमी आती है जो मायने नहीं रखते। वहाँ किया गया, जो किया गया, यहाँ एक बेहतर जवाब की तलाश में आया था।
hildred

2

ऐसा करने का एक आसान तरीका है कि आपके रिमोट को स्पर्श किए बिना। रेपो ए से, मास्टर में (मान लें कि आप मास्टर शाखाओं की तुलना करना चाहते हैं):

git fetch path/to/repo_b.git master
git diff FETCH_HEAD

0

आप निम्न आदेश का उपयोग कर सकते हैं:

diff -x .git -r repo-A repo-B

या पक्ष द्वारा साइड के लिए आप उपयोग कर सकते हैं:

diff -x .git -W200 -y -r repo-A repo-B

हर भिन्न फ़ाइल को रंग देने के मामले में, आप इसका उपयोग कर सकते हैं:

diff -x .git -W200 -y -r repo-A repo-B | sed -e "s/\(^diff .*\)/\x1b[31m\1\x1b[0m/"

@ andrew-heekin समाधान पर आधारित
जेरार्ड

0

स्वयं को याद दिलाएं ... पहले प्राप्त करें, अन्यथा रिपॉजिटरी में स्थानीय हैश नहीं है (मुझे लगता है)।

चरण 1. अपस्ट्रीम रिमोट और ऊपर ^ सेट करें

एकल फ़ाइल को बदलना इस पैटर्न का अनुसरण करता है:

git का अंतर है लोकब्रांच uptreamBranch --spacepath / singlefile

git diff master upstream/nameofrepo -- src/index.js

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.