Git प्रतिबद्ध से फ़ाइलें निकालें


1611

मैं Git का उपयोग कर रहा हूं और मैंने कुछ फाइलों का उपयोग किया है

git commit -a

बाद में, मैंने पाया कि एक फाइल गलती से कमेट में जुड़ गई थी।

मैं अंतिम प्रतिबद्ध से एक फ़ाइल कैसे निकाल सकता हूं?


2
यह लिंक आपके प्रश्न के लिए एकदम सही है: stackoverflow.com/questions/307828/…
b3h3m0th

@CharlesB: हाँ, यह मेरी आखिरी प्रतिबद्धता है
लल्ली

8
क्या आपने सर्वर के लिए प्रतिबद्ध किया है?
परितोष सिंह

4
मैं अभी इसका उपयोग करता हूं:git reset filepath
felipekm

जवाबों:


3086

मुझे लगता है कि यहां अन्य उत्तर गलत हैं, क्योंकि यह गलत तरीके से प्रतिबद्ध फाइलों को पिछली प्रतिबद्धताओं से वापस मचान क्षेत्र में स्थानांतरित करने का सवाल है, बिना उन पर किए गए परिवर्तनों को रद्द किए बिना। यह किया जा सकता है जैसे परितोष सिंह ने सुझाव दिया:

git reset --soft HEAD^ 

या

git reset --soft HEAD~1

फिर अवांछित फ़ाइलों को रीसेट करें ताकि उन्हें कमिट से बाहर किया जा सके:

git reset HEAD path/to/unwanted_file

अब फिर से प्रतिबद्ध करें, आप भी उसी प्रतिबद्ध संदेश का फिर से उपयोग कर सकते हैं:

git commit -c ORIG_HEAD  

86
इसके लिए धन्यवाद। यह जोड़ने योग्य है कि यदि आपने पहले ही अपनी (गलत) प्रतिबद्ध को धक्का दे दिया है, और अब git pushअपने रेपो को ठीक करने का प्रयास करें, तो यह शिकायत करेगा Updates were rejected because the tip of your current branch is behind its remote counterpart.। यदि आप सुनिश्चित हैं कि आप उन्हें पुश करना चाहते हैं (जैसे कि यह आपका कांटा है), तो आप -fपुश का उपयोग करने के लिए विकल्प का उपयोग कर सकते हैं , जैसे git push origin master -f। (एक अपस्ट्रीम रेपो के लिए ऐसा न करें जो दूसरों से प्राप्त कर रहे हैं)
andy magoon

57
git reset --soft HEAD^मेरा सबसे आम पूर्ववत ऑपरेशन है
फ़नल

2
@ पाब्लोफर्नांडीज, सबसे पहले, स्वीकृत जवाब ओपी की तलाश में था (इसके अलावा, इसे महीनों पहले पोस्ट किया गया था) हो सकता है। दूसरे, स्वीकार किए गए उत्तर हमेशा अप वोट की संख्या की परवाह किए बिना शीर्ष पर होते हैं।
21

4
सभी जवाबों में सबसे ऊपर @PloloFernandez तीन टैब हैं जो आपको उत्तरों के क्रम को नियंत्रित करने की अनुमति देते हैं: सक्रिय , सबसे पुराना और वोट । मेरा अनुमान है कि तुम्हारा सबसे पुराना है । इसे वोट पर स्विच करें भले ही स्वीकृत उत्तर अभी भी शीर्ष पर होगा, यह उत्तर दूसरा होगा।

15
मैं इसके बारे में बहुत कुछ जानता था, git resetलेकिन मौजूदा कमिट को "जगह" पर प्रभावित करने का एक तरीका चाहता था। मैं बस के बारे में सीखा है git commit -C। तो मेरे लिए, जो मैं चाहता हूं वह एक और कदम के साथ आपकी सटीक नुस्खा है, "नई प्रतिबद्ध फिर से" के रूप में वर्तनी git commit -C [hash of original HEAD commit from first step]
23

323

