2011-02-09 5 views
38

मैं दूरस्थ शाखा और स्थानीय शाखा के बीच वास्तविक अंतर की जांच करना चाहता हूं। मैं उसे कैसे कर सकता हूँ?दूरस्थ शाखा से विलय करने से पहले असली गिट diff कैसे जांचें?

नीचे दिए गए आदेश को आंशिक रूप से काम करना जारी करता है, लेकिन यह मेरी स्थानीय शाखा के नए परिवर्तनों का अंतर भी दिखाता है।

git diff remote/branch 
+0

मुझे प्रश्न समझ में नहीं आता है। Diff आपको शाखाओं के बीच अंतर दिखाता है, आपको क्यों लगता है कि वे विलय नहीं करेंगे? – Abizern

+0

@ अबीज़र्न मेरे बुरे! मैंने सवाल को सही किया। धन्यवाद! :) – abhiomkar

+0

संभावित डुप्लिकेट [दूरस्थ शाखा के साथ स्थानीय गिट शाखा की तुलना करें?] (Http://stackoverflow.com/questions/1800783/compare-local-git-branch-with-remote-branch) –

उत्तर

12

documentation से:

git diff [--options] <commit>...<commit> [--] [<path>…] 

यह फार्म शाखा युक्त पर परिवर्तन देखने के लिए है और दोनों <commit> का एक आम पूर्वज पर दूसरा <commit>, शुरू करने के लिए ऊपर। "गिट diff ए ... बी" के बराबर है "गिट diff $ (गिट-मर्ज-बेस ए बी) बी"। आप <commit> में से किसी एक को छोड़ सकते हैं, जिसमें इसके बजाय HEAD का उपयोग करने के समान प्रभाव है।

क्या आपने इसे आजमाया? के रूप में Evgen Bodunov ने सुझाव दिया

+0

धन्यवाद! मुझे इस बात के लिए तीन बिंदुओं का एहसास नहीं हुआ, यह काम करता है! :) – abhiomkar

7

, आप क्या करना चाहते हैं:

git diff ...remote/branch 

इस दूरस्थ/शाखा से परिवर्तन यदि अंतर और अपने वर्तमान सिर से परिवर्तन पर ध्यान नहीं देगा।

97

चूंकि यह विषय अक्सर आता है, और गिट काम करता है, इस बारे में कुछ पृष्ठभूमि के बिना भ्रमित हो सकता है, मैंने सोचा कि मैं सबसे सरल मामले को समझाने की कोशिश करूंगा, लेकिन पर्याप्त गहराई के साथ कि नए आने वालों के पास पर्याप्त संभाल होगा अतिरिक्त शोध करने के लिए।

यदि आप अपने गिट रिपोजिटरी को सामान्य 'क्लोन' के माध्यम से सेट करते हैं और डिफ़ॉल्ट रीफस्पेक्स रखते हैं, जिसका अर्थ है कि आपके रिमोट को 'मूल' नाम दिया गया है और आप शाखा 'मास्टर' से खींच/लाते हैं, तो आपको कभी-कभी देखने की आवश्यकता हो सकती है इसे खींचने से पहले रिमोट रिपोजिटरी में क्या है।

चूंकि "गिट पुल" स्वचालित विलय करता है (जब तक कि विवाद न हो), यह देखना अच्छा हो सकता है कि अगला "आने वाला" क्या है। यदि आप गिट काम करने के तरीके से परिचित नहीं हैं, और विशेष रूप से रीफस्पेक्स कैसे प्रबंधित किए जाते हैं, तो यह थोड़ा गैर-अंतर्ज्ञानी हो सकता है।

मान लीजिए किसी दूरस्थ भंडार में कोई परिवर्तन नहीं करता (उदाहरण के लिए, एक परिवर्तन प्रतिबद्ध होते हैं और यह धक्का द्वारा दूरस्थ भंडार के लिए एक लाइन जोड़ने), और आप टाइप करें:

$ git diff origin/master 

आप शायद कोई बदलाव नहीं देखेंगे; लेकिन यदि आप निम्न कार्य करें:

$ git fetch; git diff ..origin/master 

तुम क्या अपने स्थानीय Git भंडार और क्या दूरस्थ भंडार में है करने के लिए प्रतिबद्ध किया गया है के बीच अंतर देखेंगे। आपको कोई भी परिवर्तन नहीं दिखाई देगा जो आपके स्थानीय फाइल सिस्टम में हैं या आपके इंडेक्स में चरणबद्ध हैं।

ठीक है, हम ऐसा क्यों करते हैं? मूल/मास्टर रेफस्पेक (मैन पेज देखें) है। संक्षेप में, हम यही तुलना करते हैं कि हम तुलना करने, खींचने या लाने, और धक्का देने के लिए तुलना करते हैं।निम्न में से सभी कार्यात्मक रूप से बराबर कर रहे हैं:

origin/master 
remotes/origin/master 
refs/remotes/origin/master 

इस सुलझाना करने के लिए शुरू करने के लिए, बस अपने भंडार के .git निर्देशिका संरचना पर एक नज़र। एक सामान्य लेआउट इस तरह दिखता है:

