Git - पूर्ववत किए गए कमिट


609

मेरे पास एक रिमोट रिपॉजिटरी में एक परियोजना है, जो एक स्थानीय रिपॉजिटरी (विकास) और सर्वर एक (ठेस) के साथ सिंक्रनाइज़ है। मैं पहले से ही रिमोट से धकेल दिए गए कुछ परिवर्तन कर रहा हूं और सर्वर से खींच लिया गया है। अब, मैं उन परिवर्तनों को पूर्ववत करना चाहता हूं। इसलिए मैं सिर्फ git checkoutबदलावों से पहले कमिटमेंट कर सकता हूं और नए बदलाव कर सकता हूं, लेकिन मैं अनुमान लगा रहा हूं कि उन्हें फिर से रिमोट में धकेलने की समस्या होगी। किसी भी सुझाव पर मुझे कैसे आगे बढ़ना चाहिए?


जवाबों:


734

आप के साथ अलग-अलग काम कर सकते हैं:

git revert <commit_hash>

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

git revert <oldest_commit_hash>..<latest_commit_hash>

यह निर्दिष्ट कमिट्स के बीच और सम्‍मिलित कॉमेट्स को पुन: प्रदर्शित करता है।

को देखो Git-वापस लाएं आदमी पेज बारे में अधिक जानकारी के लिए git revertआदेश। इसके अलावा देखो क्या यह उत्तर प्रतिबद्ध पूर्ववत करने के बारे में अधिक जानकारी के लिए।


22
दूसरे शब्दों में, यह <सबसे पुराना_कॉमिट_हैश>;) तक पहुंच जाता है
डेविड

7
@mr_jư उपयोगgit log
गीताकार

2
गिट डॉक्यूमेंटेशन में, यह कहता है कि रिवर्ट कमांड रिवर्ट पहले और आखिरी कमिट्स के बीच कमिट करता है (पहले और आखिरी दोनों शामिल हैं)। प्रलेखन देखें
ओनूर डेमीर

4
@aod सही है, इस उत्तर को अद्यतन करने की आवश्यकता है। वर्तमान जीआईटी एपीआई फॉर रिवर्ट को <oldest_commit_hash>
श्रद्धा

4
git के साथ 2.17.2 रिवर्ट <पुराना> .. <नया> पुराने में शामिल नहीं है, लेकिन इसमें <नया>
चिंगिस

353

एक समाधान जो "पूर्ववत" का कोई निशान नहीं रखता है।

नोट: यदि कोई पहले से ही आपके परिवर्तन को खींच लेता है, तो ऐसा न करें (मैं केवल अपने व्यक्तिगत रेपो पर इसका उपयोग करूंगा)

करना:

git reset <previous label or sha1>

यह स्थानीय रूप से सभी अद्यतनों की पुन: जांच करेगा (इसलिए गिट स्थिति सभी अद्यतन की गई फ़ाइलों की सूची देगा)

तब आप "अपना काम करते हैं" और अपने परिवर्तनों को फिर से प्रतिबद्ध करें (नोट: यह कदम वैकल्पिक है)

git commit -am "blabla"

इस समय आपका स्थानीय पेड़ रिमोट से भिन्न होता है

git push -f <remote-name> <branch-name>

इस पुश पर विचार करने और पिछले एक को हटाने के लिए रिमोट को धक्का और बल देगा (दूरस्थ-नाम और शाखा-नाम निर्दिष्ट करना अनिवार्य नहीं है लेकिन अपडेट ध्वज के साथ सभी शाखाओं को अपडेट करने से बचने के लिए अनुशंसित है)।

!! वॉच-आउट कुछ टैग अभी भी हटाए गए कमेंट की ओर इशारा कर सकते हैं !! कैसे करने के लिए हटाना एक रिमोट टैग


4
-एक सभी ट्रैक की गई फाइलों को कमिट किया जाएगा -m कमिट मैसेज
फॉलो करें

3
बिल्कुल वही जो मैंने खोजा था। किसी ने गलती की और धक्का दिया और बाद में उसे फिर से पलट दिया। इस वजह से शाखाओं का विलय नहीं किया जा सकता था और मैं रिपॉजिटरी को फिर से सही स्थिति में
लाना

1
मुझे कौन सा "पिछला लेबल या sha1" इस्तेमाल करना चाहिए? क्या मुझे इससे पहले अंतिम "सही" एक या एक दर्ज करना चाहिए और अंतिम सही एक द्वारा किए गए सभी परिवर्तनों को फिर से करना चाहिए?
ईलिश