ध्यान ! यदि आप केवल अपनी पिछली कमिट से कोई फ़ाइल निकालना चाहते हैं, और उसे डिस्क पर रखना चाहते हैं , तो ऊपर दिए गए लिंक पर जज़लिन पढ़ें ।

यदि यह आपकी अंतिम प्रतिबद्धता है और आप फ़ाइल को अपने स्थानीय और दूरस्थ भंडार से पूरी तरह से हटाना चाहते हैं , तो आप यह कर सकते हैं:

  1. फ़ाइल को हटा दें git rm <file>
  2. संशोधन ध्वज के साथ प्रतिबद्ध: git commit --amend

संशोधन ध्वज फिर से प्रतिबद्ध करने के लिए कहता है, लेकिन "मर्ज" (दो शाखाओं को विलय करने के अर्थ में नहीं) यह अंतिम प्रतिबद्ध के साथ प्रतिबद्ध है।

जैसा कि टिप्पणियों में कहा गया है, git rmयहां का उपयोग करना rmस्वयं कमांड का उपयोग करने जैसा है!


120
आप git rm --cachedफ़ाइलों को डिस्क पर रखने के लिए भी उपयोग कर सकते हैं
अरकादि कुकरकिन

14
इस उत्तर को ब्राउज़ करने वालों को चेतावनी: सुनिश्चित करें कि आप फ़ाइल को डिलीट करना चाहते हैं (जैसे कि चला गया!), न केवल इसे कमिट सूची से हटा दें।
स्कॉट बिग्स

8
दूसरों को क्या कहना जोड़ने के लिए (और यह आसान है जब तक आप वास्तव में करना चाहते हैं यह करने के लिए नहीं याद करने के लिए बनाने के लिए): में आदेश है क्या खुद करता है! rmgitrm
यो '

@CharlesB क्या आप अधिक दृश्यता देने के लिए अपने जवाब में अर्कादी कुकारिन की टिप्पणी से नोट जोड़ सकते हैं?
mopo922

2
ध्यान दें कि फ़ाइलों को अभी भी बहाल किया जा सकता है, यदि आपने अपना दिमाग बदल दिया है, तो पहले की गई प्रतिबद्धता git commit --amendअभी भी है और उदाहरण के लिए मिल सकती है git reflog। इसलिए यह उतना बुरा नहीं है जितना कि अन्य टिप्पणियां बताती हैं।
स्टोहान

165

मौजूदा उत्तर सभी अवांछित फाइलों को अंतिम प्रतिबद्ध से हटाने की बात कर रहे हैं ।

यदि आप पुरानी फ़ाइलों (यहां तक ​​कि धक्का दिया गया) से अवांछित फ़ाइलों को हटाना चाहते हैं और कार्रवाई के कारण एक नई प्रतिबद्धता नहीं बनाना चाहते हैं, जो अनावश्यक है:

1।

वह कमिटमेंट खोजें जिसे आप चाहते हैं कि फाइल उसके अनुरूप हो।

git checkout <commit_id> <path_to_file>

यदि आप कई फ़ाइलों को निकालना चाहते हैं, तो आप इसे कई बार कर सकते हैं।

2।

git commit -am "remove unwanted files"

3।

उस कमेटी की कमेटी का पता लगाएं, जिस पर गलत तरीके से फाइलें जोड़ी गई थीं , चलिए यहां "35c23c2" कहते हैं

git rebase 35c23c2~1 -i  // notice: "~1" is necessary

यह कमांड आपकी सेटिंग्स के अनुसार संपादक को खोलता है। डिफ़ॉल्ट एक विम है।

अंतिम कमिट को स्थानांतरित करें, जो "अनचाहे फाइलों को हटा दें", गलत कमिट की अगली पंक्ति (हमारे मामले में "35c23c2") होनी चाहिए, और कमांड को इस प्रकार सेट करें fixup:

pick 35c23c2 the first commit
fixup 0d78b28 remove unwanted files

फ़ाइल को सहेजने के बाद आपको अच्छा होना चाहिए।

