यदि आप अन्य डेवलपर्स के लिए इतिहास प्रकाशित कर चुके हैं, तो आप जो करना चाहते हैं, वह बहुत ही विघटनकारी है। अपने इतिहास की मरम्मत के बाद आवश्यक चरणों के लिए प्रलेखन में "अपस्ट्रीम रिबेस से पुनर्प्राप्त करना"git rebase देखें ।
आपके पास कम से कम दो विकल्प हैं: git filter-branchऔर एक इंटरैक्टिव रिबेस, दोनों को नीचे समझाया गया है।
का उपयोग करते हुए git filter-branch
मुझे एक तोड़फोड़ आयात से भारी बाइनरी टेस्ट डेटा के साथ एक समान समस्या थी और एक गिट रिपॉजिटरी से डेटा हटाने के बारे में लिखा था ।
अपने इतिहास को कहो:
$ git lola --name-status
* f772d66 (HEAD, master) Login page
| A login.html
* cb14efd Remove DVD-rip
| D oops.iso
* ce36c98 Careless
| A oops.iso
| A other.html
* 5af4522 Admin page
| A admin.html
* e738b63 Index
A index.html
ध्यान दें कि git lolaएक गैर-मानक लेकिन अत्यधिक उपयोगी उपनाम है। --name-statusस्विच के साथ , हम प्रत्येक संशोधन से जुड़े पेड़ संशोधनों को देख सकते हैं।
"लापरवाह" प्रतिबद्ध में (जिसका SHA1 ऑब्जेक्ट नाम CE36c98 है) फ़ाइल oops.isoडीवीडी-चीर दुर्घटना से जोड़ा गया है और अगले प्रतिबद्ध में हटा दिया गया है, cb14efd। पूर्वोक्त ब्लॉग पोस्ट में वर्णित तकनीक का उपयोग करना, निष्पादित करने का आदेश है:
git filter-branch --prune-empty -d /dev/shm/scratch \
--index-filter "git rm --cached -f --ignore-unmatch oops.iso" \
--tag-name-filter cat -- --all
विकल्प:
--prune-emptyहटाता है कि फिल्टर ऑपरेशन के परिणामस्वरूप खाली हो जाता है ( यानी , पेड़ को न बदलें)। ठेठ मामले में, यह विकल्प एक क्लीनर इतिहास पैदा करता है।
-dएक अस्थायी निर्देशिका का नाम जो फ़िल्टर्ड इतिहास के निर्माण के लिए उपयोग करने के लिए मौजूद नहीं है। यदि आप एक आधुनिक लिनक्स वितरण पर चल रहे हैं, तो एक पेड़ को/dev/shm निर्दिष्ट करने से तेजी से निष्पादन होगा ।
--index-filterमुख्य घटना है और इतिहास में प्रत्येक चरण पर सूचकांक के खिलाफ चलती है। आप oops.isoजहां भी मिल रहे हैं उसे हटाना चाहते हैं , लेकिन यह सभी कमिट में मौजूद नहीं है। git rm --cached -f --ignore-unmatch oops.isoजब यह मौजूद होता है तो कमांड डीवीडी-रिप को हटा देता है और अन्यथा विफल नहीं होता है।
--tag-name-filterटैग नामों को फिर से लिखने का तरीका बताता है। का एक फ़िल्टर catपहचान ऑपरेशन है। आपके रिपॉजिटरी, ऊपर के नमूने की तरह, कोई टैग नहीं हो सकता है, लेकिन मैंने इस विकल्प को पूर्ण सामान्यता के लिए शामिल किया है।
-- विकल्पों के अंत को निर्दिष्ट करता है git filter-branch
--allनिम्नलिखित --सभी रेफ के लिए आशुलिपि है। आपके रिपॉजिटरी, ऊपर के नमूने की तरह, केवल एक रेफरी (मास्टर) हो सकता है, लेकिन मैंने इस विकल्प को पूर्ण सामान्यता के लिए शामिल किया है।
कुछ मंथन के बाद, अब इतिहास है:
$ git lola --name-status
* 8e0a11c (HEAD, master) Login page
| A login.html
* e45ac59 Careless
| A other.html
|
| * f772d66 (refs/original/refs/heads/master) Login page
| | A login.html
| * cb14efd Remove DVD-rip
| | D oops.iso
| * ce36c98 Careless
|/ A oops.iso
| A other.html
|
* 5af4522 Admin page
| A admin.html
* e738b63 Index
A index.html
ध्यान दें कि नई "लापरवाह" प्रतिबद्धता केवल जोड़ता है other.htmlऔर "निकालें डीवीडी रिप" प्रतिबद्ध अब मास्टर शाखा पर नहीं है। लेबल की गई शाखा refs/original/refs/heads/masterमें आपके द्वारा गलत किए जाने की स्थिति में आपके मूल कमिट होते हैं। इसे हटाने के लिए, "रिपॉजिटरी को सिकोड़ने के लिए चेकलिस्ट" में दिए चरणों का पालन करें ।
$ git update-ref -d refs/original/refs/heads/master
$ git reflog expire --expire=now --all
$ git gc --prune=now
एक सरल विकल्प के लिए, अवांछित बिट्स को छोड़ने के लिए रिपॉजिटरी को क्लोन करें।
$ cd ~/src
$ mv repo repo.old
$ git clone file:///home/user/src/repo.old repo
file:///...केवल क्लोन बनाने के बजाय क्लोन URL का उपयोग करना वस्तुओं को कॉपी करता है।
अब आपका इतिहास है:
$ git lola --name-status
* 8e0a11c (HEAD, master) Login page
| A login.html
* e45ac59 Careless
| A other.html
* 5af4522 Admin page
| A admin.html
* e738b63 Index
A index.html
पहले दो कमिट्स ("इंडेक्स" और "एडमिन पेज") के लिए SHA1 ऑब्जेक्ट के नाम एक ही रहे, क्योंकि फिल्टर ऑपरेशन ने उन कमिट्स को संशोधित नहीं किया था। "लापरवाह" खो गया oops.isoऔर "लॉगिन पृष्ठ" को एक नया माता-पिता मिल गया, इसलिए उनके SHA1 ने बदलाव किया।
परस्पर विद्रोह
के इतिहास के साथ:
$ git lola --name-status
* f772d66 (HEAD, master) Login page
| A login.html
* cb14efd Remove DVD-rip
| D oops.iso
* ce36c98 Careless
| A oops.iso
| A other.html
* 5af4522 Admin page
| A admin.html
* e738b63 Index
A index.html
आप oops.iso"लापरवाह" से हटाना चाहते हैं जैसे कि आपने इसे कभी नहीं जोड़ा, और फिर "डीवीडी-चीर निकालें" आपके लिए बेकार है। इस प्रकार, हमारी योजना एक इंटरैक्टिव रीबेस में है "एडमिन पेज" को "लापरवाह" संपादित करने और "निकालें-चीर" को हटाने के लिए है।
रनिंग $ git rebase -i 5af4522निम्नलिखित सामग्रियों के साथ एक संपादक शुरू करता है।
pick ce36c98 Careless
pick cb14efd Remove DVD-rip
pick f772d66 Login page
# Rebase 5af4522..f772d66 onto 5af4522
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
हमारी योजना को निष्पादित करते हुए, हम इसे संशोधित करते हैं
edit ce36c98 Careless
pick f772d66 Login page
# Rebase 5af4522..f772d66 onto 5af4522
# ...
यही है, हम "डीवीडी-रिप हटाएं" के साथ लाइन हटाते हैं और ऑपरेशन को "लापरवाह" के editबजाय बदल देते हैं pick।
निम्नलिखित संदेश के साथ कमांड प्रॉम्प्ट पर सेव-क्विट करना हमें छोड़ देता है।
Stopped at ce36c98... Careless
You can amend the commit now, with
git commit --amend
Once you are satisfied with your changes, run
git rebase --continue
जैसा कि संदेश हमें बताता है, हम "लापरवाह" कमिट पर हैं जिसे हम संपादित करना चाहते हैं, इसलिए हम दो कमांड चलाते हैं।
$ git rm --cached oops.iso
$ git commit --amend -C HEAD
$ git rebase --continue
पहले सूचकांक से आपत्तिजनक फ़ाइल को हटाता है। दूसरा संशोधित इंडेक्स होने के लिए "लापरवाह" को संशोधित या संशोधित करता है और -C HEADपुराने प्रतिबद्ध संदेश का पुन: उपयोग करने के लिए गिट को निर्देश देता है। अंत में, git rebase --continueबाकी रिबास ऑपरेशन के साथ आगे बढ़ता है।
यह एक इतिहास देता है:
$ git lola --name-status
* 93174be (HEAD, master) Login page
| A login.html
* a570198 Careless
| A other.html
* 5af4522 Admin page
| A admin.html
* e738b63 Index
A index.html
जो आप चाहते हैं