मैं उन परिवर्तनों को कैसे दिखाऊंगा जिनका मंचन किया गया है?


2136

मैंने प्रतिबद्ध होने के लिए कुछ बदलाव किए; मैं उन सभी फ़ाइलों के रूप को कैसे देख सकता हूं जो अगले प्रतिबद्ध के लिए मंचित हैं? मुझे git स्टेटस के बारे में पता है , लेकिन मैं वास्तविक अंतर देखना चाहूंगा - न कि केवल उन फाइलों के नाम, जिनका मंचन किया जाता है।

मैंने देखा कि git-diff (1) मैन पेज कहता है

git diff [--options] [-] […]

यह फ़ॉर्म आपके द्वारा अनुक्रमणिका के लिए किए गए परिवर्तनों (अगली प्रतिबद्ध के लिए मंचन क्षेत्र) को देखने के लिए है। दूसरे शब्दों में, अंतर यह है कि आप सूचकांक में आगे जोड़ने के लिए क्या बता सकते हैं लेकिन आप अभी भी नहीं हैं। आप git-add (1) का उपयोग करके इन परिवर्तनों को चरणबद्ध कर सकते हैं।

दुर्भाग्य से, मैं इस का बहुत मतलब नहीं है। कुछ आसान एक-लाइनर होना चाहिए जो मैं के लिए एक उपनाम बना सकता है, है ना?


76
git status -vकाम भी करता है। देखें नीचे मेरा उत्तर
VonC

3
@VonC मैं हमेशा इस का उपयोग करता हूं, लेकिन इसमें पाइप किया जाता है less, जैसे: git status -v | less- प्रबंधनीय विराम :)
श्री ऑफ़िस

जवाबों:


2606

यह सिर्फ होना चाहिए:

git diff --cached

--cachedइसका मतलब है कि वर्तमान के खिलाफ कैश / इंडेक्स (यानी चरणबद्ध परिवर्तन) में परिवर्तन दिखाते हैं HEAD--stagedके लिए एक पर्याय है --cached

--stagedऔर , केवल सम्मान के साथ अंतर की ओर --cachedइशारा नहीं करता HEADहै HEAD। यदि आप चेरी का उपयोग करते हैं , तो क्या git add --patch(या git add -p) का उपयोग करने के लिए प्रतिबद्ध हैं , --stagedजो मंचन किया जाता है।


35
यदि आप केवल फ़ाइल नाम चाहते हैं, तो stackoverflow.com/a/4525025/255187git diff --name-only --cached पर प्रति पोस्ट निम्न कार्य करें
Michel Hébert

4
प्रत्येक फ़ाइल पर डिफ़ॉल्ट दृश्य अंतर टूल लॉन्च करने के git difftool --stagedबजाय इसका उपयोग करें git diff --stageddifftoolके diffरूप में अच्छी तरह से किसी भी अन्य तर्कों के साथ प्रतिस्थापित किया जा सकता है ।
लाइटसीसी

और आप git difftool --staged -dएक समय में एक फ़ाइल के बजाय एक दृश्य उपकरण में दो निर्देशिकाओं को अलग करने के लिए उपयोग कर सकते हैं ।
रॉबर्ट बर्नस्टीन

चूँकि यह एक उत्तर के रूप में चिह्नित है और पहले यह दिखा रहा है कि इसमें सबसे ऊपर git अंतर शामिल होना चाहिए, फिर git [[अन्य]], सिर्फ मेरे 2 सेंट
विटाली टेरेज़िव

और एक एकल चरणबद्ध फ़ाइल में परिवर्तनों को देखने के लिए, निम्नलिखित काम करेंगे:git diff --cached -- <stagedfile>
स्पष्ट रूप से

1603

एक साधारण ग्राफिक यह स्पष्ट करता है:

सिंपल गिट अलग

git का अंतर

कार्य निर्देशिका और सूचकांक के बीच परिवर्तन दिखाता है। यह दिखाता है कि क्या बदल दिया गया है, लेकिन एक प्रतिबद्ध के लिए मंचन नहीं किया गया है।

git diff - cached

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

git का मुख्य हिस्सा है

कार्यशील निर्देशिका और HEAD (जिसमें अनुक्रमणिका में परिवर्तन शामिल हैं) के बीच सभी परिवर्तनों को दिखाता है। यह अंतिम प्रतिबद्धताओं के बाद से सभी परिवर्तनों को दिखाता है कि क्या वे प्रतिबद्ध हैं या नहीं।

