लाने के बिना git-pull का पूर्वावलोकन कैसे करें?


204

क्या यह भी संभव है?

असल में, एक दूरस्थ रिपॉजिटरी है जिसमें से मैं बस का उपयोग करके खींचता हूं:

git pull

अब, मैं पूर्वावलोकन करना चाहूंगा कि मेरी तरफ कुछ भी छूने के बिना यह पुल (भिन्न) क्या होगा। इसका कारण यह है कि मैं जो चीज़ खींच रहा हूं वह "अच्छी" नहीं हो सकती है और मैं चाहता हूं कि कोई और मेरी रिपॉजिटरी को "गंदा" करने से पहले इसे ठीक कर दे।


4
आपका संपादन अजीब है। "गिट लाने" से किसी भी तरह से आपके काम करने के पेड़ में कोई बदलाव नहीं होता है, इसलिए यदि आपके पास स्थानीय परिवर्तन नहीं हैं तो इससे कोई फर्क नहीं पड़ता। और यह स्पष्ट नहीं है कि आप अपने काम के पेड़ को नहीं छूते हैं, क्योंकि आप इसे खोलना चाहते हैं।
dkagedal

धन्यवाद dkagedal, मैंने यह पूरी तरह से समझने से पहले लिखा था कि Git कैसे काम करता है। मैंने उस संपादन को हटा दिया।
मिलन बाबूसकोव

जवाबों:


233

ए करने के बाद git fetch, git log HEAD..origin/masterअपनी पिछली आम प्रतिबद्धताओं और मूल की मास्टर शाखा के बीच लॉग प्रविष्टियों को दिखाने के लिए करें। डिफरेंसेस को दिखाने के लिए, किसी एक डिफरेक्ट को दिखाने के लिए या तो git log -p HEAD..origin/masterप्रत्येक पैच को दिखाने के लिए, या git diff HEAD...origin/master(तीन डॉट्स नॉट टू) का उपयोग करें।

आम तौर पर एक भ्रूण को पूर्ववत करने की कोई आवश्यकता नहीं है, क्योंकि एक भ्रूण करने से केवल दूरस्थ शाखाएं और आपकी कोई भी शाखा अपडेट नहीं होती है। यदि आप सभी दूरस्थ कमिट्स में एक पुल बनाने और मर्ज करने के लिए तैयार नहीं हैं, तो आप git cherry-pickकेवल विशिष्ट रिमोट कॉम्पटिट को स्वीकार करने के लिए उपयोग कर सकते हैं। बाद में, जब आप सब कुछ प्राप्त करने के लिए तैयार हो जाते हैं, git pullतो बाकी के कमिट्स में विल विलीन हो जाएगा।

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


मुझे लगता है कि मैंने डॉक्स पढ़ते समय 'मेरी शाखाओं के साथ कुछ नहीं करने' के उस हिस्से को याद किया। धन्यवाद।
मिलन बाबूकोव

1
किसी कारण से जो मेरे लिए काम नहीं करता है। मैंने कोशिश की है कि HEAD ... मूल / मास्टर को अलग कर दिया जाए और जब तक मैं 'मूल गुरु को नहीं खींचता' तब तक इसमें कोई बदलाव नहीं होता है और यह परिवर्तन को मर्ज करता है। क्या इसलिए कि मैंने git रिमोट ऐड का उपयोग करके दूरस्थ रिपॉजिटरी की स्थापना की है?
स्क्रीनमैनी सेप

@ screenm0nkey: मैं नहीं जानता (अधिक जानकारी के बिना)। यदि आप अभी भी सुनिश्चित नहीं हैं, तो मैं इस बारे में पूछने के लिए एक नया प्रश्न खोलने की सलाह देता हूं।
ग्रेग हेवगिल सेप 30'11

1
मेरे लिए क्या काम करता है (git fetch के बाद): git log
Origin

2
git diff ...@{u}git diff HEAD...origin/masterयदि मूल / गुरु
उर्ध्व

47

मुझे लगता है कि git लाने के लिए आपकी तलाश है।

यह परिवर्तन और वस्तुओं को आपके स्थानीय रेपो इंडेक्स में शामिल किए बिना खींच लेगा।

उन्हें बाद में गिट मर्ज के साथ विलय किया जा सकता है ।

मैन पेज

संपादित करें: आगे की व्याख्या

से सीधे Git- SVN क्रैश कोर्स लिंक

