एक सर्वर पर एक गिट भंडार है कि मेरे सहयोगी और मैं दोनों धक्का और खींचते हैं। जब तक हम काम करने से पहले खींचते हैं तब तक यह ठीक काम करता है।गिट क्यों मेरी पुल को अस्वीकार कर रहा है क्योंकि मेरे पास मेरी स्थानीय शाखा पर कोई प्रतिबद्धता है?
हालांकि, अगर वह मास्टर शाखा को धक्का दे दिया गया है, और मतलब समय में मैं एक स्थानीय प्रतिबद्ध है, जब मैं मैं इस मिल खींचने की कोशिश कर दिया है:
! [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)
ठीक है, तो समस्या है। मैं इसे कैसे ठीक करूं?
शुरुआत में वर्णित व्यवहार निश्चित रूप से सामान्य नहीं है। (हालांकि, विलय विवादों के साथ इसका कोई लेना-देना नहीं है।) क्या आपके पास 'git/config' या '~ /gitconfig' में असामान्य रूप से कुछ भी है? यदि आप निश्चित नहीं हैं, तो या तो इसे सभी पर टिप्पणी करें और परीक्षण करें, या पूरी चीज पोस्ट करें। ('Pull.twohead' के लिए कुछ सेट करने से इसका कारण हो सकता है, मुझे लगता है ...) क्या आपने कोई अजीब रेफरी बनाने में कामयाब रहे हैं? 'Gitk --all' चलाएं और निरीक्षण करें, या अधिक कठोर,' प्रत्येक-रेफरी 'के लिए' गिट 'चलाएं। यदि मास्टर नामक कुछ भी है जो 'refs/head/master' या 'refs/remotes/origin/master' नहीं है, तो यह एक समस्या हो सकती है। – Cascabel
मैंने "सर्वोत्तम प्रथाओं" सलाह देखी है जो 'पुल' को 'पुल -फ-केवल' में अलियासिंग करने का सुझाव देती है, जिससे आप जिस स्थिति का वर्णन कर रहे हैं उसका कारण बन जाएगा। मैं विशेष रूप से उस के लिए जांच करूँगा। – Clueless
@Clueless: आह, हाँ, मैंने यह देखने के लिए जांच की कि क्या 'pull.ff-only' config विकल्प था, लेकिन मैंने इसके बारे में नहीं सोचा था। एक अच्छा अनुमान लग रहा है! – Cascabel