3
इरोनियस कमिट से पहले एक
jo_

1
वास्तव में मुझे क्या चाहिए। मैंने गलती से मास्टर करने के लिए एक शाखा को धक्का दिया है। और इसके परिणामस्वरूप मेरे पास सभी कमिट इतिहास के दौरान कई बकवास थे। मैंने अभी git push -fपिछले सही कमिटमेंट के लिए किया और सुदूर इतिहास को साफ किया! धन्यवाद!
एंटोन रयबल्को

193

मैं इन मामलों में क्या करता हूं:

  • सर्वर में, कर्सर को पिछली ज्ञात अच्छी प्रतिबद्धताओं पर वापस ले जाएं:

    git push -f origin <last_known_good_commit>:<branch_name>
    
  • स्थानीय रूप से, ऐसा ही करें:

    git reset --hard <last_known_good_commit>
    #         ^^^^^^
    #         optional
    



my_new_branchइस उद्देश्य के लिए बनाई गई एक शाखा पर एक पूरा उदाहरण देखें :

$ git branch
my_new_branch

कुछ सामान जोड़ने के बाद यह हालिया इतिहास है myfile.py:

$ git log
commit 80143bcaaca77963a47c211a9cbe664d5448d546
Author: me
Date:   Wed Mar 23 12:48:03 2016 +0100

    Adding new stuff in myfile.py

commit b4zad078237fa48746a4feb6517fa409f6bf238e
Author: me
Date:   Tue Mar 18 12:46:59 2016 +0100

    Initial commit

मैं अंतिम प्रतिबद्ध से छुटकारा पाना चाहता हूं, जिसे पहले से ही धक्का दिया गया था, इसलिए मैं दौड़ता हूं:

$ git push -f origin b4zad078237fa48746a4feb6517fa409f6bf238e:my_new_branch
Total 0 (delta 0), reused 0 (delta 0)
To git@github.com:me/myrepo.git
 + 80143bc...b4zad07 b4zad078237fa48746a4feb6517fa409f6bf238e -> my_new_branch (forced update)

अच्छा! अब मैं उस कमेटी में बदली गई फाइल को देखता हूं ( myfile.py) "कमिटेड फॉर स्टेजेड" में दिखाता है:

$ git status
On branch my_new_branch
Your branch is up-to-date with 'origin/my_new_branch'.

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

    modified:   myfile.py

no changes added to commit (use "git add" and/or "git commit -a")

चूंकि मैं ये बदलाव नहीं चाहता, इसलिए मैं कर्सर को स्थानीय स्तर पर वापस ले जाऊंगा:

$ git reset --hard b4zad078237fa48746a4feb6517fa409f6bf238e
HEAD is now at b4zad07 Initial commit

तो अब HEAD पिछले कमिटमेंट में है, लोकल और रिमोट दोनों में:

$ git log
commit b4zad078237fa48746a4feb6517fa409f6bf238e
Author: me
Date:   Tue Mar 18 12:46:59 2016 +0100

    Initial commit

10
यह सही जवाब है! यह वही है जो मेरे मामले में ओ की जरूरत है, धन्यवाद आज कुछ नया सीखा गया :)
एगली बेकर्रा

2
यह सही जवाब है! यह धक्का दिया () के बारे में है!
powtac

3
आप (के रूप में अगर तुम उन्हें धक्का दे दिया कभी नहीं किया है) सही मायने में बदलाव उलटें चाहते हैं, यह है सही जवाब।
जैकब

1
एकदम सही जवाब। उम्मीद के मुताबिक काम किया!
रफीअल्हमद

2
कोई इस आदमी को एक बीयर खरीद कर दे!
जय नेभवानी

72

यदि आप गिट कमांड लाइन के माध्यम से नीचे दिए गए चरणों का पालन करते हैं, तो आप कभी भी (या आप इसे DELETE भी कह सकते हैं ) Git प्रतिबद्ध स्थानीय और दूर से कॉल करें ।

निम्न आदेश को चलाने के लिए कमिट आईडी देखें जिसे आप वापस करना चाहते हैं

git log --oneline --decorate --graph

आपको निम्न स्क्रीनशॉट की तरह मिलेगा यहाँ छवि विवरण दर्ज करें

यदि आप रिमोट (वेब इंटरफेस के माध्यम से) की भी जांच करते हैं, तो आप देख सकते हैं कि यह नीचे दिखाया गया है

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

