Git का उपयोग करने से मुझे स्थानीय और दूरस्थ के बीच परिवर्तन कैसे मिलेंगे


152

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

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

  2. Git का उपयोग करते समय, मुझे कैसे पता चलेगा कि एक दूरस्थ शाखा में बदलाव करने से पहले क्या होता है? मैं मर्क्यूरियल कमांड के समान कुछ खोज रहा हूं hg incoming

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


11
जवाब को देखते हुए, वहाँ क्या करने के लिए के रूप में कुछ भ्रम की स्थिति हो रहा है hg incomingऔर hg outgoingवास्तव में क्या करते। निकटतम गित समतुल्य है जो मैंने पाया --dry-run। बस git pull --dry-runऔर आपको उन सभी चीजों की एक सूची दिखाई देगी, जो होनी चाहिए।
रोमन स्टार्कोव

जवाबों:


97

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

इसलिए, यदि आपके पास एक शाखा है masterऔर एक रिमोट कहा जाता है origin, तो दौड़ने के बाद git fetch, आपके पास एक शाखा भी होनी चाहिए जिसे कहा जाता है origin/master। इसके बाद आप प्राप्त कर सकते हैं git logसब करता है कि masterका सुपरसेट होने की जरूरत है origin/masterऐसा करने से git log master..origin/master। विपरीत पाने के लिए उन दोनों को उल्टा कर दो।

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


113

Git 1.7.0 के साथ शुरू, एक विशेष सिंटैक्स है जो आपको अपस्ट्रीम शाखा को उदारतापूर्वक संदर्भित करने की अनुमति देता है: @{u}या @{upstream}

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

git log ..@{u}

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

git log @{u}..

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

git config --global alias.incoming '!git remote update -p; git log ..@{u}'
git config --global alias.outgoing 'log @{u}..'

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

6
यदि आपकी स्थानीय शाखा एक अपस्ट्रीम के साथ कॉन्फ़िगर नहीं है, तो आपको वे त्रुटियां मिलेंगी। ठीक करना, चलाना git branch --set-upstream foo origin/foo
रिचर्ड हैनसेन

git log @{u}..मेरे लिए रेपो में हर एक बदलाव को सूचीबद्ध करता है। कोई रास्ता नहीं है वे अभी तक मौजूद नहीं हैं।
रोमन स्टार्कोव

@romkyns: यह संभव है कि आपकी स्थानीय शाखा में गलत दूरस्थ शाखा है जिसे अपस्ट्रीम के रूप में कॉन्फ़िगर किया गया है। सुनिश्चित करें कि git rev-parse --symbolic-full-name @{u}उपयुक्त दूरस्थ संदर्भ प्रिंट करता है। इसके अलावा, git log @{u}..उन कमिट्स को दिखाता है जो अपस्ट्रीम ब्रांच द्वारा पहुंच योग्य नहीं हैं, जिसमें वे कॉमिट्स शामिल हो सकते हैं जो पहले से ही रिमोट रिपॉजिटरी में हैं (यदि वे एक अलग संदर्भ द्वारा उपलब्ध हैं)। आपके द्वारा पहले से ही डाली गई शाखा में विलय करने के ठीक बाद यह होगा।
रिचर्ड हैनसेन

@RichardHansen मुझे डर है कि मैं भी पता है कि एक दूरस्थ संदर्भ के लिए उपयुक्त होगा noob हूँ कर रहा हूँ, लेकिन यह एक ताजी क्लोन रेपो जिस पर मैंने किया था केवल एक था checkout <somebranch>और merge <otherbranch>। इस बिंदु पर, मैंने किया log @{u}..और सूचीबद्ध प्रत्येक परिवर्तन को देखा।
रोमन स्टार्कोव

42

एक पूर्ण उत्तर नहीं है लेकिन git fetch रिमोट रेपो खींचेगा और मर्ज नहीं करेगा। आप तब कर सकते हैं ए

git अलग-अलग मूल / गुरु


1
मेरे लिए काम किया (लेकिन अन्य तरीके से) -git diff origin/master master
निक ग्रीली

34
  1. "गिट लॉग मूल..एचएएडी" का उपयोग करें

  2. "Git लॉग" के बाद "git fetch" का प्रयोग करें। सूचीबद्ध कॉम आईडी का उपयोग करके आप व्यक्तिगत रूप से चेरी-पिक कर सकते हैं।

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


3
(और यदि आप दूरस्थ शाखा पर नज़र नहीं रख रहे हैं, तो यह "git लॉग ऑरिजिन / मास्टर..एचएएचडी" है।)
plindberg

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

22

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

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

इस बारे में git लॉग मैन पेज यही कहता है:

उन सभी कमिट्स को दिखाता है जो स्थानीय शाखाओं में से किसी में हैं लेकिन मूल के लिए दूरस्थ ट्रैकिंग शाखाओं में से किसी में भी नहीं हैं (आपके पास जो मूल है वह नहीं है)।

ऊपर के लिए है outgoing। के लिए incoming, बस स्वैप करें:

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

8

मुझे क्या करना होगा

$ git fetch --dry-run

के लिए hg incomingऔर

$ git push --dry-run

के लिए hg outgoing


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

1

गिट-आउट एक स्क्रिप्ट है जो hg outgoingकाफी सटीक रूप से अनुकरण करती है। यह "पुश-एन" आउटपुट पर पार्स करता है, इसलिए यदि आप पुश करने के लिए अतिरिक्त तर्क निर्दिष्ट करना चाहते हैं तो यह सटीक आउटपुट उत्पन्न करता है।


0

आने वाला

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

बाहर जाना

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

0

जब "गिट लॉग" और @ {यू} उत्तर ने शुरू में मुझे "अज्ञात संशोधन" त्रुटियां दीं, तो मैंने क्रिस / रोमकिन के सुझाव की कोशिश की 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 fetch करते हैं, तो शाखाएं, टैग (refs) सहित सभी सामग्री अस्थायी रूप से .git / FETCH_HEAD में संग्रहीत होती हैं, जिनकी सामग्री को कमांड के साथ देखा जा सकता है: git log FETCH_HEAD यदि आप git लाने के लिए प्रत्यय का उपयोग नहीं करते हैं तो डिफ़ॉल्ट रूप से। , FETCH_HEAD की सामग्री को नई सामग्री द्वारा अधिलेखित कर दिया जाएगा। इन सामग्रियों से, आप देख सकते हैं और तय कर सकते हैं कि आप उन्हें किस शाखा में मर्ज करना चाहते हैं यदि आप करते हैं या आप साधारण चेरी-पिक कर सकते हैं यदि आप चाहते हैं कि जो कुछ लाया है वह केवल भ्रूण के द्वारा लाया गया है।

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