.git/refs 
.git/refs/heads 
.git/refs/heads/master 
.git/refs/remotes 
.git/refs/remotes/origin 
.git/refs/remotes/origin/HEAD 
.git/refs/remotes/origin/master 
.git/refs/tags 

देखें .git/refs/remotes/origin/HEAD; डिफ़ॉल्ट स्थिति में यह उस शाखा को इंगित करेगा जिसका उपयोग आप खींचने और पुश करने के लिए करते हैं। मेरे मामले में, के बाद से मैं मास्टर पर हूँ, इस पाठ फ़ाइल की सामग्री को इस तरह दिखेगा:

ref: refs/remotes/origin/master 

यह मुझसे कहता है कि मेरे दूरस्थ की प्रमुख refspec 'refs/रिमोट/मूल/मास्टर द्वारा पहचाना जाता है '(जो ऊपर वर्णित उपनाम होता है)।

यह हमें बहुत कुछ नहीं बताता है; रिमोट रिपोजिटरी की स्थिति क्या है? दूरदराज के मास्टर के राज्य को देखो:

$ cat .git/refs/heads/master  
6d0fb0adfdfa5af861931bb06d34100b349f1d63 

ठीक है, यह एक SHA1 हैश है; शायद एक प्रतिबद्धता। यह इस फाइल में कैसे लगाया जाता है? खैर, जब भी आप पुल या फ़ेच करते हैं, तो यह फ़ाइल रिमोट से हालिया प्रतिबद्धता के साथ अपडेट की जाती है जिसे खींचा या लाया जाता था। यह बताता है कि diff प्रदर्शन करने से पहले हमें git fetch क्यों करना है। याद रखें, git fetch बस एक दूरस्थ शाखा की आपकी स्थानीय प्रति अपडेट करता है, लेकिन यह आपकी कार्यशील प्रतिलिपि में विलय नहीं करता है। यह पूरी तरह से सुरक्षित है। git fetch; git mergegit pull के समतुल्य है।

एक बार जब आप fetch करते हैं, तो गेट रिमोट के समय के रूप में रिमोट भंडार में सबसे हालिया प्रतिबद्धता देख पाएगा।

आप के रूप में आप की इच्छा अपने डिफ देखने के लिए git करने के लिए विनिर्देशक के विभिन्न संयोजनों का उपयोग कर सकते (निम्न उदाहरण के रूप में निहित पहले स्थानीय काम कर प्रति का उपयोग करने की):

$ git diff remote/origin 
This shows the incoming remote additions as deletions; any additions in your local 
repository are shown as additions. 

$ git diff ...remote/origin 
Shows incoming remote additions as additions; the triple-dot excludes changes 
committed to your local repository. 

$ git diff ..remote/origin 
Shows incoming remote additions as additions; the double-dot includes changes 
committed to your local repository as deletions (since they are not yet pushed). 

पर जानकारी के लिए ".." बनाम "..." git help diff पर उत्कृष्ट दस्तावेज git-scm revision selection: commit ranges पर संक्षेप में, ऊपर दिए गए उदाहरणों के लिए, डबल-डॉट सिंटैक्स दिखाता है कि सभी मूल/मास्टर से पहुंच योग्य होते हैं लेकिन आपकी कार्यशील प्रति नहीं। इसी तरह, ट्रिपल-डॉट सिंटैक्स सभी प्रतिबद्धताओं को या तो प्रतिबद्ध (अंतर्निहित कार्य प्रतिलिपि, रिमोट/मूल) से पहुंचने योग्य दिखाता है लेकिन दोनों से नहीं।

मैं इस कदम से कदम उठा रहा हूं क्योंकि मैं गिट के लिए बिल्कुल नया हूं और यह वास्तव में ऐसी चीज है जिसकी मुझे उलझन में है ... मुझे यकीन है कि गिट विशेषज्ञों के साथ त्रुटियां मिल सकती हैं विवरण ... मुझे उम्मीद है कि यह उत्तर कुछ लोगों के लिए अंतर को पुल करता है जो सभी विभिन्न पदों को थोड़ा सा पाते हैं।

+4

डबल-डॉट्स और ट्रिपल-डॉट्स, एह? वह एक तरह का घृणित है। लेकिन आपके उत्तर के लिए धन्यवाद - यह बताता है कि क्यों गिट diff मेरे लिए कभी नहीं दिखाया। –

+4

यह स्वीकार्य उत्तर होना चाहिए; अधिक शुरुआती-अनुकूल और भिन्नता के आसपास महत्वपूर्ण अवधारणाओं को समझाता है (यदि आप सभी शर्तों के लिए उपयोग नहीं करते हैं तो मैन-पेज ठीक से समझने का दर्द है)। – mark

+0

मुझे अंतिम भाग समझ में नहीं आता है। "आने वाले रिमोट बदलावों को जोड़ों के रूप में दिखाता है"? तो क्या आने वाले परिवर्तन जोड़ या हटाना हैं, वे अतिरिक्त के रूप में दिखाए जाते हैं? मुझे विश्वास नहीं है।उत्तर [यहां] (http://stackoverflow.com/questions/7251477/git-diff-whats-the-difference-between-having-and-no-dots) भी काफी अलग लगता है। – Cerran

संबंधित मुद्दे