को खत्म करने :

git push -f

यदि आप दुर्भाग्य से संघर्ष करते हैं, तो आपको उन्हें स्वयं हल करना होगा।


2
नैनो के साथ ऐसा करना शानदार है! Ctrl + K, Ctrl + U, 'f', Ctrl + X, 'y', और voila डालें!
सीक्वेलो

6
यदि आप वास्तव में रेपो (फाइलसिस्टम नहीं) से फाइलों को हटाना चाहते हैं, बजाय केवल उन्हें पिछले संस्करण में वापस लाने के, तो चरण 1 के बजाय git rm --cached <file(s)>
वाल्ड्रियस

2
प्रतीक्षा करें कि आप अपनी इच्छानुसार इंटरएक्टिव-रिबेस फाइल के चारों ओर कमिट कर सकते हैं?
दान रोसेनस्टार्क

2
आप पूरी तरह से कर सकते हैं, लेकिन आप संघर्ष कर सकते हैं (या नहीं कर सकते हैं)।
ब्रायन

6
इस प्रक्रिया को जोड़कर थोड़ा आसान बनाया जा सकता है --fixup=35c23c2करने के लिए git commitआदेश। यह आवश्यक कमिट के फिक्सअप के रूप में कमिट को स्वचालित रूप से सेटअप कर देगा और इसलिए आपको इसे रिबेस में निर्दिष्ट करने की आवश्यकता नहीं होगी। साथ ही, यदि आप जोड़ना --autosquashकरने के लिए git rebaseआदेश, Git स्वचालित रूप से अपना सही स्थान के लिए प्रतिबद्ध है, तो आप इंटरैक्टिव रिबेस में कुछ भी करने की जरूरत नहीं है पर आ जाएगा - बस परिणाम को बचाने (आप भी करने की जरूरत नहीं है जिसका अर्थ है -iझंडा, हालांकि मुझे यह सुनिश्चित करने के लिए इसका उपयोग करना पसंद है कि सबकुछ वैसा ही हो जैसा मुझे उम्मीद है।
गूस

144

जैसा कि स्वीकृत उत्तर इंगित करता है, आप पूरी प्रतिबद्धता को रीसेट करके ऐसा कर सकते हैं। लेकिन यह एक भारी हाथ है।
ऐसा करने का एक साफ तरीका यह होगा कि आप कमिट रखें, और बदले हुए फाइल को इसमें से हटा दें।

git reset HEAD^ -- path/to/file
git commit --amend --no-edit

git resetके रूप में यह पिछले में था फ़ाइल लेने के लिए प्रतिबद्ध है, और सूचकांक में यह मंच होगा। कार्य निर्देशिका में फ़ाइल अछूती है।
इसके git commitबाद वसीयत और वर्तमान प्रतिबद्ध में सूचकांक स्क्वैश करेगा।

यह अनिवार्य रूप से उस फ़ाइल का संस्करण लेता है जो पिछली प्रतिबद्ध में था और इसे वर्तमान प्रतिबद्ध में जोड़ता है। इससे कोई शुद्ध परिवर्तन नहीं होता है, और इसलिए फ़ाइल प्रभावी रूप से कमिट से निकाल दी जाती है।


5
पूरी कमिटमेंट को ओवरहॉल किए बिना सिर्फ एक ही फाइल को हटाने के लिए यह एक बेहतर जवाब है।
निमिष करें

यह इस उत्तर के समान ही है: D stackoverflow.com/a/27340569/1623984
Thatsamorais

@TssAMorais वास्तव में :-)। मुझे आश्चर्य है कि अगर यह सवाल दूसरे के साथ विलय हो गया, और यही कारण है कि मैंने इसे नहीं देखा। या शायद मैं सिर्फ अंधा हूं। किसी भी मामले में, मुझे लगता है कि मैं इसे वोटों के आधार पर छोड़ने के लिए इच्छुक हूं क्योंकि यह अधिक लोकप्रिय प्रतीत होता है (शायद लोग छोटे और सीधे उत्तर पसंद करते हैं)।
पैट्रिक

