2015-06-01 11 views
6

के अंदर नामित फ़ाइलों को मैं एक टीम में एक नया प्रोग्रामर हूं। और मेरा पहला दिन पर मैं एक मंच के अंदर इस नाम बदली गई फ़ाइल Git द्वारा प्रतिबद्ध होने के लिए तैयार है,:गिट

$ git status 
On branch master 
Changes to be committed: 
    (use "git reset HEAD <file>..." to unstage) 

     modified: .gitignore 
     new file: reports/SQLS.rar 
     renamed: account/enter_rules.php -> enter_rules.old.php 

Changes not staged for commit: 
    (use "git add/rm <file>..." to update what will be committed) 
    (use "git checkout -- <file>..." to discard changes in working directory)  
     deleted: account/enter_rules.old.php 

Untracked files: 
    (use "git add <file>..." to include in what will be committed) 

     account/enter_rules.php 

पहले 2 लाइनों मैं कोई समस्या नहीं है हैं। मुझे पता है कि क्या हो रहा है। लेकिन पिछले एक के लिए का नाम बदला गया:, मुझे यकीन नहीं है कि क्या किया जाना चाहिए। प्रणाली अच्छी काम कर रही है।

काम निर्देशिका के अंदर मेरे पास है:

account/enter_rules.php 

मैं enter_rules.old.php फ़ाइल नहीं मिल रहा।

ऐसा लगता है अन्य प्रोग्रामर फ़ाइल से एक प्रतिलिपि, .old के रूप में वास्तविक नाम बनाया है, कुछ परीक्षण और नए कोड, बनाया से परिवर्तन का मंचन किया और प्रतिबद्ध करने के लिए भूल गया था। मैन्युअल रूप से old.php

इस स्थिति से निपटने के लिए सबसे अच्छा तरीका क्या होना चाहिए? मैं इस पर काम करना शुरू करने और अपने स्वयं के परिवर्तन करने से पहले गिट स्थिति को स्पष्ट करना चाहता हूं।

मुझे यह पोस्ट मिला लेकिन मुझे यकीन नहीं है कि मुझे अपनी स्थिति में क्या करना चाहिए या नहीं कर सकता।

  1. मैं सिर्फ फ़ाइल enter_rules.php
  2. मैं "से (केवल सुरक्षित के लिए) एक प्रतिलिपि बना: Handling file renames in git


    सभी सुझावों, कि मुझे बहुत मदद की पढ़ने के बाद, इस मैं क्या किया है "गिट (इंडेक्स में) को बताया कि फ़ाइल का नाम बदल दिया गया है। $git commit -m "committing name changes"। इस बिंदु पर गिट यह नहीं जानता .old हटा दिया गया था।

  3. फिर मैंने लाइन को हल करने के लिए $git rm "account/enter_rules.old.php" टाइप किया: परिवर्तन के लिए चरणबद्ध नहीं किए गए परिवर्तन:। उसी तरह हमको ट्रैक करने के लिए गिट को "बताना" करने के लिए $git add . का उपयोग करते हैं, हमें को भूलने के लिए गिट को "बताने" के लिए $git rm <file> का उपयोग करना चाहिए।
  4. तब मैं $git status टाइप किया और मैं ग्रीन संदेश मिला: नष्ट कर दिया: खाता/enter_rules.old.php। तो मुझे इंडेक्स को बताना चाहिए कि .old फ़ाइल हटा दी गई थी। मैं $git commit -m "committing delete changes"
  5. टाइप किया अब Git जानता है कि enter_rules.phpenter_rules.old.php को नाम दिया गया था और उसके बाद enter_rules.old.php हटा दिया गया था (हटाया गया)।
  6. तब मैं आखिरी पंक्ति (ट्रैक न किए गए फ़ाइलों :) हल किया। मैं सिर्फ git करने के लिए है कि एक नई फ़ाइल बनाया गया था बताया और यह enter_rules.php कहता है। मैं जोड़ लिया है और प्रतिबद्ध के रूप में यह होना चाहिए।

सभी सुझावों ने मुझे इस मुद्दे को हल करने में मदद की, इसलिए मैं निष्पक्ष होने की कोशिश करूंगा और चेक दूंगा जिसके पास कम बिंदु है।

+0

यह बहुत अजीब है। आप जो कह रहे हैं उसके आधार पर और क्या 'गिट स्टेटस' दिखाता है, ऐसा लगता है कि आपके सहकर्मी ने 'git mv enter_rules.php enter_rules.old.php' चलाया और फिर उस फ़ाइल को enter_rules.php पर कॉपी किया? वो ऐसा क्यों करेगा? – DIMMSum

+0

बस स्पष्ट होने के लिए। आपको * enter_rules.old.php' की आवश्यकता नहीं है लेकिन आपको 'खाता/enter_rules.php' की आवश्यकता है, सही? – DIMMSum

+0

हाय डेकवे, मैंने सूचना बदल दी है। मुझे सभी गिट आउटपुट पेस्ट करना चाहिए। ऐसा लगता है कि उन्होंने फ़ाइल से एक प्रति बनाई है और .old.php नाम दिया है। उन्होंने कोड में कुछ बदलाव किए हैं। शायद यह काम किया। उन्होंने .old फ़ाइल को हटा दिया और चरण में जोड़ा। मैं बिल्कुल नहीं जानता कि क्या हुआ। लेकिन अब मेरे पास यह स्थिति है जो आप आउटपुट गिट में देखते हैं। – zwitterion

उत्तर

1

यह मेरे लिए स्पष्ट लगता है कि यहां क्या हुआ:

प्रारंभिक अवस्था में वहाँ दो फ़ाइलों account/enter_rules.php और account/enter_rules.old.php थे।

