जवाबों:
सुनिश्चित करें कि आपका काम करने वाला पेड़ साफ है, फिर
git reset --soft HEAD~3
git commit -m 'new commit message'
git reset --soft HEAD~3 && git commit -m "my message"
git config alias.mysquash '!f(){ git reset --soft HEAD~$1 && git commit ${2:+-m "$2"}; };f'
। git mysquash 3 'some message'
काम करेगा, लेकिन मैंने इसे भी बदल दिया ताकि मैं git musquash 3
पूरी तरह से झंडे को छोड़ दूं ताकि आपको git commit
उस मामले में इंटरैक्टिव यूआई मिल जाए ।
मुझे व्यक्तिगत रूप से विल्हेमटेल का समाधान पसंद है :
git reset --soft HEAD~3
git commit -m 'new commit message'
हालाँकि, मैंने कुछ त्रुटि जाँच के साथ एक उपनाम बनाया ताकि आप ऐसा कर सकें:
git squash 3 'my commit message'
मैं उपनामों की स्थापना करने की सलाह देता हूं जो वास्तव में स्क्रिप्ट चलाते हैं ताकि आपकी स्क्रिप्ट्स को (ए) कोड करना आसान हो और (बी) त्रुटि जांच के साथ अधिक जटिल काम करें। नीचे एक स्क्रिप्ट दी गई है जो स्क्वैश का काम करती है और फिर उसके नीचे आपके गिट एलियास को स्थापित करने की स्क्रिप्ट है।
स्क्वैश के लिए स्क्रिप्ट (स्क्वैश.श)
#!/bin/bash
#
#get number of commits to squash
squashCount=$1
#get the commit message
shift
commitMsg=$@
#regular expression to verify that squash number is an integer
regex='^[0-9]+$'
echo "---------------------------------"
echo "Will squash $squashCount commits"
echo "Commit message will be '$commitMsg'"
echo "...validating input"
if ! [[ $squashCount =~ $regex ]]
then
echo "Squash count must be an integer."
elif [ -z "$commitMsg" ]
then
echo "Invalid commit message. Make sure string is not empty"
else
echo "...input looks good"
echo "...proceeding to squash"
git reset --soft HEAD~$squashCount
git commit -m "$commitMsg"
echo "...done"
fi
echo
exit 0
फिर उस स्क्वाश स्क्रिप्ट को git उपनाम के लिए हुक करने के लिए, अपने git उपनाम को सेट करने के लिए एक और स्क्रिप्ट बनाएं, जैसे ( create_aliases.command या create_aliases.sh ):
#!/bin/sh
echo '-----------------------'
echo 'adding git aliases....'
echo '-----------------------'
echo
git config --global alias.squash "!bash -c 'bash <path to scripts directory>/squash.sh \$1 \$2' -"
#add your other git aliases setup here
#and here
#etc.
echo '------------------------------------'
echo 'here is your global gitconfig file:'
echo '------------------------------------'
more ~/.gitconfig
echo
echo
echo '----------------'
echo 'end of script...'
echo '----------------'
$PATH
नाम में भी रख सकते हैं git-squash.sh
और यह स्वचालित रूप से अलियास हो जाएगा git squash
। मैंने आपका उत्तर नहीं बदला है, बस उस स्थिति में create-aiases.sh
स्क्रिप्ट का उपयोग करने का एक कारण है जिसके बारे में मुझे जानकारी नहीं है।
विल्हेमटेल द्वारा उत्तर में जोड़ने के लिए मैं इसे HEAD~2
फिर से नरम रीसेट करने के लिए सुविधाजनक बनाता हूं और फिर की प्रतिबद्धता में संशोधन कर रहा हूं HEAD~3
:
git reset --soft HEAD~2
git commit --all --amend --no-edit
यह सभी कमिट्स को HEAD~3
कमिट में मर्ज कर देगा और इसके कमिट मैसेज का उपयोग करेगा। एक साफ काम करने वाले पेड़ से शुरू करना सुनिश्चित करें।
मैंनें इस्तेमाल किया:
EDITOR="sed -i '2,/^$/s/^pick\b/s/'" git rebase -i <ref>
काफी ठीक काम किया। बस "पिक" से शुरू होने वाली लाइन के साथ कमिट लॉग करने की कोशिश न करें :)
अंतिम आदेश के भीतर अंतिम 4 कमिट्स को स्क्वैश करने के लिए निम्न कमांड का उपयोग करें:
git squash 4
उपनाम के साथ:
squash = !"f() { NL=$1; GIT_EDITOR=\"sed -i '2,$NL s/pick/squash/;/# This is the 2nd commit message:/,$ {d}'\"; git rebase -i HEAD~$NL; }; f"
sq = !git squash $1
sqpsf = !git squash $1 && git psf
से https://github.com/brauliobo/gitconfig/blob/master/configs/.gitconfig
यहाँ एक लाइनर है जो अंतिम 2 को स्क्वैश करता है। इस उदाहरण में, दूसरी अंतिम प्रतिबद्धता का संदेश बरकरार रखा जाएगा। आप अपनी इच्छानुसार संदेश बदल सकते हैं।
git commit -am "$(git log -1 --skip=1 --pretty=%B | xargs && git reset --soft HEAD~2)"
यदि आप इस कमांड के लिए एक उपनाम बनाते हैं और इसके बजाय अन्य नाम का उपयोग करते हैं तो यह कमांड बहुत उपयोगी होगी।
सब कुछ स्क्वैश करने के लिए क्योंकि शाखा को मास्टर से कांटा गया था:
git reset --soft $(git merge-base --fork-point master) \
&& git commit --verbose --reedit-message=HEAD --reset-author
--reedit-message=HEAD
अंतिम प्रतिबद्ध के संदेश का उपयोग करेगा जो स्क्वैश का हिस्सा नहीं है । यह संभवत: वह नहीं है जो आप चाहते हैं। पहले शामिल किए जाने के संदेश को शामिल करने के लिए , या तो (1)HEAD
आप जिस संदेश को चाहते हैं, उसके हैश के साथ बदलें , या (2) पहली बार शामिल होने के लिए कूदें और git commit --amend --reedit-message=HEAD
। यह सामंजस्यपूर्ण उत्तर है।
आप के साथ बहुत करीब हो सकते हैं
जीआईटी रिबास - अटलांटा हेड ~ 4 हेड ~ मास्टर
यह मानता है कि आप एक रैखिक इतिहास के साथ मास्टर हैं। यह काफी स्क्वैश नहीं है क्योंकि यह इंटरमीडिएट कमिट्स को डिस्कस करता है। आपको प्रतिबद्ध संदेश को संशोधित करने के लिए नए HEAD में संशोधन करना होगा।
HEAD~4
इसके माता-पिता के रूप में फिर से लिखा जाता है ।