हर तरह से इसे छोड़ दो! :) हमारे पास स्पष्ट रूप से सही विचार था, और उद्देश्य मदद करना है। मुझे लगता है कि विलय एक अच्छा सिद्धांत है।
थटामोराईस

यदि आप पहले से ही जीथूब पर एक शाखा में धकेल देते हैं तो आप यह कैसे करते हैं? मैंने यह ठीक करने के बाद धक्का देने की कोशिश की और संदेश मिला "अपडेट अस्वीकार कर दिए गए क्योंकि आपकी वर्तमान शाखा का टिप संकेत के पीछे है: इसका दूरस्थ समकक्ष।"
ओली विलियम्स

41

यदि आपने सर्वर पर उन परिवर्तनों को नहीं धकेल दिया है जिनका आप उपयोग कर सकते हैं

git reset --soft HEAD~1

यह सभी परिवर्तनों को रीसेट कर देगा और एक कमिट बैक में वापस आ जाएगा

यदि आपने अपने परिवर्तनों को आगे बढ़ाया है तो @CharlesB द्वारा उत्तर दिए गए चरणों का पालन करें


2
-1 git रिसेट हटाता है परिवर्तन मंचन क्षेत्र से फ़ाइल हुआ, यहाँ परिवर्तन किया गया है
चार्ल्स सिप

ठीक है, लेकिन मैं अपना
डाउनवॉट रखूंगा

ठीक है मेरे लिए ठीक है, लेकिन प्रतिद्वंद्वी ऐसा क्यों नहीं चाहते हैं। समस्या क्या है?
परितोष सिंह

एक बड़ी बात नहीं है, लेकिन क्योंकि ओपी अंतिम प्रतिबद्ध से अवांछित फ़ाइल को निकालना चाहता है, और यह केवल प्रतिबद्ध होने से पहले राज्य में रहता है। फिर भी आपको प्रतिबद्ध को फिर से करना होगा।
चार्ल्स सिप

3
@ उपयोग में परिवर्तन देखने के लिए <git diff --cached>
Paritosh Singh

37

Rm का उपयोग करके फ़ाइल को हटाने से यह नष्ट हो जाएगा!

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

फ़ाइल को कुछ पिछली स्थिति में लौटने के लिए:

    git checkout <commit_id> <path_to_file>

या इसे रिमोट हेड पर राज्य को वापस करने के लिए:

    git checkout origin/master <path_to_file>

फिर कमिट में संशोधन करें और आपको पता लगाना चाहिए कि फ़ाइल सूची से गायब हो गई है (और आपकी डिस्क से डिलीट नहीं हुई है!)


36
git checkout HEAD~ path/to/file
git commit --amend

1
यह अंतिम प्रतिबद्ध को संशोधित करने का सबसे अच्छा तरीका है, जिसे धक्का नहीं दिया गया है। यह एक फ़ाइल में परिवर्तन को रीसेट करेगा, प्रभावी रूप से उस फ़ाइल को अंतिम प्रतिबद्ध से हटा देगा।
एलेक्स ब्रावो

इससे फाइल भी बदल गई। फ़ाइल में स्थानीय परिवर्तनों को कैसे संरक्षित करें?
Theonlygusti

29

निम्न आपके द्वारा इच्छित फ़ाइल को अप्रतिबंधित करेगा, जो कि ओपी ने पूछा था।

git reset HEAD^ /path/to/file

आपको निम्न जैसा कुछ दिखाई देगा ...

किए जाने वाले परिवर्तन: ("रीसेट रीसेट HEAD ..." को अनस्टेज करने के लिए)

संशोधित: / पथ / से / फ़ाइल

परिवर्तन के लिए प्रतिबद्ध नहीं हैं: (कार्य करने के लिए "git add ..." का उपयोग करें) जो काम करने के लिए प्रतिबद्ध होंगे ("git checkout - ..." का उपयोग करके कार्यशील निर्देशिका में परिवर्तन छोड़ दें)