वर्तमान में स्क्रीनशॉट के अनुसार आप प्रतिबद्ध आईडी e110322 पर हैं लेकिन आप 030bbf6 BOTH LOCALLY और REMOTELY पर वापस जाना चाहते हैं ।

DELETE / REVERT कमिट्स को स्थानीय रूप से दूरस्थ रूप से निम्न चरणों का पालन करें


आईडी 030bbf6 प्रतिबद्ध करने के लिए पहले स्थानीय रूप से परिवर्तित

git reset --hard 030bbf6

के बाद

git clean -f -d

स्नैपशॉट में नीचे दिखाए गए अनुसार ये दोनों कमांड्स स्टेज 030bbf6 पर कमिट करने के लिए क्लीन फोर्स रीसेट करते हैं

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

अब यदि आप git स्टेटस चलाते हैं, तो आप देखेंगे कि आप दूरस्थ शाखा से दो कमिट हैं, जैसा कि नीचे दिखाया गया है यहाँ छवि विवरण दर्ज करें

अपने अनुक्रमणिका को अपडेट करने के लिए निम्न का पालन करें (यदि कोई अद्यतन हैं)। यह अनुशंसा की जाती है कि आप सभी डेवलपर्स को मुख्य दूरस्थ शाखा पर किसी भी पुल अनुरोध को स्वीकार न करने के लिए कहें।

git fetch --all

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

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

git push -u origin +master

अब अगर आपको रिमोट का वेब इंटरफ़ेस दिखाई देता है तो कमिटमेंट के साथ-साथ उसे वापस भी किया जाना चाहिए।

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


61

यह आपके पुश किए गए कमिट्स को हटा देगा

git reset --hard 'xxxxx'

git clean -f -d

git push -f

7
यह विधि ठीक से कमिट को हटाने के लिए इतिहास को फिर से लिखती है। विस्मयकारी
जेसी रेज़ा

2
यह उत्तर एल मैग्निफेको है!
truthadjustr

3
उत्तर से प्यार करें, धन्यवाद :)
डायजेनिस एच।

1
बस स्पष्ट होने के लिए (मुझे यकीन नहीं था): ऑपरेशन के बाद प्रतिबद्ध वर्तमान प्रतिबद्धता होगी। डिलीट करने वाला आखिरी नहीं।
Maik639

21
git revert HEAD -m 1

उपरोक्त कोड लाइन में। "अंतिम तर्क प्रतिनिधित्व करता है"

  • 1 - श्रद्धेय एक काम करता है।

  • 2 - पिछले दो हिट श्रद्धेय।

  • n - श्रद्धेय अंतिम n कमिट करता है।

रिमोट पर प्रभाव लेने के लिए आपको इस कमांड के बाद पुश करने की आवश्यकता है। आपके पास अन्य विकल्प हैं जैसे कि वापसी की सीमा को निर्दिष्ट करना। यह विकल्प में से एक है।


बाद में उपयोग git commit -am "COMMIT_MESSAGE" तो git pushयाgit push -f


8
यह सच नहीं है - -m पैरामीटर माता-पिता की संख्या को वापस करने के लिए निर्दिष्ट करता है (आमतौर पर 1 यदि आप आवक, "उनके" को बदलना चाहते हैं, तो परिवर्तन, मर्ज किए गए परिवर्तनों के लिए 2 के विपरीत, "हमारा" - विलय के लिए 2 करता)। इसका उल्टा कमिट्स की संख्या से कोई लेना-देना नहीं है - यदि आप कमिट रेंज का उपयोग करना चाहते हैं, तो उपयोग करेंgit revert ref1..ref2
Null Reference

1
वांछित प्रभाव नहीं था
सैम तुक

2

2020 सरल तरीका:

git reset <commit_hash>

(आखिरी कमिट का हैश जिसे आप रखना चाहते हैं)।

अब आप स्थानीय स्तर पर अनियंत्रित परिवर्तन रखेंगे।

यदि आप फिर से धक्का देना चाहते हैं, तो आपको करना होगा:

git push -f

0

यहाँ मेरा तरीका है:

मान लीजिए कि शाखा का नाम है develop

# Create a new temp branch based on one history commit
git checkout <last_known_good_commit_hash>
git checkout -b develop-temp

# Delete the original develop branch and 
# create a new branch with the same name based on the develop-temp branch
git branch -D develop
git checkout -b develop

# Force update this new branch
git push -f origin develop

# Remove the temp branch
git branch -D develop-temp

0

आप कुछ ऐसा कर सकते हैं

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