दिखा रहा है कि दो संशोधनों के बीच कौन सी फाइलें बदल गई हैं


2103

मैं दो शाखाओं को मर्ज करना चाहता हूं जो कुछ समय के लिए अलग हो गए हैं और जानना चाहते हैं कि कौन सी फाइलें संशोधित हुई हैं।

इस लिंक पर आया: http://linux.yyz.us/git-howto.html जो काफी उपयोगी था।

जिन शाखाओं में मैं आया हूँ, उनकी तुलना करने के उपकरण इस प्रकार हैं:

  • git diff master..branch
  • git log master..branch
  • git shortlog master..branch

सोच रहा था कि क्या "git स्टेटस मास्टर..ब्रांच" जैसी कोई चीज केवल उन फाइलों को देखने के लिए है जो दो शाखाओं के बीच भिन्न हैं।

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

  • git diff master..branch | grep "^diff"

सोच रहा था कि क्या मुझे कुछ याद आ रहा है ...


12
कितने अन्य लोग इस सवाल का शीर्षक भ्रामक पाते हैं? यह वास्तव में दो शाखाओं के बीच फ़ाइल अंतर खोजने के बारे में है। मैं यहां आया था कि एक ही शाखा में दो संशोधनों के बीच फ़ाइल अंतर कैसे देखें। या केवल मैं ही हूं?
संदीपन नाथ

4
@ संदीपननाथ: git के साथ कोई अंतर नहीं है। आप व्यक्तिगत रूप से कमिट्स की बात कर रहे हैं।
शमूएल ओ'माली

@ सैमुएलओ'माल्ली मैं गित करने के लिए नया हूं और प्रतीत होता है कि आम शाखा में रणनीति पर विचार कर रहा है जिसमें सभी शाखाओं को अंततः मास्टर शाखा में विलय कर दिया गया है और अंततः मास्टर को बाहर कर दिया गया है। अब, एक रोलआउट की घटना पर विचार करते हुए, जहां उत्पादन पहले से ही मास्टर में है, लेकिन टिप के पीछे (एक संशोधन से यदि अंतिम रोलआउट अंतिम मास्टर मर्ज के बाद हुआ), तो मैं इन दो संशोधनों के बीच के अंतर को देखना चाहूंगा, पता करें कि क्या रोल किया जाएगा। मैं उस शाखा को नहीं देखना चाहूंगा जिसे पिछली बार विलय किया गया था। अगर मैं ग़लत हूं तो मेरी गलती सुझाएं।
संदीपन नाथ

2
@ संदीपननाथ: शाखा नामों का उपयोग करने के बजाय आप नीचे दिए गए उत्तर ले सकते हैं और इसके बजाय केवल प्रतिबद्ध आईडी निर्दिष्ट कर सकते हैं। या फिर उनके टैग नामों से भी कमिट करें यदि आप रोल आउट करते समय टैग बनाते हैं।
सैमुअल ओ'माली

1
@ संदीपननाथ आप 2 शाखाओं की तुलना नहीं कर सकते, आपको संशोधन को निर्दिष्ट करना होगा। इसलिए 2 शाखाओं की तुलना करना 2 संशोधनों की तुलना करना है।
बस्तियन वंदामे

जवाबों:


2572

शाखा के खिलाफ वर्तमान शाखा की तुलना करने के लिए master:

$ git diff --name-status master

किसी भी दो शाखाओं की तुलना करने के लिए:

$ git diff --name-status firstbranch..yourBranchName

आधिकारिक दस्तावेजgit diff में आगे पढ़ें ।


2
बाएं हाथ की तरफ के प्रत्येक सूचक का क्या मतलब है (मुझे बहुत सारे एम और डी के हैं)?
gogogadgetinternet

15
@ user446936 - आप देख सकते हैं पत्र Git स्थिति आदमी पेज @ में मतलब kernel.org/pub/software/scm/git/docs/git-status.html - विशेष रूप से, एम == संशोधित में, डी == नष्ट कर दिया
जेम्स मैनिंग

12
git diff --name-status your_branch...masterआपके_ब्रांच के बाद से मास्टर पर होने वाले परिवर्तनों को इससे उत्पन्न किया जाता है
Radu

1
डबल-डॉट ऑपरेटर बहुत ही कम है, यहाँ, क्योंकि अंतर जोड़ीदार हैं।
जुब्ब्ब् सस्।