इसके अलावा :

365Git पर थोड़ा और विस्तार है


8
यह अनुभवहीन है, मुझे डर है (जैसा कि आमतौर पर किसी भी स्पष्टीकरण के साथ होता है)। आप के लिए स्थानीय संशोधन है, तो foo.cऔर प्रदर्शन नहीं करते git add foo.c, तो foo.cहै सूचकांक में नहीं ; यह प्रतिबद्ध के लिए मंचन नहीं है। यदि अनुक्रमणिका के git diff foo.cलिए काम foo.cकरने की तुलना में भोलेपन से किया जाता है, तो उसे एक खाली / नॉनएक्ससेंट फ़ाइल और की संपूर्ण सामग्री के बीच एक विशाल अंतर दिखाना होगा foo.c। इसलिए वास्तव में, जब कोई फ़ाइल इंडेक्स में मौजूद नहीं होती है, git diffतो HEADकॉपी का उपयोग करने पर, उस फ़ाइल के लिए वापस आती है।
काज

9
@ काज सख्ती से बोल रहा है, सूचकांक एक खाली स्लेट नहीं है। यह एक आभासी प्रति है जिस HEADपर चरणबद्ध परिवर्तन लागू होते हैं। याद रखें कि Git परिवर्तनों को सहेज कर काम करता है, न कि पूरी फ़ाइलों को सहेज कर। जब आप किसी फ़ाइल को चरणबद्ध करते हैं, तो यह केवल किए गए परिवर्तनों को संग्रहीत करता है। यदि इंडेक्स आपके जैसा खाली है, तो यह पता नहीं चलेगा कि इंडेक्स में बदलाव को कैसे सहेजना है, और पूरी फाइल को "नए जोड़े" के रूप में सहेजना होगा - जो कि गलत है।
एडीटीसी

8
@ काज सूचकांक और वसीयत दोनों में फ़ाइल HEADका अपरिवर्तित संस्करण होगा foo.c(वे भौतिक प्रतियां नहीं हैं, लेकिन सिर्फ आपकी और मेरे लिए तार्किक प्रतियां हैं। गिट के लिए वे केवल एक ही डेटा स्ट्रीम हैं जो हर बार उस फ़ाइल को शामिल करने वाले हर कमिट को संदर्भित करता है। )। तो अगर आप करते हैं जब git diffपर पूरी तरह से unstaged foo.cलिए यह वास्तव में गिरने नहीं कर रहा है वापस HEADवास्तव में सूचकांक के साथ diff (जो फ़ाइल के रूप में की सटीक एक ही संस्करण शामिल करने के लिए होता है क्या कर रहा है यह HEADकरता है)। तो ग्राफिक सही है।
ADTC

2
नमस्कार, मैं जानना चाहूंगा कि इस संदर्भ में इसका " सूचकांक " क्या है ? धन्यवाद!
गाब

2
@TomRussell ( पाठ्यक्रम के प्लस ) के git status -vबराबर हैgit diff --cachedgit status
बुद्धिमानी

54

यदि आप एक दृश्य-दर-साइड दृश्य में रुचि रखते हैं, तो फैल दृश्य दृश्य उपकरण ऐसा कर सकता है। यह तीन पैन दिखाएगा यदि कुछ लेकिन सभी परिवर्तनों का मंचन नहीं किया जाता है। संघर्षों के मामले में, यहां तक ​​कि चार पैन भी होंगे।

मंचन और अस्थिर संपादन के साथ प्रसार का स्क्रीनशॉट

इसके साथ आह्वान करें

diffuse -m

अपने काम कर रहे प्रतिलिपि में।

यदि आप मुझसे पूछें, मैंने एक दशक के लिए सबसे अच्छा दृश्य अंतर देखा है। इसके अलावा, यह Git के लिए विशिष्ट नहीं है: यह SVN, Mercurial, बाज़ार, सहित अन्य VCS के ढेरों के साथ परस्पर क्रिया करता है ...

इन्हें भी देखें: दोनों अलग और काम के पेड़ को अलग दिखाने के लिए?


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

Brouse लिंक को diffuse.sourceforge.net पर, अब के लिए sourceforge.net/projects/diffuse का उपयोग करें ।
14:11 बजे user1133275