संशोधित: / पथ / से / फ़ाइल

  • "किए जाने वाले परिवर्तन" कमिट से पहले फ़ाइल का पिछला संस्करण है। यह एक विलोपन की तरह दिखेगा यदि फ़ाइल कभी अस्तित्व में नहीं थी। यदि आप यह परिवर्तन करते हैं, तो एक संशोधन होगा जो आपकी शाखा में फ़ाइल में परिवर्तन को बदल देता है।
  • "परिवर्तन के लिए प्रतिबद्ध नहीं" आपके द्वारा किए गए परिवर्तन और फ़ाइल की वर्तमान स्थिति है

इस बिंदु पर, आप फ़ाइल के लिए जो चाहें कर सकते हैं, जैसे कि एक अलग संस्करण में रीसेट करना।

जब आप प्रतिबद्ध होने के लिए तैयार हों:

git commit --amend -a

या (यदि आपको कुछ अन्य परिवर्तन करने हैं, जो आप अभी तक नहीं करना चाहते हैं)

git commit add /path/to/file
git commit --amend

3
जज़लिन का जवाब बहुत अच्छा है, लेकिन जब आप केवल एक को अस्थिर करने की इच्छा रखते हैं, तो यह पूरी तरह से अस्थिर करने के लिए अत्यधिक है। यदि आप वर्तमान में फ़ाइलों में परिवर्तन नहीं कर पा रहे हैं, तो पूरी तरह से प्रतिबद्ध करने से समस्याएँ पैदा हो सकती हैं।
थासामोराईस

27

मैं आपको उदाहरण के साथ समझाऊंगा।
A, B, C को क्रमिक 3 कार्य करने दें। कमिट बी में एक फाइल होती है जिसे कमिट नहीं किया जाना चाहिए था।

git log  # take A commit_id
git rebase -i "A_commit_ID" # do an interactive rebase
change commit to 'e' in rebase vim # means commit will be edited
git rm unwanted_file
git rebase --continue
git push --force-with-lease <branchName>    

यदि विशेष फ़ाइल अंतिम या पिछली प्रतिबद्ध में नहीं है, तो यह सबसे सुरुचिपूर्ण तरीका है। मैं यह भी कहूंगा कि यह सामान्य रूप से सबसे सुंदर तरीका है। मुझे इंटरएक्टिव रिबासिंग पसंद है।
bvgheluwe

के लिए एक एकल के लिए प्रतिबद्ध हैं, तो परिवर्तन noopकरने के लिए edit [A_commit_ID]याe [A_commit_ID]
TamusJRoyce

23

आप बस कोशिश कर सकते हैं।

git reset --soft HEAD~1

और एक नई प्रतिबद्धता बनाएं।

हालाँकि, एक कमाल का सॉफ्टवेयर है "gitkraken"। जिसके कारण git के साथ काम करना आसान हो जाता है।


1
और बस ध्यान दें: इसके बाद, आप git commit --amendअपनी अंतिम प्रतिबद्ध में फ़ाइल को हटाने के लिए अद्यतन करेंगे; और बाद में, आप देख सकते हैं कि इसे वास्तव में हटा दिया गया हैgit log -1 --stat
sdbbs

13
git rm --cached <file_to_remove_from_commit_<commit_id>_which_added_file>
git commit -m "removed unwanted file from git"

अभी भी आपको स्थानीय फ़ाइल छोड़ देगा। यदि आप फ़ाइल स्थानीय रूप से नहीं चाहते हैं, तो आप --cached विकल्प को छोड़ सकते हैं।

यदि सभी कार्य आपकी स्थानीय शाखा पर हैं, तो आपको फ़ाइल को बाद में रखने की आवश्यकता है, और एक स्वच्छ इतिहास होने की तरह, मुझे लगता है कि ऐसा करने का एक सरल तरीका हो सकता है:

git rm --cached <file_to_remove_from_commit_<commit_id>_which_added_file>
git commit --squash <commit_id>
git add <file_to_remove_from_commit_<commit_id>_which_added_file>
git commit -m "brand new file!"
git rebase --interactive <commit_id>^