अब, आपको दूरस्थ रिपॉजिटरी से कोई नया बदलाव कैसे मिलेगा? आप उन्हें लाएँ:

git fetch http://host.xz/path/to/repo.git/ 

इस बिंदु पर वे आपके भंडार में हैं और आप उनका उपयोग करके जांच कर सकते हैं:

git log origin 

आप परिवर्तनों को अलग भी कर सकते हैं। आप भी उपयोग कर सकते हैं अपनी शाखा में केवल उन परिवर्तनों को देखने के git log HEAD..origin का । तो फिर क्या वे उन्हें मर्ज करना चाहेंगे - बस:

git merge origin

ध्यान दें कि यदि आप एक शाखा लाने के लिए निर्दिष्ट नहीं करते हैं, तो यह ट्रैकिंग रिमोट पर आसानी से डिफ़ॉल्ट हो जाएगा।

मैन पेज को पढ़ना ईमानदारी से आपको विकल्पों की सबसे अच्छी समझ और इसका उपयोग करने का तरीका बताने जा रहा है।

मैं सिर्फ उदाहरणों और स्मृति द्वारा ऐसा करने की कोशिश कर रहा हूं, मेरे पास वर्तमान में परीक्षण करने के लिए एक बॉक्स नहीं है। आपको देखना चाहिए:

git log -p //log with diff

एक भ्रूण को जीईटी रीसेट -हार्ड ( लिंक ) के साथ पूर्ववत किया जा सकता है , हालांकि आपके पेड़ में सभी अपरिवर्तित परिवर्तन खो जाएंगे और साथ ही आपके द्वारा लाए गए परिवर्तन भी।


यदि आप दो चीजों की व्याख्या करते हैं, तो यह अच्छा हो सकता है: 1. मैं git-fet को पूर्ववत् कैसे करूँ? 2. मैं अंतर कैसे देख सकता हूँ?
मिलन बाबूसकोव

1
1) पूर्ववत git-fetch? 2) git diff HEAD..origin
क्रिस वेस्ट

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

क्या आप ढूंढ रहे हैं git reset --softया --mixed? मैनपेज की जाँच करें।
अरस्तू पैगल्टज़िस

1
अगर मैं सही समझता हूं तो "गिट लाने" को पूर्ववत करने की कोई आवश्यकता नहीं है क्योंकि यह आपकी कार्यशील प्रति को नहीं छूता है और आपकी रिपॉजिटरी को भी नहीं देखता है। "git fetch" ऑब्जेक्ट्स और refs को .git / FETCH_HEAD में संग्रहीत करता है
Thorsten Niehues

21

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

यह एक दूरस्थ रेपो के लिए एक उदाहरण है जिसे originएक शाखा कहा जाता है और दूरस्थ शाखा को masterट्रैक करना कहा जाता है origin/master:

git checkout master                                                  
git fetch                                        
git diff origin/master
git pull --rebase origin master

8

मैंने एक कस्टम git उपनाम बनाया है जो मेरे लिए है:

alias.changes=!git log --name-status HEAD..

इसके साथ आप यह कर सकते हैं:

$git fetch
$git changes origin

ऐसा करने से पहले आपको परिवर्तनों का पूर्वावलोकन करने का एक अच्छा और आसान तरीका मिल जाएगा merge


आप भगवान हैं। यह स्वयं गिट के भीतर आना चाहिए
जेड। खुल्लाह

3

मैं इन दो आदेशों का उपयोग करता हूं और मैं फ़ाइलों को बदलने के लिए देख सकता हूं।

  1. सबसे पहले git लाने पर , यह इस तरह आउटपुट देता है (आउटपुट का हिस्सा):

    ...
    72f8433..c8af041 का विकास -> उत्पत्ति / विकास
    ...

यह ऑपरेशन हमें दो प्रतिबद्ध आईडी देता है, पहला पुराना है, और दूसरा नया होगा।

  1. फिर git diff का उपयोग करके इन दोनों कमिट्स की तुलना करें

    git diff 72f8433..c8af041 | grep "diff --git"

यह कमांड उन फाइलों को सूचीबद्ध करेगी जिन्हें अपडेट किया जाएगा:

diff --git a/app/controller/xxxx.php b/app/controller/xxxx.php
diff --git a/app/view/yyyy.php b/app/view/yyyy.php