1
brew install diffuseOS X पर काम करता है। यदि अस्थिर और मंचित दोनों परिवर्तन नहीं होते हैं, तो 3 पैन नहीं दिखाए जाते हैं - क्या आपका मतलब सूचकांक में अभी तक बदलाव नहीं है?
ब्रेंट फॉस्ट

आपके पास फैलाने का कौन सा संस्करण है? हां - यदि आप कोई फ़ाइल जोड़ते हैं और फिर उसे स्थानीय रूप से संशोधित करते हैं, तो उसे तीन पैन दिखाने चाहिए।
21

तुम भी सेटअप कर सकता फैलाना अपने डिफ़ॉल्ट के रूप difftool और उपयोग कि अंतर्निहित तंत्र / उपकरण / उर्फ यह शुरू करने के लिए। मेरा जवाब यहां देखें: < stackoverflow.com/a/45684512/6501141 >
लाइटसीसी

50

ध्यान दें कि चरणबद्ध परिवर्तन git status -v भी दिखाता है! (जिसका अर्थ है कि आपको मंचन करने की आवश्यकता है - git add- कुछ परिवर्तन। कोई मंचन परिवर्तन नहीं, इसके साथ कोई अंतर नहीं है git status -v
यह Git 1.2.0, फरवरी 2006 से है )

इसके लंबे रूप (डिफ़ॉल्ट) में, git statusएक अनिर्दिष्ट "क्रिया" विकल्प है जो वास्तव में HEAD और सूचकांक के बीच के अंतर को प्रदर्शित करता है।

और यह और भी अधिक पूर्ण होने वाला है: "देखें" मंचित और काम कर रहे वृक्ष दोनों को अलग दिखाते हैं ? "(Git 2.3.4+, Q2 2015):

git status -v -v

अंतिम पंक्तिgit diff HEAD
आर्टूर

2
@ क्यों? उत्तर का बिंदु git status -vvयह उल्लेख करना है कि इसमें क्या शामिल git diff HEADहै।
वॉन

पर काम नहीं करता है git version 1.8.3.1। मुझे पता है कि यह पुराना है, लेकिन यदि संभव हो तो ध्यान दें कि यह ध्वज कब पेश किया गया था।
वनबीर

2
@onebree 1.8.3.1 जून 2013 है, वास्तव में पुराना है। लेकिन git status -vपुराना है ( github.com/git/git/commit/… , git 1.2.0, फरवरी 2006!)। ध्यान दें कि यह सूचकांक के बीच के अंतर को प्रदर्शित करता है HEAD: और यदि आपने सूचकांक (नहीं git add) में कुछ भी जोड़ा है , तो कोई git status -vभी अंतर प्रदर्शित नहीं करेगा। git status -v -vहाल ही में (Git 2.3.4, मार्च 2015) है
VonC

@VonC कि मेरी गलती थी ... मैंने किया git diff -v
वनब्री

25

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

git diff --cached --name-only

--cachedका विकल्प git diffसाधन का मंचन करने के लिए मिलता है फ़ाइलें, और --name-onlyविकल्प साधन फ़ाइलों का केवल नाम पाने के लिए।


2
कृपया अधिक जानकारी के साथ संपादित करें। कोड-ओनली एंड "ट्राय दिस" जवाबों को हतोत्साहित किया जाता है, क्योंकि उनमें कोई खोज योग्य सामग्री नहीं होती है, और यह नहीं समझाते कि किसी को "कोशिश" क्यों करनी चाहिए।
अबरिसोन

2
मुझे यकीन नहीं है कि मैं ऐसा क्यों चाहूंगा, --name-onlyविकल्प के साथ मैं नियमित रूप से उपयोग कर सकता हूंgit status
साइमन फोर्सबर्ग

16

संस्करण 1.7 से और बाद में यह होना चाहिए:

git diff --staged

15

एक विशाल डिफॉल उपकरण का उपयोग करना

डिफ़ॉल्ट उत्तर (कमांड लाइन पर)

यहां दिए गए शीर्ष उत्तर सही ढंग से बताते हैं कि कैश्ड / मंचित परिवर्तनों को कैसे देखें Index:

$ git diff --cached

या $ git diff --stagedजो एक उपनाम है।


इसके बजाय विजुअल डिफ टूल को लॉन्च करना

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

$ git difftool --staged

यह वैसा ही करेगा git diff --staged, जैसा कि किसी भी समय अलग-अलग टूल के चलने पर (यानी हर बार फ़ाइल को फ़र्क द्वारा संसाधित किया जाता है), यह डिफ़ॉल्ट विज़ुअल डिफ टूल (मेरे वातावरण में, यह kdiff3 है ) लॉन्च करेगा