और फिर आप अधिक जटिल आदेशों को याद करने या संदेश या प्रकार को याद किए बिना आसानी से छूट को समाप्त कर सकते हैं।


यह मेरे लिए काम करता है। मुझे लगता है कि यदि आप फ़ाइलों को वापस मिश्रण में जोड़ना चाहते हैं, तो बस git ऐड-ए या git ऐड का उपयोग करें। और वे वापस आ गए हैं।
अलेक्जेंडर मिल्स

11

जीआईटी जीयूआई का उपयोग करके पूर्व की ओर से एक फ़ाइल को हटाने को सरल बनाया जा सकता है।

यह मानते हुए कि यह एक साझा शाखा नहीं है और आपको इतिहास को फिर से लिखने का मन नहीं है , तो दौड़ें:

git gui citool --amend

आप गलती से किए गए फ़ाइल को अन-चेक कर सकते हैं और फिर "कमिट" पर क्लिक कर सकते हैं।

यहां छवि विवरण दर्ज करें

फाइल को कमिट से हटा दिया जाता है, लेकिन डिस्क पर रखा जाएगा । इसलिए अगर आपने गलती से जोड़ने के बाद फाइल को अन-चेक किया है, तो यह आपकी अनट्रेक्टेड फाइल्स लिस्ट में दिखाई देगा (और अगर आपने गलती से मॉडिफाई करने के बाद फाइल को अन-चेक किया है तो यह आपके बदलावों में दिखाएगा कि कमिट लिस्ट का मंचन नहीं हुआ है)।


2
उबंटू पर, आप git gui कोsudo apt-get install git-gui
JDiMatteo

धन्यवाद! मैं एक समस्या (बग?) के साथ फंस गया था, जहां एक .गित रेपो युक्त एक फ़ोल्डर जोड़ा गया था, और सभी नियमित रूप से हटाए गए कमांड काम नहीं करते थे। हालांकि इससे मदद मिली। यह कुछ हद तक वापस आ रहा है, मैंने पहले उपयोग किया git rebase -i HEAD~4और फिर संपादक को खोलने के लिए आपकी कमांड को चलाया। एक और नोट: "अनस्टैजिंग" "कमिट" मेनू में पाया जा सकता है।
जॉनी स्कोवडाल

सब से आसान उपाय। याद करने में सरल। और उपयोग करने की तुलना में बहुत कम त्रुटि-प्रवण git reset --soft HEAD^(--soft arg को याद रखना), इसके बाद git commit -c ORIG_HEAD(इसके बजाय - आघात से, जो सब कुछ खराब कर देता है)।
ब्रेंट फस्ट

9

यदि आप अपनी कमिटमेंट को संरक्षित करना चाहते हैं (हो सकता है कि आपने पहले से ही कुछ समय बिताकर एक विस्तृत कमिट मैसेज लिख दिया हो और इसे खोना नहीं चाहते), और आप केवल कमिट से फाइल को हटाना चाहते हैं, लेकिन रिपॉजिटरी से पूरी तरह से नहीं:

git checkout origin/<remote-branch> <filename>
git commit --amend

6

निम्नलिखित आदेशों का एक क्रम करें:

//to remove the last commit, but preserve changes  
git reset --soft HEAD~1

//to remove unneded file from the staging area  
git reset HEAD `<your file>` 

//finally make a new commit  
git commit -m 'Your message'

मैंने इन चरणों को करने की कोशिश की है, और मुझे यह त्रुटि दिखाई देती है: 'रेफ ....' के लिए कुछ रिफ को धकेलने में विफल रहा। आपको इतिहास को खोने से रोकने के लिए, गैर-फास्ट-फ़ॉरवर्ड अपडेट को अस्वीकार कर दिया गया जो दूरस्थ परिवर्तन (जैसे) 'गिट पुल') फिर से धक्का देने से पहले। विवरण के लिए 'git push --help' के 'फास्ट-फॉरवर्ड' सेक्शन के बारे में नोट देखें। (गिट पुल के बाद मेरे पास समान परिवर्तन हैं)
डिजीगो