2
मुझे काम करने वाले पेड़ में अज्ञात संशोधन या रास्ता नहीं मिला।
SuperUberDuper

408

प्रयत्न

$ git diff --stat --color master..branchName

यह आपको प्रत्येक परिवर्तन के बारे में अधिक जानकारी देगा, जबकि अभी भी समान लाइनों का उपयोग कर रहा है।

यदि आप अन्य तरीके से विलय करने के लिए थे, तो आप अंतर की एक और भी स्पष्ट तस्वीर प्राप्त करने के लिए शाखाओं को फ्लिप कर सकते हैं:

$ git diff --stat --color branchName..master

77
यदि आपके पास (अत्यधिक अनुशंसित, imho) गिट रंग चालू है ( config --global color.ui true), तो आप --color को छोड़ सकते हैं। (मेरे पास लैक्स - आलसी कीबोर्ड सिंड्रोम है।)
आर्ट स्व

25
मैं तुम्हारे साथ रंग पर हूँ! BTW का मेरा मतलब था- git config --global color.ui trueपूरा होना।
बजे कला स्वरी

2
काम नहीं करता है, त्रुटियों को फेंकता है:fatal: ambiguous argument 'master..branchName': unknown revision or path not in the working tree.
टॉम ज़ातो -

7
@ TomášZato क्षमा करें, लेकिन आपको अपनी शाखा के नाम के साथ "शाखा नाम" को स्वैप करना होगा।
गेरी

161

यह भी ध्यान रखें कि गिट में सस्ती और आसान शाखाएं हैं। अगर मुझे लगता है कि एक मर्ज समस्याग्रस्त हो सकता है तो मैं मर्ज के लिए एक शाखा बना सकता हूं। इसलिए यदि मेरे द्वारा masterइसमें विलय किए जाने वाले परिवर्तन हैं और baमेरी शाखा है जिसे मास्टर से कोड की आवश्यकता है, तो मैं निम्नलिखित कार्य कर सकता हूं:

git checkout ba
git checkout -b ba-merge
git merge master
.... review new code and fix conflicts....
git commit
git checkout ba
git merge ba-merge
git branch -d ba-merge
git merge master

अंतिम परिणाम यह है कि मुझे अपनी शाखा के साथ पंगा लेने से पहले थ्रो-दूर शाखा पर मर्ज करने का प्रयास करना पड़ा। अगर मैं अपना आत्म उलझ गया तो मैं सिर्फ ba-mergeशाखा को हटा सकता हूं और शुरू कर सकता हूं ।


4
बहुत बढ़िया। मैंने कभी इस तरह से शाखा लगाने के बारे में नहीं सोचा। मुझे लगता है कि विलय के समय इसे "सर्वोत्तम प्रथाओं" का हिस्सा माना जाना चाहिए।
ईजेलेव जूल

जब आप बा-मार्ज को वापस बा में मिलाते हैं, तो फिर से संघर्षों को ठीक करने की क्षमता नहीं है?
जोसेफ.बी

2
@ EricAnderson राइट, यह एक ग्राफ है। एसवीएन एक स्कूल डेस्क के नीचे गोंद की तरह चिपक जाता है। धन्यवाद।
जोसेफ.बी

1
आपको अंतिम चरण 'गिट मर्ज मास्टर' करने की आवश्यकता क्यों है यदि बा-मर्ज पहले से ही मास्टर था
क्वेबेक

आप इसे छोड़ सकते हैं। एकमात्र कारण यह उपयोगी होगा कि masterजब आप कोड की समीक्षा करने और संघर्षों को ठीक करने पर काम कर रहे थे , तो नए सामान लैंडिंग ।
एरिक एंडरसन

58

अगर कोई भी दो शाखाओं से एक अलग फाइल बनाने की कोशिश कर रहा है:

git diff master..otherbranch > myDiffFile.diff

2
यह विशेष रूप से बड़ी शाखाओं के साथ काम में आया है जिसमें बहुत अंतर हैं।
vandh

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

42

एक GUI आधारित विधि भी है।

आप gitk का उपयोग कर सकते हैं ।

  1. Daud:

    $ gitk --all
    
  2. एक शाखा की ओर राइट क्लिक करें और पॉप-अप मेनू में इस कमिट को चिह्नित करें

  3. किसी अन्य शाखा की एक समिति पर राइट क्लिक करें और इसे चुनें -> चिह्नित कमिट या डिफ मार्क चिह्नित करें -> यह

