2012-04-09 7 views
9

एक सर्वर पर एक गिट भंडार है कि मेरे सहयोगी और मैं दोनों धक्का और खींचते हैं। जब तक हम काम करने से पहले खींचते हैं तब तक यह ठीक काम करता है।गिट क्यों मेरी पुल को अस्वीकार कर रहा है क्योंकि मेरे पास मेरी स्थानीय शाखा पर कोई प्रतिबद्धता है?

हालांकि, अगर वह मास्टर शाखा को धक्का दे दिया गया है, और मतलब समय में मैं एक स्थानीय प्रतिबद्ध है, जब मैं मैं इस मिल खींचने की कोशिश कर दिया है:

! [rejected]  master -> master (non-fast-forward) 

लेकिन मुझे पता है कि नहीं होना चाहिए कोई विवाद नहीं।

तरह से मैं यह चारों ओर पाने के लिए नया अस्थायी शाखा में खींचना और उसके बाद इस तरह मेरे मालिक में मर्ज किए जाने कि कर रहा है:

% git pull origin master:temp 
From ssh://example.com/home/my/remote/repo 
* [new branch]  master -> temp 
Already up-to-date. 
% git merge temp 
Already up-to-date. 
% git push origin master:master 

सूचना है कि Git में कार्य करता है जैसे मैं कुछ नहीं कर रहा हूँ, लेकिन वास्तव में मैं इसे सबमिशन में हिला दिया है।

हाल ही में मुझे एहसास हुआ कि गिट को "मनाने" की कोशिश करने के बजाय यह मेरे लिए खींचना ठीक है। मैं सिर्फ यह दिखा सकता हूं कि मैंने अभी तक git reset --soft HEAD^ और git stash के साथ प्रतिबद्ध नहीं किया है और फिर खींचें और उसके शीर्ष पर प्रतिबद्ध करें।

इस अजीब परिश्रम व्यवहार का कारण क्या हो सकता है?

मैं इस समस्या को मेरी स्थानीय मशीन पर पुन: उत्पन्न करने में सक्षम था। यहां मैंने जो किया है:

सबसे पहले मैंने पहली "स्थानीय" भंडार बनाई और एक फ़ाइल जोड़ा।

% cd 
% mkdir local-1 
% cd local-1/ 
% mkdir website 
% cd website/ 
% git init 
Initialized empty Git repository in /Users/jason/local-1/website/.git/ 
% touch file 
% git add . 
% git commit -m 'added file' 
[master (root-commit) 6d4b322] added file 
0 files changed, 0 insertions(+), 0 deletions(-) 
create mode 100644 file 

तो मैं "दूरस्थ" भंडार बना दिया।

% cd 
% mkdir remote 
% cd remote 
% mkdir website.git 
% cd website.git/ 
% git init --bare 
Initialized empty Git repository in /Users/jason/remote/website.git/ 

फिर मैं स्थानीय वापस गया, एक रेफरी बनाया और रिमोट पर धक्का दिया।

% cd ~/local-1/website/ 
% git remote add web ~/remote/website.git 
% git push web +master:refs/heads/master 
Counting objects: 3, done. 
Writing objects: 100% (3/3), 207 bytes, done. 
Total 3 (delta 0), reused 0 (delta 0) 
Unpacking objects: 100% (3/3), done. 
To /Users/jason/remote/website.git 
* [new branch]  master -> master 

इसके बाद मैंने रिमोट को दूसरे स्थानीय में क्लोन किया।

% cd 
% mkdir local-2 
% cd local-2 
% git clone ~/remote/website.git 
Cloning into website... 
done. 

तो मैं दूसरे स्थानीय से दूरदराज के लिए एक रेफरी बनाया है और धक्का दिया (यह वह जगह है जहाँ मैं इस समस्या मुझे लगता है कि बनाने रहा हूँ)।

% cd website/ 
% git remote add web ~/remote/website.git 
% git push web +master:refs/heads/master 
Everything up-to-date 

फिर मैंने स्थानीय -2, प्रतिबद्ध और धक्का दिया।

