উত্তর:
আপনার কার্যকারী গাছটি পরিষ্কার আছে তা নিশ্চিত করুন
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
তারপরে সেই স্কোয়াশ.শ স্ক্রিপ্টটি গিট অ্যালফের সাথে সংযুক্ত করতে, আপনার গিট এলিয়াসগুলি সেট করার জন্য ( স্ক্রিপ্ট_লিয়াসস.কম বা ক্রিয়েট_লিয়াসেস.শ ) এর জন্য অন্য স্ক্রিপ্ট তৈরি করুন :
#!/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 হেড ~ মাস্টার
এটি ধরে নিয়েছে যে আপনি রৈখিক ইতিহাস নিয়ে মাস্টার on এটি বেশিরভাগ স্কোয়াশ নয় কারণ এটি মধ্যবর্তী কমিটগুলি বাদ দেয়। প্রতিশ্রুতি বার্তাটি পরিবর্তন করতে আপনাকে নতুন হেড সংশোধন করতে হবে।
HEAD~4
এটির পিতামাতা হিসাবে নতুন করে লেখা হয়েছে ।