आपका सहयोगी कुछ इस तरह किया होगा:

git rm account/enter_rules.old.php 
git mv account/enter_rules.php account/enter_rule.old.php 

फिर एक नया account/enter_rules.php संपादित और यह unstaged छोड़ दिया है।

आप परिवर्तनों को ठीक लगता है सिर्फ

git add account/enter_rules.php 
git commit 
बाकी

rm account/enter_rules.php 
git reset HEAD 

अपने परिवर्तनों को पूर्ववत् करने।

मेरे लिए कितना अजीब बात है कि आप एक सहकर्मी के अनुयायी क्लोन पर असामान्य परिवर्तनों के साथ क्यों काम कर रहे हैं?

+0

जैसा कि मैंने बताया था। मैं अभी टीम में पहुंचा हूं। तो मैं एक और प्रोग्रामर बदल रहा हूँ। मैं सब कुछ ठीक करने की उम्मीद कर रहा था। कोड शुरू करने के लिए बस साफ़ करें। – zwitterion

+0

ऐसा लगता है कि उन्होंने काम खत्म किए बिना नौकरी छोड़ी (मतलब सभी परिवर्तनों को पूरा करना) – zwitterion

1

हालांकि git का कहना है कि enter_rules.old.php नाम दिया गया था, यह भी कहना है कि यह नीचे नष्ट कर दिया गया:

Changes not staged for commit: (use "git add/rm <file>..." to update 
what will be committed) (use "git checkout -- <file>..." to discard 
changes in working directory)  
     deleted: account/enter_rules.old.php 

इसका मतलब है कि फ़ाइल गया है, और git के लिए क्रम में भंडार है कि हटाए जाने के लागू करने के लिए, इसे हटाने की कार्रवाई को आपके प्रतिबद्धता में शामिल किया जाना चाहिए। क्योंकि परिवर्तन ट्रैक किया गया है, लेकिन मंचित नहीं है, आप इसे एक साधारण कमांड (भाग 3 में नीचे वर्णित) के साथ कर सकते हैं।

  1. account/enter_rules.php में फ़ाइल git add account/enter_rules.php का उपयोग करके फ़ाइल जोड़ें।
  2. यदि आप git status फिर से चलाते हैं, तो enter_rules.old.php को हटाने के लिए चिह्नित किया जाना चाहिए, और account/enter_rules.php को प्रतिबद्ध करने के लिए चरणबद्ध होना चाहिए।
  3. अपने सभी चरणबद्ध परिवर्तनों को करने के लिए git commit --all चलाएं।

git commit --all चलाकर, यह आपके सहकर्मी द्वारा किए गए विलोपन को भी चरणबद्ध करेगा लेकिन खुद को प्रतिबद्ध नहीं करेगा।

ऐसा लगता है कि फ़ाइल का नाम बदलने के लिए आपके सहकर्मी git mv का उपयोग किया गया था, और फिर इसे हटा दिया गया था लेकिन हटाए जाने की स्थिति नहीं थी।

1

गिट आपके काम करने वाले फ़ोल्डर में फ़ाइलों पर काम नहीं करता है। इसके बजाय, अगर "इंडेक्स" नामक किसी चीज़ पर काम करता है। इसका मतलब है कि आप फ़ाइलों को बदल सकते हैं, उन्हें इंडेक्स में डाल सकते हैं ("जल्द ही, मैं ...") और सूचकांक को git commit के साथ स्थायी बना सकता हूं।

मुख्य लाभ यह है कि यहाँ आप अलग-अलग आदेश (जब आप कई परिवर्तन किए हैं और उन्हें अलग-अलग करता में डाल करना चाहते हैं की तरह) के साथ सूचकांक में कई बदलाव इकट्ठा कर सकते हैं। इस प्रक्रिया को "स्टेजिंग" कहा जाता है। उदाहरण के लिए, git add इंडेक्स पर काम करता है।

अपने मामले में क्या हुआ है:

  1. आप फ़ाइल (अपने आईडीई में शायद) का नाम और Git करने के लिए "मंच" परिवर्तन को बताया। गिट इंडेक्स में इसे याद करता है।
  2. आपने गिट
  3. बताए बिना फ़ाइल को हटा दिया है, आपको कहीं से account/enter_rules.php की प्रति मिली है और गिट को बताए बिना भी आपके काम करने वाले फ़ोल्डर में कॉपी की गई है।

गिट के लिए, स्थिति अब यह जानती है कि यह एक बार enter_rules.old.php फ़ाइल थी जिसे आप प्रतिबद्ध करना चाहते थे। आप ऐसा कर सकते हैं क्योंकि गिट वास्तव में ऐसा करने के लिए पर्याप्त याद करता है।

इसी समय, अपने कार्यक्षेत्र में बहुत कुछ बदल गया है। मंचित फ़ाइल चली गई है और एक नई प्रति दिखाई दी है। चूंकि Git अपने मन नहीं पढ़ सकते हैं, यह पता लगाने के लिए इसका क्या मतलब हो सकता है की कोशिश नहीं करता। यह सिर्फ तथ्यों की सूची है।

अब साफ करने के लिए:

Git enter_rules.old.php के नाम बदलने के बारे में भूल करने के लिए, का उपयोग git reset HEAD enter_rules.old.php

अब यह याद रखना चाहिए कि account/enter_rules.php पर नज़र रखी है। आप इस फ़ाइल को बदला है, तो यह है कि यह के रूप में बदल दिया दिखाएगा। git status सुनिश्चित करना।

+1

सबसे अधिक संभावनाएं '2' और '3' जहां वास्तव में फ़ाइल को फिर से नामित किया गया है, लेकिन इसके बारे में गिट बताए बिना ... –

+1

@ umläute Ah yes, यह समझ में आता है –