मैं Git का उपयोग कर रहा हूं और मैंने कुछ फाइलों का उपयोग किया है
git commit -a
बाद में, मैंने पाया कि एक फाइल गलती से कमेट में जुड़ गई थी।
मैं अंतिम प्रतिबद्ध से एक फ़ाइल कैसे निकाल सकता हूं?
git reset filepath
मैं Git का उपयोग कर रहा हूं और मैंने कुछ फाइलों का उपयोग किया है
git commit -a
बाद में, मैंने पाया कि एक फाइल गलती से कमेट में जुड़ गई थी।
मैं अंतिम प्रतिबद्ध से एक फ़ाइल कैसे निकाल सकता हूं?
git reset filepath
जवाबों:
मुझे लगता है कि यहां अन्य उत्तर गलत हैं, क्योंकि यह गलत तरीके से प्रतिबद्ध फाइलों को पिछली प्रतिबद्धताओं से वापस मचान क्षेत्र में स्थानांतरित करने का सवाल है, बिना उन पर किए गए परिवर्तनों को रद्द किए बिना। यह किया जा सकता है जैसे परितोष सिंह ने सुझाव दिया:
git reset --soft HEAD^
या
git reset --soft HEAD~1
फिर अवांछित फ़ाइलों को रीसेट करें ताकि उन्हें कमिट से बाहर किया जा सके:
git reset HEAD path/to/unwanted_file
अब फिर से प्रतिबद्ध करें, आप भी उसी प्रतिबद्ध संदेश का फिर से उपयोग कर सकते हैं:
git commit -c ORIG_HEAD
git push
अपने रेपो को ठीक करने का प्रयास करें, तो यह शिकायत करेगा Updates were rejected because the tip of your current branch is behind its remote counterpart.
। यदि आप सुनिश्चित हैं कि आप उन्हें पुश करना चाहते हैं (जैसे कि यह आपका कांटा है), तो आप -f
पुश का उपयोग करने के लिए विकल्प का उपयोग कर सकते हैं , जैसे git push origin master -f
। (एक अपस्ट्रीम रेपो के लिए ऐसा न करें जो दूसरों से प्राप्त कर रहे हैं)
git reset --soft HEAD^
मेरा सबसे आम पूर्ववत ऑपरेशन है
git reset
लेकिन मौजूदा कमिट को "जगह" पर प्रभावित करने का एक तरीका चाहता था। मैं बस के बारे में सीखा है git commit -C
। तो मेरे लिए, जो मैं चाहता हूं वह एक और कदम के साथ आपकी सटीक नुस्खा है, "नई प्रतिबद्ध फिर से" के रूप में वर्तनी git commit -C [hash of original HEAD commit from first step]
।
ध्यान ! यदि आप केवल अपनी पिछली कमिट से कोई फ़ाइल निकालना चाहते हैं, और उसे डिस्क पर रखना चाहते हैं , तो ऊपर दिए गए लिंक पर जज़लिन पढ़ें ।
यदि यह आपकी अंतिम प्रतिबद्धता है और आप फ़ाइल को अपने स्थानीय और दूरस्थ भंडार से पूरी तरह से हटाना चाहते हैं , तो आप यह कर सकते हैं:
git rm <file>
git commit --amend
संशोधन ध्वज फिर से प्रतिबद्ध करने के लिए कहता है, लेकिन "मर्ज" (दो शाखाओं को विलय करने के अर्थ में नहीं) यह अंतिम प्रतिबद्ध के साथ प्रतिबद्ध है।
जैसा कि टिप्पणियों में कहा गया है, git rm
यहां का उपयोग करना rm
स्वयं कमांड का उपयोग करने जैसा है!
git rm --cached
फ़ाइलों को डिस्क पर रखने के लिए भी उपयोग कर सकते हैं
rm
git
rm
git commit --amend
अभी भी है और उदाहरण के लिए मिल सकती है git reflog
। इसलिए यह उतना बुरा नहीं है जितना कि अन्य टिप्पणियां बताती हैं।
मौजूदा उत्तर सभी अवांछित फाइलों को अंतिम प्रतिबद्ध से हटाने की बात कर रहे हैं ।
यदि आप पुरानी फ़ाइलों (यहां तक कि धक्का दिया गया) से अवांछित फ़ाइलों को हटाना चाहते हैं और कार्रवाई के कारण एक नई प्रतिबद्धता नहीं बनाना चाहते हैं, जो अनावश्यक है:
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
यदि आप दुर्भाग्य से संघर्ष करते हैं, तो आपको उन्हें स्वयं हल करना होगा।
git rm --cached <file(s)>
।
--fixup=35c23c2
करने के लिए git commit
आदेश। यह आवश्यक कमिट के फिक्सअप के रूप में कमिट को स्वचालित रूप से सेटअप कर देगा और इसलिए आपको इसे रिबेस में निर्दिष्ट करने की आवश्यकता नहीं होगी। साथ ही, यदि आप जोड़ना --autosquash
करने के लिए git rebase
आदेश, Git स्वचालित रूप से अपना सही स्थान के लिए प्रतिबद्ध है, तो आप इंटरैक्टिव रिबेस में कुछ भी करने की जरूरत नहीं है पर आ जाएगा - बस परिणाम को बचाने (आप भी करने की जरूरत नहीं है जिसका अर्थ है -i
झंडा, हालांकि मुझे यह सुनिश्चित करने के लिए इसका उपयोग करना पसंद है कि सबकुछ वैसा ही हो जैसा मुझे उम्मीद है।
जैसा कि स्वीकृत उत्तर इंगित करता है, आप पूरी प्रतिबद्धता को रीसेट करके ऐसा कर सकते हैं। लेकिन यह एक भारी हाथ है।
ऐसा करने का एक साफ तरीका यह होगा कि आप कमिट रखें, और बदले हुए फाइल को इसमें से हटा दें।
git reset HEAD^ -- path/to/file
git commit --amend --no-edit
git reset
के रूप में यह पिछले में था फ़ाइल लेने के लिए प्रतिबद्ध है, और सूचकांक में यह मंच होगा। कार्य निर्देशिका में फ़ाइल अछूती है।
इसके git commit
बाद वसीयत और वर्तमान प्रतिबद्ध में सूचकांक स्क्वैश करेगा।
यह अनिवार्य रूप से उस फ़ाइल का संस्करण लेता है जो पिछली प्रतिबद्ध में था और इसे वर्तमान प्रतिबद्ध में जोड़ता है। इससे कोई शुद्ध परिवर्तन नहीं होता है, और इसलिए फ़ाइल प्रभावी रूप से कमिट से निकाल दी जाती है।
यदि आपने सर्वर पर उन परिवर्तनों को नहीं धकेल दिया है जिनका आप उपयोग कर सकते हैं
git reset --soft HEAD~1
यह सभी परिवर्तनों को रीसेट कर देगा और एक कमिट बैक में वापस आ जाएगा
यदि आपने अपने परिवर्तनों को आगे बढ़ाया है तो @CharlesB द्वारा उत्तर दिए गए चरणों का पालन करें
Rm का उपयोग करके फ़ाइल को हटाने से यह नष्ट हो जाएगा!
आप हमेशा हटाने के बजाय git में एक कमिट जोड़ रहे हैं, इसलिए इस उदाहरण में वह फ़ाइल लौटाएं जो पहले की कमिटमेंट के पहले थी (यदि फ़ाइल नई है तो यह 'rm' एक्शन हो सकता है) और फिर री-कमिट और फाइल जाएगी।
फ़ाइल को कुछ पिछली स्थिति में लौटने के लिए:
git checkout <commit_id> <path_to_file>
या इसे रिमोट हेड पर राज्य को वापस करने के लिए:
git checkout origin/master <path_to_file>
फिर कमिट में संशोधन करें और आपको पता लगाना चाहिए कि फ़ाइल सूची से गायब हो गई है (और आपकी डिस्क से डिलीट नहीं हुई है!)
git checkout HEAD~ path/to/file
git commit --amend
निम्न आपके द्वारा इच्छित फ़ाइल को अप्रतिबंधित करेगा, जो कि ओपी ने पूछा था।
git reset HEAD^ /path/to/file
आपको निम्न जैसा कुछ दिखाई देगा ...
किए जाने वाले परिवर्तन: ("रीसेट रीसेट HEAD ..." को अनस्टेज करने के लिए)
संशोधित: / पथ / से / फ़ाइल
परिवर्तन के लिए प्रतिबद्ध नहीं हैं: (कार्य करने के लिए "git add ..." का उपयोग करें) जो काम करने के लिए प्रतिबद्ध होंगे ("git checkout - ..." का उपयोग करके कार्यशील निर्देशिका में परिवर्तन छोड़ दें)
संशोधित: / पथ / से / फ़ाइल
इस बिंदु पर, आप फ़ाइल के लिए जो चाहें कर सकते हैं, जैसे कि एक अलग संस्करण में रीसेट करना।
जब आप प्रतिबद्ध होने के लिए तैयार हों:
git commit --amend -a
या (यदि आपको कुछ अन्य परिवर्तन करने हैं, जो आप अभी तक नहीं करना चाहते हैं)
git commit add /path/to/file
git commit --amend
मैं आपको उदाहरण के साथ समझाऊंगा।
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>
noop
करने के लिए edit [A_commit_ID]
याe [A_commit_ID]
आप बस कोशिश कर सकते हैं।
git reset --soft HEAD~1
और एक नई प्रतिबद्धता बनाएं।
हालाँकि, एक कमाल का सॉफ्टवेयर है "gitkraken"। जिसके कारण git के साथ काम करना आसान हो जाता है।
git commit --amend
अपनी अंतिम प्रतिबद्ध में फ़ाइल को हटाने के लिए अद्यतन करेंगे; और बाद में, आप देख सकते हैं कि इसे वास्तव में हटा दिया गया हैgit log -1 --stat
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 gui citool --amend
आप गलती से किए गए फ़ाइल को अन-चेक कर सकते हैं और फिर "कमिट" पर क्लिक कर सकते हैं।
फाइल को कमिट से हटा दिया जाता है, लेकिन डिस्क पर रखा जाएगा । इसलिए अगर आपने गलती से जोड़ने के बाद फाइल को अन-चेक किया है, तो यह आपकी अनट्रेक्टेड फाइल्स लिस्ट में दिखाई देगा (और अगर आपने गलती से मॉडिफाई करने के बाद फाइल को अन-चेक किया है तो यह आपके बदलावों में दिखाएगा कि कमिट लिस्ट का मंचन नहीं हुआ है)।
sudo apt-get install git-gui
git rebase -i HEAD~4
और फिर संपादक को खोलने के लिए आपकी कमांड को चलाया। एक और नोट: "अनस्टैजिंग" "कमिट" मेनू में पाया जा सकता है।
git reset --soft HEAD^
(--soft arg को याद रखना), इसके बाद git commit -c ORIG_HEAD
(इसके बजाय - आघात से, जो सब कुछ खराब कर देता है)।
यदि आप अपनी कमिटमेंट को संरक्षित करना चाहते हैं (हो सकता है कि आपने पहले से ही कुछ समय बिताकर एक विस्तृत कमिट मैसेज लिख दिया हो और इसे खोना नहीं चाहते), और आप केवल कमिट से फाइल को हटाना चाहते हैं, लेकिन रिपॉजिटरी से पूरी तरह से नहीं:
git checkout origin/<remote-branch> <filename>
git commit --amend
निम्नलिखित आदेशों का एक क्रम करें:
//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 reset --soft HEAD^
git checkout origin/master <filepath>
चीयर्स!
मेरे लिए कुछ काम किया, लेकिन फिर भी लगता है कि एक बेहतर समाधान होना चाहिए:
$ git revert <commit_id>
$ git reset HEAD~1 --hard
दूसरे कमिट में आप जो बदलाव छोड़ना चाहते हैं, उसे छोड़ दें, दूसरों को देखें
$ git commit --amend // or stash and rebase to <commit_id> to amend changes
वास्तव में, मुझे लगता है कि git rebase इंटरेक्टिव मोड का उपयोग करने का एक तेज़ और आसान तरीका है।
git rebase -i head~1
(या सिर ~ 4, आप कितनी दूर जाना चाहते हैं)
और फिर 'पिक' के बजाय 'एडिट' का इस्तेमाल करें। मुझे महसूस नहीं हुआ कि 'एडिट' कितना शक्तिशाली है।
https://www.youtube.com/watch?v=2dQosJaLN18
आशा है आपको यह मददगार लगेगा।
एक ही मुद्दा था जहाँ मैं एक स्थानीय शाखा में परिवर्तन करता हूँ जहाँ मैं सिर्फ एक फ़ाइल को वापस करना चाहता था। मेरे लिए क्या काम था -
( सुविधा / target_branch नीचे वह जगह है जहां मेरे पास मेरे सभी परिवर्तन हैं जिनमें मैं एक विशिष्ट फ़ाइल के लिए पूर्ववत करना चाहता था)
( उत्पत्ति / सुविधा / target_branch वह दूरस्थ शाखा है जहाँ मैं अपने परिवर्तनों को धकेलना चाहता हूँ)
( फ़ीचर / स्टेजिंग मेरी अस्थायी स्टेजिंग ब्रांच है, जहाँ मैं उस एक फाइल में बदलाव को छोड़कर अपने सभी वांछित बदलावों पर जोर दूंगा)
मेरे मूल / सुविधा / target_branch से एक स्थानीय शाखा बनाएँ - इसे सुविधा / मंचन कहा जाता है
मेरी कार्यशील स्थानीय शाखा सुविधा / target_branch को सुविधा / स्टेजिंग शाखा में विलय कर दिया
जाँच की गई सुविधा / स्टेजिंग तो git रीसेट --soft ORIG_HEAD (अब फीचर / स्टेजिंग से सभी परिवर्तन 'का मंचन किया जाएगा लेकिन अप्रकाशित।)
अनावश्यक रूप से परिवर्तन के साथ मैंने पहले से जाँच की गई फ़ाइल को बंद कर दिया
मूल / सुविधा / target_branch को फ़ीचर / स्टेजिंग के लिए अपस्ट्रीम शाखा को बदल दिया
मंचन के बाकी हिस्सों को प्रतिबद्ध किया और मेरे दूरस्थ मूल / सुविधा / target_branch को ऊपर की ओर धकेल दिया
यदि आप GitHub का उपयोग कर रहे हैं और अभी तक कमिट नहीं किया है, तो GitHub डेस्कटॉप इस समस्या को आसानी से हल करता है:
यदि आप पिछले कमिट्स के उपयोग के फिल्टरों को हटाना चाहते हैं
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
यदि आप अभी तक बदलाव के लिए अपने बदलावों को आगे नहीं बढ़ाते हैं
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
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)
इस समय कोई भी उत्तर उचित नहीं है। लगता है कि पर्याप्त मांग है कि एक वास्तविक समाधान प्रस्तावित किया जाना चाहिए: https://github.com/git/git/blob/master/Documentation/SubmittingPatches
git --uncommit <फ़ाइल नाम>
अच्छा होगा। मुझे लगता है कि हम इतिहास को संशोधित नहीं करना चाहते हैं, लेकिन अगर मैं स्थानीय हूं और गलती से स्थानीय "हैक" फ़ाइल जोड़ रहा हूं और इसे कमिट से निकालना चाहता हूं तो यह सुपर सहायक होगा।