% touch another 
% git add . 
% git commit -m 'added another' 
[master be91180] added another 
0 files changed, 0 insertions(+), 0 deletions(-) 
create mode 100644 another 
% git push web 
Counting objects: 3, done. 
Delta compression using up to 4 threads. 
Compressing objects: 100% (2/2), done. 
Writing objects: 100% (2/2), 238 bytes, done. 
Total 2 (delta 0), reused 0 (delta 0) 
Unpacking objects: 100% (2/2), done. 
To /Users/jason/remote/website.git 
    6d4b322..be91180 master -> master 

अंत में, मैं स्थानीय -1, प्रतिबद्ध के लिए एक अलग परिवर्तन किया है, और धक्का करने की कोशिश की।

% cd ~/local-1/website/ 
% touch something 
% git add . 
% git commit -m 'added something' 
[master 3984529] added something 
0 files changed, 0 insertions(+), 0 deletions(-) 
create mode 100644 something 
% git push web 
To /Users/jason/remote/website.git 
! [rejected]  master -> master (non-fast-forward) 
error: failed to push some refs to '/Users/jason/remote/website.git' 
To prevent you from losing history, non-fast-forward updates were rejected 
Merge the remote changes (e.g. 'git pull') before pushing again. See the 
'Note about fast-forwards' section of 'git push --help' for details. 

ब्लास्ट! एक पुल के बारे में कैसे?

% git pull web master:master 
From /Users/jason/remote/website 
! [rejected]  master  -> master (non-fast-forward) 

ठीक है, तो समस्या है। मैं इसे कैसे ठीक करूं?

+0

शुरुआत में वर्णित व्यवहार निश्चित रूप से सामान्य नहीं है। (हालांकि, विलय विवादों के साथ इसका कोई लेना-देना नहीं है।) क्या आपके पास 'git/config' या '~ /gitconfig' में असामान्य रूप से कुछ भी है? यदि आप निश्चित नहीं हैं, तो या तो इसे सभी पर टिप्पणी करें और परीक्षण करें, या पूरी चीज पोस्ट करें। ('Pull.twohead' के लिए कुछ सेट करने से इसका कारण हो सकता है, मुझे लगता है ...) क्या आपने कोई अजीब रेफरी बनाने में कामयाब रहे हैं? 'Gitk --all' चलाएं और निरीक्षण करें, या अधिक कठोर,' प्रत्येक-रेफरी 'के लिए' गिट 'चलाएं। यदि मास्टर नामक कुछ भी है जो 'refs/head/master' या 'refs/remotes/origin/master' नहीं है, तो यह एक समस्या हो सकती है। – Cascabel

+0

मैंने "सर्वोत्तम प्रथाओं" सलाह देखी है जो 'पुल' को 'पुल -फ-केवल' में अलियासिंग करने का सुझाव देती है, जिससे आप जिस स्थिति का वर्णन कर रहे हैं उसका कारण बन जाएगा। मैं विशेष रूप से उस के लिए जांच करूँगा। – Clueless

+0

@Clueless: आह, हाँ, मैंने यह देखने के लिए जांच की कि क्या 'pull.ff-only' config विकल्प था, लेकिन मैंने इसके बारे में नहीं सोचा था। एक अच्छा अनुमान लग रहा है! – Cascabel

उत्तर

12

आप शायद करने के लिए मतलब:

git pull web master 

का उपयोग master:master सीधे पुल जो गैर तेजी से आगे त्रुटि उत्पन्न कर रहा है के मंच लाने में आप स्थानीय master शाखा अद्यतन करने के लिए कोशिश कर रहा है।

यदि आप web/master को ट्रैक करने के लिए सेट की गई शाखा पर हैं तो आपको केवल git pull web की आवश्यकता है और यह आपकी दूरस्थ ट्रैकिंग शाखाओं को भी अपडेट करेगा।

+2

कमाल। इस तरह के एक शर्मनाक लंबे सवाल के लिए इतना आसान है! –

+0

मुझे एक ही समस्या मिली जब मैंने अपने हेरोकू एंडपॉइंट की मास्टर शाखा को स्थानीय विकास में खींचने की कोशिश की। – ganeshran

संबंधित मुद्दे