2013-05-31 11 views
13

खींचने के बाद गिट रिबेस, यदि मैं सीधे मास्टर पर काम कर रहा हूं (जिसे मैं वैसे भी करने की कोशिश नहीं करता) तो मैं आमतौर पर git pull --rebase का उपयोग करता हूं। अगर मैं एक rebase करना भूल गया और बस git pull किया, तो क्या इसे पूर्ववत करने और इसे विलय करने के बजाए रैखिक बनाने का कोई तरीका है? इस बिंदु पर एक रिबेज करना एक बुरा विचार होगा (अगर वह कुछ भी पूरा करेगा)?पुल

मुझे पता है कि मैं डिफॉल्ट रूप से खींचने पर सक्षम रीबेजिंग डाल सकता हूं इसलिए मैं नहीं भूलता, लेकिन यह समझने का एक मुद्दा है कि इस मामले में क्या करना है।

+3

मैं लगता है कि 'Git वापस खींच से पहले --hard' पुनर्स्थापित करने के लिए है और पुल फिर से रास्ता रास्ता है। – Alex

+0

धन्यवाद। क्या आप इसे टिप्पणी के बजाय उत्तर के रूप में पोस्ट कर सकते हैं? –

उत्तर

3

मैं वापस लगता है git reset --hard पुल से पहले करने के लिए और पुल फिर से करना जिस तरह से

14

लघु जवाब (पहले से ही टिप्पणी में @Alex द्वारा दिए गए): git reset --hard HEAD^, लेकिन वहाँ केवल यदि किसी मर्ज के लिए प्रतिबद्ध (अन्यथा आप सिर्फ एक बैकअप ले रहे हैं अपने तेजी से आगे से प्रतिबद्ध)। स्पष्टीकरण के साथ

लांग संस्करण:

git pull वास्तव में सिर्फ git fetchgit merge द्वारा पीछा किया है (जब तक आप --rebase साथ ओवरराइड, जैसा कि आप ध्यान दें)। ,

$ git pull 
Updating 171ce6f..523bacb 
Fast-forward 
mp.py | 24 ++++++++++++++++++++++++ 
1 files changed, 24 insertions(+), 0 deletions(-) 
create mode 100644 mp.py 

इस मामले में कोई मर्ज नहीं था प्रतिबद्ध सिर्फ एक तेजी से आगे है, तो, कोई समस्या नहीं-वहाँ rebase में कोई परिवर्तन नहीं कर रहे हैं: तो तुम सिर्फ देखने के लिए कि आप एक वास्तविक मर्ज करने या मिल नहीं की जरूरत है! यदि आप git log करते हैं तो आपको कमी-विलय-प्रतिबद्धता दिखाई देगी, खासकर यदि आप नीचे ग्राफ-y करते हैं।

चलो एक विलय को मजबूर करते हैं।

$ git reset --hard HEAD^ 
HEAD is now at 171ce6f ignore *.log files 

[अब मैं remotes/origin/master के पीछे एक हूँ]

$ echo '# pointless comment' >> selfref.py 
$ git add selfref.py 
$ git commit -m 'added to force merge' 
[master 260e129] added to force merge 
1 files changed, 1 insertions(+), 0 deletions(-) 
$ git pull 
Merge made by recursive. 
mp.py | 24 ++++++++++++++++++++++++ 
1 files changed, 24 insertions(+), 0 deletions(-) 
create mode 100644 mp.py 

हम देख सकते हैं कि यह हुआ, ऊपर पाठ के साथ याद आ रही है, भले ही,:

$ git log --graph --decorate --abbrev-commit --pretty=oneline 
* c261bad (HEAD, master) Merge branch 'master' of [ssh url] 
|\ 
| * 523bacb (origin/master, origin/HEAD) add multiprocessing example 
* | 260e129 added to force merge 
|/ 
* 171ce6f ignore *.log files 

हम करना चाहते हैं स्थानीय शाखा का नाम master प्राप्त करने के लिए (इस मामले में) 260e129 को इंगित करें।

$ git rev-parse HEAD^ 
260e1297900b903404c32f3706b0e3139c043ce0 

(वर्तमान में, दो माता पिता की दूसरे माता पिता, प्रतिबद्ध HEAD^2 है मर्ज करें।) तो:

$ git reset --hard HEAD^ 
HEAD is now at 260e129 added to force merge 

और अब हम remotes/origin/master पर rebase कर सकते हैं (मैं सौभाग्य से उस नाम को वास्तव में आसान है 'कि नाम हैं) वास्तव में शॉर्ट नेम, origin, का उपयोग करेंगे:

$ git rebase origin 
First, rewinding head to replay your work on top of it... 
Applying: added to force merge 

अब ग्राफ-y एक पंक्ति का लॉग शो:

$ git log --graph --decorate --abbrev-commit --pretty=oneline 
* 4a0b2e2 (HEAD, master) added to force merge 
* 523bacb (origin/master, origin/HEAD) add multiprocessing example 
* 171ce6f ignore *.log files 

यह सब से, यदि आप git pull चलाते हैं तो यह पता लगाने में सक्षम होना चाहिए और यह शिकायत करता है कि विलय विफल हो जाता है। :-)

0

मैं आपको कुछ सलाह देना चाहता हूं जो इतिहास को रैखिक रखने में मदद करता है। जब आप खींचते हैं तो स्वचालित रूप से शाखा को पुन: भेजने के लिए निम्न गिट कॉन्फ़िगरेशन सेट करें।

$ git config branch.autosetuprebase always 

इस लागू करने की स्थापना आप --rebase पैरामीटर, बस git pull के साथ पूर्ण पुल आदेश लिखें की जरूरत नहीं है के बाद।

अधिक जानकारी आप इस लेख में प्राप्त कर सकते हैं http://stevenharman.net/git-pull-with-automatic-rebase

+0

जैसा कि मेरे प्रश्न में बताया गया है, मुझे पता है कि मैं यह कर सकता हूं। मैं सिर्फ यह जानने की कोशिश कर रहा हूं कि इस मामले में क्या करना है। –