मेल्ड के साथ शाखाओं के अंतर देखें?


159

मुझे पता है कि मैं HEAD और वर्तमान स्थिति के बीच अंतर देख सकता हूं meld .। लेकिन मैं शाखाओं के बीच के मतभेदों को कैसे देख सकता हूं, उदाहरण के लिए masterऔर develपिघल के साथ?

फिलहाल मैं निम्नलिखित कदम उठाता हूं:


  1. उदाहरण के लिए काम करने वाली कॉपी का नाम बदलें mv /projectA /projectA_master)
  2. प्रोजेक्ट को फिर से क्लोन करें
    git clone url
  3. develशाखा में स्विच करें
    cd projectA && git -b devel origin/devel
  4. मेल्ड के साथ मतभेद देखें
    meld /projectA_Master projectA

क्या मेल्ड में समान परिणाम प्राप्त करने का एक आसान तरीका नहीं है? मुझे केवल परिवर्तनों की समीक्षा करने की आवश्यकता है और मुख्य रूप से विलय के लिए नहीं।


क्या इससे आपके सवाल का जवाब मिलता है? अपने git difftool और mergetool
evan.bovie

जवाबों:


55

मुझे यह समस्या परेशान करने वाली लगी, इसलिए मैंने जीआईटी मेल्ड बनाया है जो काम करने वाले पेड़ या मंचन क्षेत्र के खिलाफ मनमाने तरीके से काम करने के तरीके को और अधिक आरामदायक तरीके से अनुमति देता है। आप इसे https://github.com/wmanley/git-meld पर पा सकते हैं । यह मार्क की स्क्रिप्ट की तरह एक सा है, लेकिन किसी भी मनमाने ढंग से प्रतिबद्ध या मंचन क्षेत्र या किसी अन्य के खिलाफ काम करने वाले निर्देशिका की तुलना करने के लिए काम करता है। अगर आप जिन चीजों की तुलना कर रहे हैं, उनमें से एक काम करने वाला पेड़ है, तो वह पढ़ा-लिखा भी है, ताकि आप अपने बदलाव न खोएं।


1
उत्कृष्ट उपकरण, विल। धन्यवाद! पूरी तरह से सिफारिश की ... अब अगर यह केवल विलय पर भी काम किया।
डिपस्टिक

एक महान उपकरण के लिए TYVM - (जोड़ने के लिए स्वयं को याद दिलाने के लिए! उपनाम)
kfmfe04

26
हिट गिथुब रिपॉजिटरी से कोटिंग विल: "नोट: गिट-मेल्ट अप्रचलित है क्योंकि गिट स्पेसफुटूल ने गिट 1.7.11 में --dir-diff विकल्प सीखा है।"
ओलुक

318

छोटा और मीठा:

git config --global diff.tool meld

यह Git को अलग meldटूल के रूप में उपयोग करने के लिए कॉन्फ़िगर करता है। (आपको कमांड लाइन तर्क निर्दिष्ट करने की आवश्यकता नहीं है, समर्थन के लिए meldGit बनाया गया है।)

फिर, यदि आप पाठ के बजाय एक ग्राफिकल अंतर चाहते हैं, तो आप केवल git difftoolइसके बजाय आह्वान करते हैं git diff(वे दोनों एक ही तर्क लेते हैं)। आपके मामले में:

git difftool master..devel

अद्यतन: यदि आप एक-फाइल-ए-टाइम में अंतर नहीं चाहते हैं, लेकिन इसके बजाय दो शाखाओं के बीच के सभी परिवर्तनों के साथ मेल्ड के "उपनिर्देशिका" दृश्य का उपयोग करना चाहते हैं, -dया इसके लिए --dir-diffविकल्प पर ध्यान दें git difftool। उदाहरण के लिए, जब मैं शाखा XYZ पर हूं और मैं देखना चाहता हूं कि इस और शाखा ABC के बीच क्या अंतर है, तो मैं इसे चलाता हूं:

git difftool -d ABC