उदाहरण के लिए ऐप / कंट्रोलर / xxxx.php और ऐप / व्यू / yyyy.php अपडेट किया जाएगा।

का उपयोग करते हुए दो प्रतिबद्ध तुलना Git diff प्रिंट सब बदल लाइनों के साथ फ़ाइलें अद्यतन, लेकिन साथ ग्रेप यह खोज करता है और केवल लाइनों हो जाता है शामिल हैं diff --git उत्पादन से।


3

मुझे पार्टी में देर हो सकती है, लेकिन यह एक ऐसी चीज है जिसने मुझे बहुत लंबे समय के लिए रोक दिया है। अपने अनुभव में, मैं यह देखना चाहता हूं कि मेरी कार्य प्रतिलिपि को अपडेट करने की अपेक्षा कौन से परिवर्तन लंबित हैं और उन परिवर्तनों से कैसे निपटें।

यह ~/.gitconfigफ़ाइल में जाता है :

[alias]
        diffpull=!git fetch && git diff HEAD..@{u}

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


1
आप के लिए रेफरी स्ट्रिंग बाहर स्वैप कर सकते हैं HEAD..@{u}? यह सरल है, और आवश्यकता नहीं है कि रिमोट को "मूल" नाम दिया जाए या आपकी शाखा का नाम उसी तरह रखा जाए जैसा वह रिमोट पर है।
माइकल - जहां

यह एक अच्छी तरह से किया गया उपनाम है, लेकिन मुझे यकीन नहीं है कि आप पहले स्थान पर ऐसा क्यों करना चाहते हैं। आप कुछ समय के बदलाव से निपटने के लिए जा रहे हैं, है ना? git pullयदि आपको यह पसंद नहीं है तो आप मर्ज वाले हिस्से को निरस्त कर सकते हैं ... इसलिए मुझे यकीन नहीं है कि इसके लिए उपयोग का मामला क्या है।
मार्नेन लाईबो-कोसर

मुझे पता है कि मुझे कुछ बिंदुओं पर परिवर्तनों से निपटना है, लेकिन जैसा कि मैंने लिखा है, कभी-कभी मैं नहीं चाहता। मैं बस यह जानना चाहता हूं कि क्या कुछ टूटने वाला है और मुझे इसके लिए कुछ और समय आरक्षित करना होगा - या यदि मैं बस git pullबाद में कर सकता हूं । इसके अलावा, मुझे लगता है कि ऑप्स के बारे में क्या सवाल था।
एंडी पी

-1

यदि आप अपने स्थानीय .it को अपडेट करने के लिए git-fetch नहीं चाहते हैं , तो बस अपने स्थानीय रेपो को टेम्पर्ड डायर में कॉपी करें और वहां एक पुल बनाएं। यहाँ एक शोर-हाथ है:

$ alias gtp="tar -c . | (cd /tmp && mkdir tp && cd tp && tar -x && git pull; rm -rf /tmp/tp)"

पूर्व .:

$ git status
# On branch master
nothing to commit (working directory clean)

$ gtp
remote: Finding sources: 100% (25/25)
remote: Total 25 (delta 10), reused 25 (delta 10)
Unpacking objects: 100% (25/25), done.
From ssh://my.git.domain/reapO
   32d61dc..05287d6  master     -> origin/master
Updating 32d61dc..05287d6
Fast-forward
 subdir/some.file       |    2 +-
 .../somepath/by.tes    |    3 ++-
 .../somepath/data      |   11 +++++++++++
 3 files changed, 14 insertions(+), 2 deletions(-)

$ git status
# On branch master
nothing to commit (working directory clean)

$ git fetch
remote: Finding sources: 100% (25/25)
remote: Total 25 (delta 10), reused 25 (delta 10)
Unpacking objects: 100% (25/25), done.
From ssh://my.git.domain/reapO
   32d61dc..05287d6  master     -> origin/master

$ git status
# On branch master
# Your branch is behind 'origin/master' by 3 commits, and can be fast-forwarded.
#
nothing to commit (working directory clean)

'रेपप' को स्थानीय रेपो की जड़ में निष्पादित करने की आवश्यकता होती है, जहां .It स्थित है।
AX लैब्स

-2

रेपो को कहीं और क्लोन करने के बारे में, और वास्तविक चेकआउट और ताजा क्लोन दोनों पर लॉग लॉग करने के लिए कि क्या आपको एक ही चीज़ मिली है।


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