git: स्थानीय रेपो और उत्पत्ति में फ़ाइल के बीच अंतर करें


187

मैं एक फ़ाइल के बीच अंतर खोजना चाहता हूं जो मेरे स्थानीय रेपो बनाम बनाम में है origin master

मुझे पता है कि वहाँ है git diff, लेकिन मैं सिर्फ इस एक विशेष फ़ाइल के लिए इसे अलग करना चाहते हैं।

सादगी के लिए, फ़ाइल को नाम दिया गया है file1.txtऔर इसका स्थानीय फ़ाइल पथ = है [local_path]और मूल में फ़ाइलपथ = है [remote-path]

टाइप करने के लिए मुझे git कमांड क्या होगा?

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


क्या [दूरस्थ-पथ] [स्थानीय-पथ] से अलग है?
कोड-अपरेंटिस

मैंने अभी आपका संपादन देखा है। एक उत्तर के रूप में इसे पोस्ट करने के लिए स्वतंत्र महसूस करें।
कोड-अपरेंटिस

आप "मूल गुरु" को क्या कहते हैं?

ग्रहण की विधि अच्छी है
user1169587

जवाबों:


249

यदि [remote-path]और [local-path]समान हैं, तो आप कर सकते हैं

$ git fetch origin master
$ git diff origin/master -- [local-path]

नोट 1: ऊपर दी गई दूसरी कमांड स्थानीय रूप से संग्रहीत रिमोट ट्रैकिंग शाखा के खिलाफ तुलना करेगी। दूरस्थ सर्वर की सामग्री के साथ समन्‍वयित होने के लिए दूरस्थ ट्रैकिंग शाखा को अपडेट करने के लिए लाने की आवश्‍यकता होती है। वैकल्पिक रूप से, आप बस कर सकते हैं

$ git diff master:<path-or-file-name>

नोट 2: master उपरोक्त उदाहरणों में किसी भी शाखा के नाम से बदला जा सकता है


15
और स्थानीय पथ को छोड़ भी सकता है यदि वह वर्तमान निर्देशिका है।
टोनी वॉल

19
मेरे जैसे अत्यंत महान लोगों के लिए, यहाँ एक उदाहरण है:git diff master:README.md -- README.md
फैब्रिकोरिसिट्टो

23
वास्तव में, यहाँ एक बेहतर उदाहरण है:git diff origin/master -- README.md
JDiMatteo

मैं git fetch masterइसके बजाय इस्तेमाल नहीं कर सकता git fetch .था (मूल / मास्टर ने या तो काम नहीं किया) लेकिन बाकी ने अच्छी तरह से काम किया।
लूटने

1
@ मेरी गलती बताने वाले आप सबसे पहले हैं। यह होना चाहिए git fetch **origin**
संहिता-अपरेंटिस

114

दूरस्थ फ़ाइल से स्थानीय फ़ाइल में जाने वाले अंतर को देखने के लिए:

git diff remotename/branchname:remote/path/file1.txt local/path/file1.txt

अन्य दिशा में अंतर देखने के लिए:

git diff HEAD:local/path/file1.txt remotename/branchname:remote/path/file1.txt

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

git diff ref1:path/to/file1 ref2:path/to/file2

हमेशा की तरह, ref1और ref2शाखा के नाम हो सकते हैं, रीमोटनेम / ब्रांचनाम, कमिट SHAs, आदि।


17

रिमोट रिपॉजिटरी के साथ स्थानीय रिपॉजिटरी की तुलना करने के लिए, बस नीचे के सिंटैक्स का उपयोग करें:

git diff @{upstream}

2

इसके लिए मैंने एक बैश स्क्रिप्ट लिखी:

#set -x 
branchname=`git branch | grep -F '*' |  awk '{print $2}'`
echo $branchname
git fetch origin ${branchname}
for file in `git status | awk '{if ($1 == "modified:") print $2;}'`
do
echo "PLEASE CHECK OUT GIT DIFF FOR "$file 
git difftool  FETCH_HEAD $file ;
done

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

difftoolजीआईटी द्वारा समर्थित कई हैं , मैंने Meld Diff Viewerअच्छी जीयूआई तुलना के लिए कॉन्फ़िगर किया है।
उपरोक्त स्क्रिप्ट से, मुझे पूर्व ज्ञान है कि मैं एक ही फाइल में अन्य टीमों द्वारा क्या परिवर्तन करता हूं, इससे पहले कि मैं git चरणों का पालन करूं untrack-->staged-->commitजो मुझे दूरस्थ टीम के साथ अनावश्यक समाधान मर्ज संघर्ष से बचने या नई स्थानीय शाखा बनाने और मुख्य शाखा पर तुलना और विलय करने में मदद करते हैं।


1

मैंने कुछ हल करने की कोशिश की लेकिन मैं इस तरह से आसान तरीका बताता हूं (आप स्थानीय फ़ोल्डर में हैं):

#!/bin/bash
git fetch

var_local=`cat .git/refs/heads/master`
var_remote=`git log origin/master -1 | head -n1 | cut -d" " -f2`

if [ "$var_remote" = "$var_local" ]; then
    echo "Strings are equal." #1
else
    echo "Strings are not equal." #0 if you want
fi

फिर आपने स्थानीय git और दूरस्थ git अंतिम प्रतिबद्ध संख्या की तुलना की ...।


0

मूल प्रश्न का पूर्ण उत्तर जो स्थानीय और दूरदराज के संभावित अलग रास्ते के बारे में बात कर रहा था, नीचे है

  1. git fetch origin
  2. git diff master -- [local-path] origin/master -- [remote-path]

मान लें कि स्थानीय पथ डॉक्स / file1.txt है और दूरस्थ पथ docs2 / file1.txt है, उपयोग करें git diff master -- docs/file1.txt origin/master -- docs2/file1.txt

यह यहां GitHub सहायता पृष्ठ और ऊपर दिए गए कोड-अपरेंटिस उत्तर से अनुकूलित है

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