2008-10-23 9 views
142

के बीच परिवर्तन कैसे मिलते हैं यहां दो अलग-अलग प्रश्न हैं लेकिन मुझे लगता है कि वे संबंधित हैं।गिट का उपयोग करना मुझे स्थानीय और दूरस्थ

  1. गिट का उपयोग करते समय, मैं कैसे पता लगा सकता हूं कि मैंने स्थानीय रूप से कौन से परिवर्तन किए हैं, लेकिन अभी तक एक दूरस्थ शाखा में नहीं पहुंचे हैं? मैं Mercurial कमांड hg outgoing के समान कुछ ढूंढ रहा हूं।

  2. गिट का उपयोग करते समय, मुझे कैसे पता चलेगा कि रिमोट शाखा में पुल करने से पहले क्या परिवर्तन होता है? मैं Mercurial कमांड hg incoming के समान कुछ ढूंढ रहा हूं।

दूसरे के लिए: क्या उपलब्ध है यह देखने का कोई तरीका है और फिर चेरी-वे परिवर्तन जिन्हें मैं खींचना चाहता हूं?

+11

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

उत्तर

96

गिट नेटवर्क पर उस तरह की जानकारी नहीं भेज सकते हैं, जैसे एचजी कर सकते हैं। लेकिन आप अपने रिमोट सर्वर से नए काम करने के लिए git fetch चला सकते हैं (जो hg fetch से अधिक है)।

तो, अगर आपके पास एक शाखा master कहा जाता है और एक रिमोट origin बुलाया git fetch चलाने के बाद, आप भी एक शाखा origin/master कहा जाता है होना चाहिए। इसके बाद आप master कर origin/master के सुपरसैट होने की सभी प्रतिबद्धताओं के git log प्राप्त कर सकते हैं। विपरीत पाने के लिए उन दोनों को घुमाएं।

मेरा एक दोस्त, डेविड डॉलर, ने hg incoming/outgoing अनुकरण करने के लिए कुछ गिट शैल स्क्रिप्ट बनाई हैं। आप उन्हें http://github.com/ddollar/git-utils पर पा सकते हैं।

32
  1. "Git लॉग origin..HEAD" उपयोग

  2. उपयोग "Git लाना" "Git लॉग HEAD..origin" द्वारा पीछा किया। आप सूचीबद्ध प्रतिबद्ध आईडी का उपयोग कर व्यक्तिगत प्रतिबद्धताओं को चुन सकते हैं।

ऊपर मान लिया गया है, जाहिर है, कि "मूल" अपने रिमोट ट्रैकिंग शाखा का नाम (यह है जो आप डिफ़ॉल्ट विकल्पों के साथ क्लोन का उपयोग किया है) है।

+3

(और यदि आप रिमोट शाखा को ट्रैक नहीं कर रहे हैं, तो यह "गिट लॉग मूल/मास्टर..हेड" है।) – plindberg

+4

"मूल" रिमोट ट्रैकिंग शाखा का नाम नहीं है, यह रिमोट का नाम है। और केवल रिमोट नाम निर्दिष्ट नहीं करता है, आपको रिमोट ट्रैकिंग शाखा निर्दिष्ट करना है, जो मूल/मास्टर होगा। – robinst

41

कोई पूर्ण उत्तर नहीं है लेकिन गिट फ़ेच रिमोट रेपो खींच देगा और विलय नहीं करेगा। फिर आप

git diff master origin/master

+1

मेरे लिए काम किया (लेकिन आसपास के अन्य तरीके) - 'गिट diff उत्पत्ति/मास्टर मास्टर' –

19

वहाँ भी, यह है सभी शाखाओं की तुलना के लिए:

git log --branches --not --remotes=origin 

यह वही है Git लॉग आदमी पेज को इस बारे में कहते हैं:

Shows all commits that are in any of local branches but not in any of remote tracking branches for origin (what you have that origin doesn’t).

ऊपर outgoing के लिए है। incoming के लिए, बस स्वैप: @{u} या @{upstream}:

git log --remotes=origin --not --branches 
100

Git 1.7.0 के साथ शुरू, वहाँ एक विशेष वाक्य रचना है कि आप सामान्य रूप से नदी के ऊपर शाखा का उल्लेख करने की अनुमति देता है।