3
यह वह नहीं है जिसकी मुझे तलाश है। यह मुझे फ़ाइल द्वारा अंतर फ़ाइल दिखाता है। मैंने पहले एक स्क्रिप्ट डिफरेंशो और 'गिट डिफरेंट मास्टर..वेल' के साथ संग्रह किया। मैं सभी अंतरों और डायरेक्टरी ट्री को 'मेल्ड फोल्डर / फोल्डरबी /' के रूप में देखना चाहता हूं।
मार्टन बाउर

मार्टन, यही तरीका काम है। यह केवल फ़ाइल को ट्रैक करता है, इसलिए आप केवल फ़ाइल द्वारा अंतर फ़ाइल देख सकते हैं। गिट में, आप अकेले एक खाली डायर नहीं कर सकते। किसी विशेष कारण से आप डिर के बीच अंतर प्रदर्शित करना चाहते हैं?
डॉनी कुर्निया

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

17
@MartenBauer मुझे लगता है कि यह वही है जो आप चाहते हैं: git difftool --dir-diff master devel
Stéphane

3
क्या ऐसा किया जा सकता है ताकि वर्तमान शाखा tmp फ़ोल्डर में न हो और इसलिए संपादन की अनुमति दे?
17

100

Git v1.7.11 के साथ शुरू करके, आप git difftool --dir-diffएक डायरेक्टरी डिफरेंस परफॉर्म करने के लिए उपयोग कर सकते हैं । जो मेल के साथ बहुत अच्छी तरह से काम करता है https://github.com/wmanley/git-meld स्क्रिप्ट।

कॉन्फ़िगर करें

git config --global diff.tool meld

इसका इस्तेमाल करें

git difftool -d topic             // -d is --dir-diff
git difftool -d master..topic

MacOS के लिए

brew cask install meld
git config --global difftool.meld.cmd 'open -W -a Meld --args \"$LOCAL\" \"$PWD/$REMOTE\"'
git config --global difftool.meld.trustExitCode true

2
मुझे लगता है कि यह वही है जो ओपी चाहता था। --Dir-diff का उपयोग करने के लिए गाइड टूल और -d विकल्प का उपयोग करने के लिए -g विकल्प पर ध्यान दें। कोड समीक्षा करने के लिए यह अच्छा है। Nit: Specificationool.prompt विकल्प की आवश्यकता नहीं है जब -d निर्दिष्ट करते हुए, कम से कम Git 1.8 के लिए।
माइकल पर्सी

1
ये अद्भुत है। बिल्कुल वही जो मुझे चाहिए था। धन्यवाद!
निकोलस

5
क्या ऐसा किया जा सकता है ताकि वर्तमान शाखा tmp फ़ोल्डर में न हो और इसलिए संपादन की अनुमति दे?
17

