git - क्या गैर-पारस्परिक रूप से कई कामों को स्क्वैश करने का कोई तरीका है?




interactive rebase (6)

अंतिम प्रतिबद्धता के भीतर अंतिम 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

मैं कई चीजों को स्क्वैश करने की कोशिश कर रहा हूं - हेड टू हेड ~ 3। क्या ऐसा करने का कोई त्वरित तरीका है, या मुझे रीबेस --इंटरएक्टिव का उपयोग करने की आवश्यकता है?


आप के साथ बहुत करीब हो सकता है

git rebase --onto HEAD~4 HEAD~ master

यह मानता है कि आप एक रैखिक इतिहास के साथ मास्टर पर हैं। यह काफी स्क्वैश नहीं है क्योंकि यह मध्यवर्ती काम करता है। प्रतिबद्ध संदेश को संशोधित करने के लिए आपको नए HEAD में संशोधन करने की आवश्यकता होगी।


मैं व्यक्तिगत रूप से समाधान पसंद है:

git reset --soft HEAD~3
git commit -m 'new commit message'

हालांकि, मैंने कुछ त्रुटि जांच के साथ उपनाम बनाया ताकि आप यह कर सकें:

git squash 3 'my commit message'

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

स्क्वैशिंग के लिए स्क्रिप्ट (squash.sh)

#!/bin/bash
#

#get number of commits to squash
squashCount=$1

#get the commit message
shift
[email protected]

#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

फिर उस squash.sh स्क्रिप्ट को गिट उपनाम पर हुक करने के लिए, अपने गिट उपनामों को स्थापित करने के लिए एक और स्क्रिप्ट बनाएं ( 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 '----------------'

मैंनें इस्तेमाल किया:

EDITOR="sed -i '2,/^$/s/^pick\b/s/'" git rebase -i <ref>

काफी ठीक काम किया। बस "पिक" से शुरू होने वाली रेखा के साथ एक प्रतिबद्ध लॉग करने का प्रयास न करें :)


सुनिश्चित करें कि आपका कामकाजी पेड़ साफ है, फिर

git reset --soft HEAD~3
git commit -m'new commit message'

wilhelmtell द्वारा उत्तर में जोड़ने के लिए मुझे हेड ~ 2 को नरम रीसेट करने और फिर HEAD ~ 3 की प्रतिबद्धता में संशोधन करने के लिए सुविधाजनक लगता है:

git reset --soft HEAD~2
git commit --all --amend --no-edit    

यह सभी प्रतिबद्धताओं को HEAD ~ 3 प्रतिबद्धता में विलय करेगा और इसके प्रतिबद्ध संदेश का उपयोग करेगा। एक साफ काम करने वाले पेड़ से शुरू करना सुनिश्चित करें।





squash