टूल लॉन्च होने के बाद, git diff स्क्रिप्ट तब तक विराम देगी जब तक आपका विज़ुअल diff टूल बंद नहीं हो जाता। इसलिए, अगले एक को देखने के लिए आपको प्रत्येक फ़ाइल को बंद करने की आवश्यकता होगी।


आप हमेशा git कमांड के difftoolस्थान पर उपयोग कर सकते हैंdiff

आपके सभी दृश्य भिन्न जरूरतों के लिए, सभी विकल्पों सहित git difftoolकिसी भी git diffकमांड के स्थान पर काम करेगा ।

उदाहरण के लिए, यह देखने के लिए कि क्या प्रत्येक फ़ाइल के लिए यह करने के लिए दृश्य भिन्न उपकरण लॉन्च है, -yविकल्प जोड़ें (मुझे लगता है कि आमतौर पर आप चाहते हैं!):

$ git difftool -y --staged

इस स्थिति में यह दृश्य भिन्न उपकरण में प्रत्येक फ़ाइल को खींच लेगा, एक बार में, उपकरण बंद होने के बाद अगले को ऊपर लाना।

या एक विशेष फ़ाइल के रूप को देखने के लिए जिसका मंचन किया जाता है Index:

$ git difftool -y --staged <<relative path/filename>>

सभी विकल्पों के लिए, मैन पेज देखें:

$ git difftool --help


Visual Git टूल सेट करना

डिफ़ॉल्ट के अलावा किसी अन्य दृश्य उपकरण का उपयोग करने के लिए, -t <tool>विकल्प का उपयोग करें :

$ git difftool -t <tool> <<other args>>

या, एक अलग डिफ़ॉल्ट दृश्य अंतर उपकरण का उपयोग करने के लिए गिट कॉन्फ़िगर करने के लिए difftool मैन पेज देखें।


.gitconfigबनाम / मर्ज उपकरण के रूप में उदाहरण प्रविष्टियाँ

एक मल्टिफुल की स्थापना के हिस्से में .gitconfigफ़ाइल को बदलना शामिल है , या तो गिट कमांड के माध्यम से जो इसे पर्दे के पीछे बदलते हैं, या सीधे इसे संपादित करते हैं।

आप .gitconfigअपने घर निर्देशिका में पा सकते हैं , जैसे कि ~यूनिक्स में या सामान्य रूप c:\users\<username>से विंडोज पर)।

या, आप .gitconfigअपने डिफ़ॉल्ट Git संपादक में उपयोगकर्ता को खोल सकते हैं git config -e --global

.gitconfigवीएस कोड के लिए मेरे वैश्विक उपयोगकर्ता में उदाहरण प्रविष्टियां इस प्रकार हैं कि दोनों अलग-अलग उपकरण और मर्ज टूल हैं:

[diff]
    tool = vscode
    guitool = vscode
[merge]
    tool = vscode
    guitool = vscode
[mergetool]
    prompt = true
[difftool "vscode"]
    cmd = code --wait --diff \"$LOCAL\" \"$REMOTE\"
    path = c:/apps/vscode/code.exe
[mergetool "vscode"]
    cmd = code --wait \"$MERGED\"
    path = c:/apps/vscode/code.exe

14

स्टेजिंग एरिया बनाम रिपॉजिटरी (अंतिम प्रतिबद्ध) तुलना उपयोग के लिए

 $git diff --staged

कमांड $ git add fileNameआपके अंतिम चरण में आपके चरणबद्ध ( ) परिवर्तनों की तुलना करती है । यदि आप यह देखना चाहते हैं कि आपने जो मंचन किया है, वह आपकी अगली प्रतिबद्धताओं में जाएगा, तो आप git diff --staged का उपयोग कर सकते हैं। यह कमांड आपके अंतिम चरण के लिए आपके चरणबद्ध परिवर्तनों की तुलना करता है।

काम बनाम स्टेजिंग तुलना उपयोग के लिए

$ git diff 

कमांड आपके स्टैडिंग क्षेत्र में आपके वर्किंग डायरेक्टरी में क्या है, इसकी तुलना करता है। यह ध्यान रखना महत्वपूर्ण है कि git diff अपने आप में आपकी पिछली प्रतिबद्धताओं के बाद से किए गए सभी परिवर्तन नहीं दिखाता है - केवल वे परिवर्तन जो अभी भी अस्थिर हैं। यदि आपने अपने सभी परिवर्तनों ( $ git add fileName) का मंचन किया है , तो git diff आपको कोई आउटपुट नहीं देगा।