2
मैं @zkent प्रश्न के उत्तर की सराहना करता हूँ ... :(
tavlima

3
@zkent @tavlima: यह आदेश, पहले से ही, आपके वर्तमान संस्करण पर संपादन की अनुमति देता है। यहां तक ​​कि अगर आप एक tmp floder को meld में देखते हैं, यदि आप सहेजते हैं - Ctrl+s- सही भाग, आपकी फ़ाइल संशोधित है।
बेंजामिन

13

यह कहना महत्वपूर्ण है कि git difftool -dआप का उपयोग कर अभी भी मेल्ड में अपनी काम करने वाली फ़ाइलों को संपादित सकते हैं और उन्हें बचा सकते हैं । उदाहरण के लिए, यह सुनिश्चित करने के लिए कि आपको अपने वर्तमान कार्यशील पेड़ से कुछ शाखा की तुलना करने की आवश्यकता है:

git difftool -d branchname

मेल्ड दिखा रहा है कि बाएँ और दाएँ दोनों निर्देशिका / tmp में स्थित हैं। हालाँकि, सही निर्देशिका में फ़ाइलें वास्तव में वर्तमान कार्य निर्देशिका में आपकी फ़ाइलों के लिए प्रतीकात्मक लिंक हैं (विंडोज पर लागू नहीं होती हैं)। तो आप उन्हें सही मेलेड में संपादित कर सकते हैं और जब आप उन्हें बचाएंगे तो आपके परिवर्तन आपके कामकाजी डायर में सहेजे जाएंगे।

फिर भी अधिक दिलचस्प विकल्प स्टैश के साथ वर्तमान कामकाजी डायर की तुलना है। आप बस टाइप करके ऐसा कर सकते हैं:

git difftool -d stash

तब आप अपने वर्तमान वर्किंग कॉपी (दाएं विंडो) से कुछ बदलावों को ट्रांसफॉर्म (बाएं विंडो) से ट्रांसफर कर सकते हैं, git stash pop/applyवो भी इस कमांड द्वारा प्रेरित किए जा सकने वाले झगड़ालू रिज़ॉल्यूशन रिज़ॉल्यूशन का उपयोग किए बिना ।

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


पियोट्र, यह वही है जो मैं करने की कोशिश कर रहा था, लेकिन मेरे मामले में (CentOS पर), कोई सहानुभूति नहीं बनाई जा रही है। वहाँ किसी भी आवश्यक विन्यास सेटअप, या इस का समर्थन करता है कि तरबूज का एक न्यूनतम संस्करण है?
प्रातः

मुझे लगता है कि मेल्ट नहीं, बल्कि सिम्टिंक निर्माण के लिए गिट जिम्मेदार है। Difftool कमांड के लिए Git के मैनुअल की जाँच करें। शायद आपको इसे नए संस्करण में अपडेट करना चाहिए?
पियोत्र जर्कविक्ज़

2
शाखा से dir काम करने के लिए नई फ़ाइलों की प्रतिलिपि काम :( नहीं है
pykiss

5

हालांकि यह अन्य उत्तरों से लगता है जैसे कि इस समय सीधे गिट रिपॉजिटरी में ऐसा करने का कोई तरीका नहीं है, यह आसान है ( एक और सवाल के जवाब के लिए धन्यवाद :)) एक स्क्रिप्ट लिखने के लिए जो दो कमिट्स के पेड़ों को निकालेगा अस्थायी निर्देशिकाओं के लिए और उन पर meld चलाएं, दोनों निर्देशिकाओं को हटा जब meld बाहर निकलता है:

http://gist.github.com/498628

बेशक, आप मेल्ड के माध्यम से किए गए किसी भी बदलाव को खो देंगे, लेकिन मतभेदों के त्वरित अवलोकन के लिए यह काफी अच्छा है, मुझे लगता है।


3

मुझे लगता है कि ऐसा करने का एक आसान तरीका है git reset --soft:

लक्ष्य: meld के साथ Branch_a और Branch_b के बीच अंतर की तुलना करें

git checkout branch_a
git checkout -b do_diff
git reset --soft branch_b
meld .

0

G1 V1.7.9 में आप कमांडलाइन के बिना दो कमिट्स की तुलना कर सकते हैं:

आपको 'git gui' संपादित विकल्पों में कॉन्फ़िगर करना होगा, वैश्विक: "मर्ज टूल का उपयोग करें: मेल्ड"।

Gitk शुरू करें , एक कमिट चुनें, एक और कमेंट पर क्लिक करें> " इसे अलग करें -> चयनित "। 'पैच' के तहत एक फ़ाइल> " बाहरी अंतर " पर राइट क्लिक करें ।

मेल शुरू होगा और अभी भी चयनित प्रदर्शित करेगा, पहले दाईं ओर प्रतिबद्ध।


0

MacOS पर Meld के लिए, इसे macOS एप्लिकेशन के अनुरक्षक~/.gitconfig द्वारा आपके अनुसार अनुशंसित जोड़ें , yousseb :

[diff]
  tool = meld
[difftool]
  prompt = false
[difftool "meld"]
  trustExitCode = true
  cmd = open -W -a Meld --args \"$LOCAL\" \"$REMOTE\"
[merge]
  tool = meld
[mergetool]
  prompt = false
[mergetool "meld"]
  trustExitCode = true
  cmd = open -W -a Meld --args --auto-merge \"$LOCAL\" \"$BASE\" \"$REMOTE\" --output=\"$MERGED\"

आप चाहें mergeतो कॉन्फिग को छोड़ सकते हैं ।

@ GutenYe का जवाब मेरे लिए स्वत: भागने और / या कुछ के कारण काम नहीं आया zsh

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