इसका अर्थ है कि जब आप अपना स्थानीय काम कर रहे थे, तब आपके रिमोट रेपो की स्थिति बदल गई थी। और 'गिट पुल' के बाद आपके स्थानीय परिवर्तनों को दूरस्थ लोगों के साथ विलय कर दिया जाना चाहिए, बस। निश्चित रूप से, आपके परिवर्तन अवश्य रहेंगे।
सेर्गेई ओनिशेंको

दूसरे शब्दों में, यदि आपको वह त्रुटि मिलती है @Dezigo, अपडेट को बाध्य करने के लिए -f ध्वज जोड़ें।
जंगलेव

5

जैसा कि मुझे एक अतिरिक्त आदेश चलाना था, बस शीर्ष उत्तर को पूरक करना चाहता था:

git reset --soft HEAD^
git checkout origin/master <filepath>

चीयर्स!


स्वागत हे। यह उत्तर बेहतर होगा यदि आपने समझाया कि कमांड वास्तव में क्या करते हैं।
मार्क चोरले

3

मेरे लिए कुछ काम किया, लेकिन फिर भी लगता है कि एक बेहतर समाधान होना चाहिए:

$ git revert <commit_id>
$ git reset HEAD~1 --hard

दूसरे कमिट में आप जो बदलाव छोड़ना चाहते हैं, उसे छोड़ दें, दूसरों को देखें

$ git commit --amend // or stash and rebase to <commit_id> to amend changes

3

git reset --soft HEAD^हवाओं ने आपकी प्रतिबद्धता को वापस कर दिया, और जब आप टाइप करते हैं git status, तो यह आपको बताता है कि क्या करना है:

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

2

वास्तव में, मुझे लगता है कि git rebase इंटरेक्टिव मोड का उपयोग करने का एक तेज़ और आसान तरीका है।

git rebase -i head~1  

(या सिर ~ 4, आप कितनी दूर जाना चाहते हैं)

और फिर 'पिक' के बजाय 'एडिट' का इस्तेमाल करें। मुझे महसूस नहीं हुआ कि 'एडिट' कितना शक्तिशाली है।

https://www.youtube.com/watch?v=2dQosJaLN18

आशा है आपको यह मददगार लगेगा।


वीडियो 10 मिनट का है और इतना उपयोगी नहीं है
मोलबोर्ग

2

एक ही मुद्दा था जहाँ मैं एक स्थानीय शाखा में परिवर्तन करता हूँ जहाँ मैं सिर्फ एक फ़ाइल को वापस करना चाहता था। मेरे लिए क्या काम था -

( सुविधा / target_branch नीचे वह जगह है जहां मेरे पास मेरे सभी परिवर्तन हैं जिनमें मैं एक विशिष्ट फ़ाइल के लिए पूर्ववत करना चाहता था)

( उत्पत्ति / सुविधा / target_branch वह दूरस्थ शाखा है जहाँ मैं अपने परिवर्तनों को धकेलना चाहता हूँ)