की नकल करने के लिए hg incoming:

git log [email protected]{u} 

hg outgoing की नकल करने के लिए:

git log @{u}.. 

मैं निम्नलिखित incoming और outgoing कल्पित नामों का प्रयोग करने के लिए ऊपर आसान उपयोग करने के लिए:

git config --global alias.incoming '!git remote update -p; git log [email protected]{u}' 
git config --global alias.outgoing 'log @{u}..' 
+0

गिट लॉग .. @ {u} मुझे ये त्रुटियां देता है। (मेरे पास दोनों गिट कॉन्फ़िगरेशन में मूल और अपस्ट्रीम रिपोजिटरी है)। त्रुटि: त्रुटि के लिए कोई अपस्ट्रीम शाखा नहीं मिली: कोई अपस्ट्रीम शाखा 'के लिए नहीं मिली ..' त्रुटि: कोई अपस्ट्रीम शाखा' .. ' घातक: अस्पष्ट तर्क' .. @ {u} ': अज्ञात संशोधन या पथ काम करने वाले पेड़ में नहीं है। संशोधनों से पथ को अलग करने के लिए '-' का उपयोग करें – Henrik

+6

यदि आपकी स्थानीय शाखा अपस्ट्रीम के साथ कॉन्फ़िगर नहीं की गई है तो आपको ये त्रुटियां मिलेंगी। ठीक करने के लिए, 'गिट शाखा - सेट-अपस्ट्रीम फू मूल/foo' चलाएं। –

+0

मेरे लिए अच्छा काम करता है, चीयर्स –

1

git-out एक ऐसी स्क्रिप्ट है जो hg outgoing को सटीक रूप से अनुकरण करती है। यह "push -n" आउटपुट पर पार्स करता है, इसलिए यदि आपको धक्का देने के लिए अतिरिक्त तर्क निर्दिष्ट करने की आवश्यकता है तो यह सटीक आउटपुट उत्पन्न करता है।

+0

के लिए नहीं विंडोज? –

+0

@techtonik कोई विचार नहीं। – stepancheg

0

Git भेजे

$ git fetch && git log ..origin/master --stat 
OR 
$ git fetch && git log ..origin/master --patch 

Git निवर्तमान

$ git fetch && git log origin/master.. --stat 
OR 
$ git fetch && git log origin/master.. --patch 
7

मैं क्या करना होगा

$ git fetch --dry-run 
hg incoming के लिए

और

$ git push --dry-run 
के लिए

+0

क्षमा करें, मैंने अनदेखा किया कि यह ओपी को पहले ही एक टिप्पणी के रूप में कहा गया था। – chris

0

जब "गिट लॉग" और @ {u} उत्तरों ने मुझे "अज्ञात संशोधन" त्रुटियां दीं, तो मैंने क्रिस/रोमकिन्स को git push --dry-run का सुझाव दिया।

आपको "5905..4878 मास्टर-> मास्टर" जैसे आउटपुट मिलेगा। 5905 नवीनतम प्रतिबद्धता है कि दूरस्थ और 4878 के माध्यम से रिमोट पर लागू किया जाएगा।

फिर आप कई अन्य Git करने के लिए तर्क के रूप में उपयोग कर सकते हैं 5905..4878 अधिक जानकारी प्राप्त करने के लिए आदेश:

git diff 5905..4878 # Gives full code changes in diff style 

git log --online 5905..4878 # Displays each commit's comment 
-1

जब आप Git लाने करते हैं, शाखाओं, टैग (refs) सहित सभी सामग्री को अस्थायी रूप से जमा हो जाती है .git/FETCH_HEAD जिसमें सामग्री को कमांड के साथ देखा जा सकता है: गिट लॉग FETCH_HEAD यदि आप गिट fetch के साथ प्रत्यय-ए का उपयोग नहीं करते हैं तो डिफ़ॉल्ट रूप से, FETCH_HEAD की सामग्री को नई सामग्री द्वारा ओवरराइट किया जाएगा। इन सामग्रियों से, आप देख सकते हैं और तय कर सकते हैं कि आप कौन सी शाखा को मर्ज करना चाहते हैं यदि आप करते हैं या आप आसानी से चेरी-पिक कर सकते हैं यदि आप केवल कुछ ही चाहते हैं जो प्राप्त करने से लाया गया है।