फिर राइट बॉटम पैनल में बदली हुई फाइल्स लिस्ट होगी और लेफ्ट बॉटम पैनल में डिटेल अलग।


3
@Orwellophile मैं यह करने के लिए कैसे दिखाने के लिए एक वीडियो अपलोड करता हूं । मुझे उम्मीद है कि यह आपकी मदद करेगा।
यान्टो झी

वाह, सिर्फ मेरे लिए, मैं विशेष महसूस करता हूं। मैंने भविष्य के संदर्भ और अतिरिक्त Google-फू के लिए इसे स्वादिष्ट.com में बुकमार्क किया है।
Orwellophile

गंभीर रूप से रेखांकित जवाब। धन्यवाद!
कोशीने

36

इस मामले में मेल्ड का उपयोग करते हुए एक और विकल्प:

git difftool -d master otherbranch

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


6
डिफ़ॉल्ट डिफ़ाल्टूल के रूप में मेल्ड सेट करना चाहते हैं: git config --global diff.tool meld
bwv549

1
यह मेरा पसंदीदा है क्योंकि यह आपके द्वारा कॉन्फ़िगर किए गए कुछ भी पहलू का उपयोग करेगा।
जोशिया

OSX पर समर्थित नहीं है। :-(
माइक एस।

@MikeS। कृपया इस उत्तर को देखें। stackoverflow.com/a/12815806/151918 इसमें OSX के निर्देश हैं। यह मेरे लिए कम से कम काम करता है, आशा है कि यह मदद करेगा।
rsilva4

अच्छा लगा। लेकिन -dविकल्प क्या है ?
स्कूटी.नेट

29

ध्यान दें कि यदि आप परिणाम पसंद नहीं करते हैं, तो git को मर्ज करना और किसी भी समस्या से दूर वापस करना आसान बनाता है। अग्रिम में संभावित समस्याओं की तलाश करने की तुलना में यह आसान हो सकता है।


10
डेविड, यह एक अच्छा बिंदु है, हालांकि यह सिर्फ यह जानना अच्छा होगा कि हाथ से पहले क्या हो रहा है ...
जोहानिक्स

18

और यदि आप केवल निश्चित फ़ाइल (एस) के बीच बदलाव की तलाश कर रहे हैं, तो:

git diff branch1 branch2 -- myfile1.js myfile2.js

यदि शाखा 1 प्रदान नहीं किया जाता है, तो शाखा 1 वैकल्पिक है और आपकी वर्तमान शाखा (आप जिस शाखा पर हैं) को डिफ़ॉल्ट रूप से माना जाएगा। उदाहरण के लिए:

git diff master -- controller/index.js

15

एक साथ या कई विशेषताओं पर काम करते समय, यह आम है कि अपस्ट्रीम या यहां तक ​​कि आपके मास्टर में वह काम होता है जो आपकी शाखा में शामिल नहीं है, और गलत तरीके से बुनियादी अंतर में दिखाई देगा।

यदि आपका अपस्ट्रीम स्थानांतरित हो गया है, तो आपको यह करना चाहिए:

git fetch
git diff origin/master...

बस git diff मास्टर का उपयोग करके, प्रासंगिक परिवर्तन शामिल या विफल हो सकते हैं।


10

यदि आप IntelliJ IDEA का उपयोग कर रहे हैं , तो आप अपनी वर्तमान कार्यशील शाखा से किसी भी शाखा की तुलना कर सकते हैं। अधिक जानकारी के लिए http://www.jetbrains.com/idea/webhelp/merging-de हटाना- and- comparing- branches.html #d288093e3827 देखें । यह नि: शुल्क संस्करण में भी उपलब्ध है।


8

कहते हैं दो शाखाएँ हैं

  • A (वह शाखा जिस पर आप काम कर रहे हैं)
  • बी (दूसरी शाखा जिसके साथ आप तुलना करना चाहते हैं)

ब्रांच A में होने के कारण आप टाइप कर सकते हैं

git diff --color B

तब यह आपको आउटपुट देगा

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

इस बारे में महत्वपूर्ण बिंदु है

  1. हरे रंग में पाठ शाखा ए में मौजूद है

  2. लाल रंग में पाठ शाखा B में मौजूद है


8

यहां बहुत सारे उत्तर हैं, लेकिन मैं कुछ ऐसा जोड़ना चाहता हूं जो मैं आमतौर पर उपयोग करता हूं। यदि आप उन शाखाओं में से एक हैं, जिनकी आप तुलना करना चाहते हैं तो मैं आमतौर पर निम्न में से एक करता हूं। इस उत्तर के लिए हम कहेंगे कि हम अपनी द्वितीयक शाखा में हैं। इस बात पर निर्भर करता है कि आपको किस समय की जरूरत है, यह इस बात पर निर्भर करेगा कि आप किसे चुनते हैं, लेकिन ज्यादातर समय मैं दोनों के दूसरे विकल्प का उपयोग कर रहा हूं। यदि आप एक मूल प्रति पर वापस लौटने की कोशिश कर रहे हैं तो पहला विकल्प आसान हो सकता है - किसी भी तरह से, दोनों को काम मिलता है!

यह मास्टर की तुलना उस शाखा से करेगा जो हम (जो कि द्वितीयक है) में है और मूल कोड अतिरिक्त लाइनें होंगी और नए कोड को हटाए गए लाइनों पर विचार किया जाएगा

git diff ..master

या

यह मास्टर की तुलना उस शाखा से भी करेगा जो हम (जो कि गौण है) और मूल कोड पुरानी पंक्तियाँ होंगी और नया कोड नई पंक्तियाँ होंगी

git diff master..

1

यदि आप Github / Github Enterprise का उपयोग कर रहे हैं, तो आप /compareउदाहरण के लिए, https://github.com/http4s/http4s/compare पर अपने रिपॉजिटरी पथ के url को दबाकर वेब UI का उपयोग कर सकते हैं । आप उस शाखा / प्रतिबद्ध / टैग का चयन कर सकते हैं जिसकी आप तुलना करना चाहते हैं: Github स्क्रीनशॉट की तुलना करें

और diff यूआरएल पर GitHub इंटरफ़ेस में प्रस्तुत किया जाएगा /compare/{x1}...{x2}कहाँ हो x2और x1: शाखा / प्रतिबद्ध / उदाहरण के लिए टैग आप तुलना करना चाहते हैं, https://github.com/http4s/http4s/compare/release-0.18.x ...गुरुजी

आप गितूब डॉक में अधिक देख सकते हैं ।


0

जो लोग GUI समाधान की तलाश में हैं, उनके लिए Git Cola एक बहुत ही अच्छा है "ब्रांच डिफ व्यूअर ( Diff -> शाखाओं ) .. )।



-1

तुम भी एक दृश्य अंतर का उपयोग कर सकते हैं ।

उदाहरण के लिए, यदि आप Sourcetree का उपयोग कर रहे हैं, तो आप लॉग इन दृश्य में किसी भी दो कमिट का चयन कर सकते हैं

(मैं व्यक्तिगत रूप से इसके लिए ज्यादातर मामलों में एक GUI का उपयोग करना पसंद करता हूं, और मैं इसे उन लोगों के लिए पोस्ट कर रहा हूं जो GUI विकल्पों से परिचित नहीं हो सकते हैं।)


-2

यदि आप GUI पसंद करते हैं और Windows का उपयोग कर रहे हैं, तो यहां एक आसान तरीका है।

  1. WinMerge को डाउनलोड करें
  2. दो शाखाओं को अलग-अलग फ़ोल्डरों में देखें
  3. WinMerge का उपयोग करके फ़ोल्डर की तुलना फ़ोल्डर से करें। यदि आप शाखाओं में से एक पर काम कर रहे हैं तो आप आसानी से संशोधन भी कर सकते हैं।

यह सबसे सरल तरीका नहीं है, वास्तव में शाखाओं के बीच अंतर करने के लिए रेपो डाउनलोड करने की कोई आवश्यकता नहीं है।
स्टेफगॉसलिन

यह वास्तव में सबसे सरल तरीका नहीं है, लेकिन यह GUI तरीका है, जो अक्सर सभी फाइलों में
भिन्नता

-3

आप आसानी से TortoiseGit उदाहरण के लिए परिवर्तित फ़ाइलों के लिए शाखाओं की तुलना कर सकते हैं । बस ब्राउज़ संदर्भ पर क्लिक करें और उन शाखाओं को चुनें जिनकी आप तुलना करना चाहते हैं।

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

Remmber है कि आप अलग अलग परिणाम अगर आप तुलना करना होगा मास्टर के साथ अपने-शाखा और अपने शाखा के साथ मास्टर


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