इसके अलावा, यदि आप किसी फ़ाइल को चरणबद्ध करते हैं ( $ git add fileNameऔर फिर उसे संपादित करते हैं, तो आप फ़ाइल में होने वाले परिवर्तनों को देखने के लिए git diff का उपयोग कर सकते हैं और जो परिवर्तन बिना रुके हुए हैं।


"वर्किंग बनाम रिपॉजिटरी तुलना उपयोग के लिए $ git diff" । मुझे यकीन है कि git diffकाम बनाम स्टेजिंग के बीच तुलना होती है। देखें stackoverflow.com/a/1587952
wisbucky

8

यदि आपके इरादे दूरस्थ रेपो शाखा को लक्षित करने के लिए हैं और कमिट लॉग में आपका पहला पास अधूरा था, तो आप इस तरह से पुश करने से पहले कमिट स्टेटमेंट को सही कर सकते हैं।

स्थानीय स्तर पर

... कुछ बदलाव करें ...

git diff # look at unstaged changes

git commit -am"partial description of changes"

... याद रखें कि कमिटमेंट में अनधिकृत बदलाव ...

git का मूल / गुरु # मंचन में दिखता है, लेकिन धकेलता नहीं है

... संशोधन प्रतिबद्ध वक्तव्य ...

git commit --amend -m"i missed mentioning these changes ...."

git push

7

यदि आपके पास चरणबद्ध परिवर्तनों के साथ एक से अधिक फ़ाइल है git add -i, तो इसका उपयोग करने के लिए अधिक व्यावहारिक हो सकता है , फिर 6: diffआप जिस फ़ाइल में रुचि रखते हैं उसे चुनें और अंत में चुनें।


6

डिफ़ॉल्ट रूप से git diff का उपयोग उन बदलावों को दिखाने के लिए किया जाता है जिन्हें git अपडेट की गई फ़ाइलों की सूची में नहीं जोड़ा जाता है। लेकिन आप परिवर्तन जो जोड़ा या stagged है तो आप अतिरिक्त विकल्प है कि दूँगी Git पता है कि तुम stagged या जोड़ा फ़ाइलों में रुचि रखने वाले कर रहे हैं प्रदान करने की आवश्यकता दिखाना चाहते हैं diff

$ git diff          # Default Use
$ git diff --cached # Can be used to show difference after adding the files 
$ git diff --staged # Same as 'git diff --cached' mostly used with latest version of git 

उदाहरण

$ git diff 
diff --git a/x/y/z.js  b/x/y/z.js index 98fc22b..0359d84 100644
--- a/x/y/z.js 
+++ b/x/y/z.js @@ -43,7 +43,7 @@ var a = function (tooltip) {

-        if (a)
+        if (typeof a !== 'undefined')
             res = 1;
         else
             res = 2;

$ git add x/y/z.js
$ git diff
$

एक बार जब आप फ़ाइलें जोड़ लेते हैं, तो आप 'git diff' के डिफ़ॉल्ट का उपयोग नहीं कर सकते। आपको इस तरह करना होगा:

$ git diff --cached
diff --git a/x/y/z.js  b/x/y/z.js index 98fc22b..0359d84 100644
    --- a/x/y/z.js 
    +++ b/x/y/z.js @@ -43,7 +43,7 @@ var a = function (tooltip) {

    -        if (a)
    +        if (typeof a !== 'undefined')
                 res = 1;
             else
                 res = 2;

2

git guiऔर git-colaग्राफिकल यूटिलिटीज हैं जो आपको इंडेक्स को देखने और हेरफेर करने देते हैं। दोनों में चरणबद्ध फाइलों के लिए सरल दृश्य भिन्नता शामिल है, और git-colaएक अधिक परिष्कृत साइड-बाय-साइड दृश्य अंतर उपकरण भी लॉन्च कर सकता है।

Git में एक फ़ाइल को सूचकांक से निकालने के लिए मेरा निकट संबंधी उत्तर देखें , और जीआईटी - जीयूआई ग्राहकों का यह आधिकारिक कैटलॉग भी ।


0

उपकरण के बारे में gitkभी सोचें , परिवर्तन देखने के लिए गिट और बहुत उपयोगी है

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