( फ़ीचर / स्टेजिंग मेरी अस्थायी स्टेजिंग ब्रांच है, जहाँ मैं उस एक फाइल में बदलाव को छोड़कर अपने सभी वांछित बदलावों पर जोर दूंगा)

  1. मेरे मूल / सुविधा / target_branch से एक स्थानीय शाखा बनाएँ - इसे सुविधा / मंचन कहा जाता है

  2. मेरी कार्यशील स्थानीय शाखा सुविधा / target_branch को सुविधा / स्टेजिंग शाखा में विलय कर दिया

  3. जाँच की गई सुविधा / स्टेजिंग तो git रीसेट --soft ORIG_HEAD (अब फीचर / स्टेजिंग से सभी परिवर्तन 'का मंचन किया जाएगा लेकिन अप्रकाशित।)

  4. अनावश्यक रूप से परिवर्तन के साथ मैंने पहले से जाँच की गई फ़ाइल को बंद कर दिया

  5. मूल / सुविधा / target_branch को फ़ीचर / स्टेजिंग के लिए अपस्ट्रीम शाखा को बदल दिया

  6. मंचन के बाकी हिस्सों को प्रतिबद्ध किया और मेरे दूरस्थ मूल / सुविधा / target_branch को ऊपर की ओर धकेल दिया


1

यदि आपको उस फ़ाइल की आवश्यकता नहीं है, तो आप कर सकते हैं

git rm file
git commit --amend
git push origin branch

1

यदि आप GitHub का उपयोग कर रहे हैं और अभी तक कमिट नहीं किया है, तो GitHub डेस्कटॉप इस समस्या को आसानी से हल करता है:

  1. रिपॉजिटरी चुनें -> सबसे हाल की प्रतिबद्धता पूर्ववत करें
  2. उस फ़ाइल को अचयनित करें जिसे आपने गलती से जोड़ा है। आपका पिछला प्रतिबद्ध संदेश पहले से ही संवाद बॉक्स में होगा।
  3. कमिट बटन दबाएँ!

1

यदि आप पिछले कमिट्स के उपयोग के फिल्टरों को हटाना चाहते हैं

git filter-branch --prune-empty --index-filter 'git rm --ignore-unmatch --cached "file_to_be_removed.dmg"'

यदि आप यह त्रुटि देखते हैं:

नया बैकअप नहीं बनाया जा सकता। एक पिछला बैकअप पहले से ही refs / original / Force में मौजूद है जो बैकअप के साथ -f लिखता है

बस अपने स्थानीय रेपो पर रेफरी बैकअप हटा दें

$ rm -rf .git/refs/original/refs

1

यदि आप अभी तक बदलाव के लिए अपने बदलावों को आगे नहीं बढ़ाते हैं

git reset --soft HEAD~1

यह सभी परिवर्तनों को रीसेट कर देगा और एक कमिट बैक में वापस आ जाएगा

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

git rm <file>
 git commit --amend

या इससे भी बेहतर:

पहले रीसेट करें

git reset --soft HEAD~1

अवांछित फ़ाइल रीसेट करें

git reset HEAD path/to/unwanted_file

फिर से कमिट करें

git commit -c ORIG_HEAD  

ऊपर के समान ही, लेकिन वास्तव में भी इसे पार करने में मदद की
रेशमा

0

यह मेरे लिए बिट बकेट रेपो से फाइल को हटाने के लिए काम किया है जिसे मैंने शुरू में फ़ाइल को शाखा में धकेल दिया था।

git checkout origin/develop <path-to-file>
git add <path-to-file>
git commit -m "Message"
git push

0

मैंने वर्तमान फ़ाइलों को एक अलग फ़ोल्डर में कॉपी किया है, फिर सभी अप्रकाशित परिवर्तनों से छुटकारा पाएं:

git reset --hard @{u}

फिर चीजों को कॉपी करें। कमिट, पुश।


0

आप बस इस कमांड का उपयोग कर सकते हैं:

git restore --staged <file>

0
Here is the step to remove files from Git Commit.

>git reset --soft HEAD^1(either commitid ) -- now files moved to the staging area.
>git rm --cached filename(it will removed the file from staging area)
>git commit -m 'meaningfull message'(Now commit the required files)

-1

इस समय कोई भी उत्तर उचित नहीं है। लगता है कि पर्याप्त मांग है कि एक वास्तविक समाधान प्रस्तावित किया जाना चाहिए: https://github.com/git/git/blob/master/Documentation/SubmittingPatches

git --uncommit <फ़ाइल नाम>

अच्छा होगा। मुझे लगता है कि हम इतिहास को संशोधित नहीं करना चाहते हैं, लेकिन अगर मैं स्थानीय हूं और गलती से स्थानीय "हैक" फ़ाइल जोड़ रहा हूं और इसे कमिट से निकालना चाहता हूं तो यह सुपर सहायक होगा।

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