अपडेट करें
मैंने एक उपनाम बनाया है git squash-all
।
उदाहरण उपयोग : git squash-all "a brand new start"
।
[alias]
squash-all = "!f(){ git reset $(git commit-tree HEAD^{tree} -m \"${1:-A new start}\");};f"
कैविएट : एक टिप्पणी प्रदान करना याद रखें, अन्यथा डिफ़ॉल्ट प्रतिबद्ध संदेश "एक नई शुरुआत" का उपयोग किया जाएगा।
या आप निम्नलिखित आदेश के साथ उपनाम बना सकते हैं:
git config --global alias.squash-all '!f(){ git reset $(git commit-tree HEAD^{tree} -m "${1:-A new start}");};f'
एक लाइन
git reset $(git commit-tree HEAD^{tree} -m "A new start")
नोट : यहाँ " A new start
" केवल एक उदाहरण है, अपनी भाषा का उपयोग करने के लिए स्वतंत्र महसूस करें।
टी एल; डॉ
स्क्वैश करने की आवश्यकता नहीं है, git commit-tree
एक अनाथ प्रतिबद्ध बनाने के लिए उपयोग करें और इसके साथ जाएं।
समझाना
के माध्यम से एक ही प्रतिबद्ध बनाएँ git commit-tree
क्या git commit-tree HEAD^{tree} -m "A new start"
है:
प्रदान की गई ट्री ऑब्जेक्ट के आधार पर एक नई कमिट ऑब्जेक्ट बनाता है और स्टडआउट पर नई कमिट ऑब्जेक्ट आईडी का उत्सर्जन करता है। लॉग संदेश मानक इनपुट से पढ़ा जाता है, जब तक -m या -F विकल्प नहीं दिए जाते।
अभिव्यक्ति का HEAD^{tree}
अर्थ है पेड़ की वस्तु HEAD
, जो आपकी वर्तमान शाखा की नोक से संबंधित है। देख ट्री-वस्तुओं और प्रतिबद्ध-वस्तुओं ।
नई शाखा के लिए वर्तमान शाखा रीसेट करें
फिर git reset
बस नई बनाई गई वस्तु के लिए वर्तमान शाखा को रीसेट करें।
इस तरह, कार्यक्षेत्र में कुछ भी छुआ नहीं है, और न ही रिबास / स्क्वैश की आवश्यकता है, जो इसे वास्तव में तेज़ बनाता है। और आवश्यक समय भंडार आकार या इतिहास की गहराई के लिए अप्रासंगिक है।
विविधता: एक परियोजना टेम्पलेट से नई रेपो
यह टेम्प्लेट / आर्कटाइप / बीज / कंकाल के रूप में एक अन्य रिपॉजिटरी का उपयोग करके एक नई परियोजना में "प्रारंभिक प्रतिबद्ध" बनाने के लिए उपयोगी है। उदाहरण के लिए:
cd my-new-project
git init
git fetch --depth=1 -n https://github.com/toolbear/panda.git
git reset --hard $(git commit-tree FETCH_HEAD^{tree} -m "initial commit")
यह टेम्प्लेट रेपो को रिमोट ( origin
या अन्यथा) के रूप में जोड़ने से बचता है और टेम्प्लेट रेपो के इतिहास को आपकी प्रारंभिक प्रतिबद्ध में ढह जाता है।