অ-ইন্টারেক্টিভভাবে বেশ কয়েকটি কমিটকে স্কোয়াশ করার কোনও উপায় আছে কি?


115

আমি প্রচুর কমিটের স্কোয়াশ চেষ্টা করছি - হেড থেকে হেড squ 3। এটি করার কোনও দ্রুত উপায় আছে, বা আমার পুনরায় ব্যবহারের দরকার - ইন্টারেক্টিভ?


5
একই প্রশ্ন: stackoverflow.com/questions/5189560/...
koppor

উত্তর:


146

আপনার কার্যকারী গাছটি পরিষ্কার আছে তা নিশ্চিত করুন

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

@ উইলহেমটেল: দুর্দান্ত! এখন আমি কি এই গিরিটি ওরফে, যেমন "মাইস্কুয়াশ 3 'কিছু বার্তা' তৈরি করতে সক্ষম হব, এটি একটি লাইনে কেটে ফেলতে?
ফিলিপ

5
যদি এটির কেবলমাত্র লাইন সংখ্যা:git reset --soft HEAD~3 && git commit -m "my message"
কিং ক্রঞ্চ ২

7
@ ফিলিপ: আপনি গিট ওরফে একটি শেল ফাংশন এম্বেড করতে পারেন। 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সেই ক্ষেত্রে ইন্টারেক্টিভ ইউআই পাবেন ।
লিলি বালার্ড

3
কেবল এটি পরিষ্কার করার জন্য: এটি স্কোয়াশের মতো নয়। একটি স্কোয়াশ প্রতিশ্রুতিবদ্ধ বার্তাগুলি মার্জ করবে। আপনি যদি কোনও সফট রিসেট করেন তবে আপনি কমিটের সমস্ত বার্তা হারাবেন। আপনি যদি স্কোয়াশ করতে চান তবে স্ট্যাকওভারফ্লো.com
রেনি লিংক

1
@ সেব্নোকেম - এর পরে যখন আমরা শাখাটি ধাক্কা দেওয়ার চেষ্টা করি এবং রিমোটটি ফোর্স পুশগুলি প্রত্যাখ্যান করার জন্য কনফিগার করা হয়।
এভোহন

30

আমি ব্যক্তিগতভাবে উইলহেমটেলের সমাধান পছন্দ করি :

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 '----------------'

4
এছাড়াও আপনি এটা লাগাতে পারেন $PATHনামে git-squash.shএবং এটি স্বয়ংক্রিয়ভাবে হিসাবে ওরফে করা হবে না git squash। আমি আপনার উত্তরটি পরিবর্তন করি নি, কেবল create-aiases.shস্ক্রিপ্টটি ব্যবহার করার কারণেই আমি সচেতন নই।

আমি মূলত create_aliases.command স্ক্রিপ্টটি ব্যবহার করি যাতে আমাদের প্রধানমন্ত্রী এবং ডিজাইনাররা সহজেই সেট আপ করতে পারেন। কেবল স্ক্রিপ্টে ডাবল-ক্লিক করুন এবং সেগুলি প্রস্তুত রয়েছে (বিশেষত যেহেতু আমাদের রেপোতে আমার সেটআপ স্ক্রিপ্ট রয়েছে এবং আপেক্ষিক পথটি জানা আছে)। তারপরে তাদের এমনকি টার্মিনাল পুনরায় চালু করার দরকার নেই।
n8tr

1
আমি এটি চেষ্টা করেছিলাম এবং এটি আমার প্রতিশ্রুতি বার্তাটি স্কোয়াশ গণনা হিসাবে পড়ে এবং ব্যর্থ হয় কারণ এটি কোনও পূর্ণসংখ্যা নয়।
মিনথোস

1
সমাধানটি সংযোজন করা হবে - পরে / স্কোয়াশ.শ after $ 1 \ $ 2 '
মিনথোস

1
সমাধানটির ধারণাটি আমার পছন্দ হয়েছে তবে সমাধানের ক্ষেত্রে উপরের মন্তব্যটি এখনও বিবেচনায় নেওয়া হয়নি। একক এবং ডাবল উদ্ধৃতিটির মধ্যে একটি বিয়োগ চিহ্ন থাকতে হবে।
শারীরিক সংক্ষিপ্তকরণ

10

উইলহেমটেল দ্বারা উত্তর যুক্ত করতে আমি এটিতে নরম পুনরায় সেট করা HEAD~2এবং তারপরে প্রতিশ্রুতি সংশোধন করা সুবিধাজনক বলে মনে করি HEAD~3:

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

এটি প্রতিশ্রুতিতে সমস্ত HEAD~3অঙ্গীকারকে একীভূত করবে এবং এর প্রতিশ্রুতি বার্তাটি ব্যবহার করবে। পরিষ্কার পরিচ্ছন্ন গাছ থেকে শুরু করতে ভুলবেন না।


2
এটি সঠিক উত্তর কারণ এটি একাধিক শৃঙ্খলা স্কোয়াশ করে শীর্ষস্থান পর্যন্ত নিয়ে যায় এবং এটি 1 ম কমিটের বার্তা ব্যবহার করে। এটি অ-ইন্টারেক্টিভ।
ল্যান্ডন কুহান

9

আমি ব্যবহার করতাম:

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

বেশ ভাল কাজ করেছেন। কেবল "বাছাই" দিয়ে শুরু হওয়া লাইনের সাথে কমিট লগ করার চেষ্টা করবেন না :)


দুঃখের বিষয় উইন্ডোজে এটি আমার পক্ষে কার্যকর হয় না। তবুও ইন্টারেক্টিভ সম্পাদক পান।
abergmeier

3

শেষ প্রতিশ্রুতিতে শেষ 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 থেকে


আপনি এখানে ওএস / শেল কী ব্যবহৃত হচ্ছে তা নির্দিষ্ট করে নি। এই সমাধানটি সম্ভবত অন্যান্য সমস্ত ডেস্কটপগুলি ব্যবহার করে যা লোকেরা ব্যবহার করে না।
রিক -777

হ্যাঁ, আপনার জন্য লিনাক্স / বাশ |
জেডএস

2

শেষ 2 টি কমিটগুলি স্কোয়াশের জন্য এখানে একটি লাইনার রয়েছে। এই উদাহরণে, দ্বিতীয় শেষ প্রতিশ্রুতি বার্তা বজায় রাখা হবে। আপনি ইচ্ছামত বার্তা পরিবর্তন করতে পারেন।

git commit -am "$(git log -1 --skip=1 --pretty=%B | xargs && git reset --soft HEAD~2)"

আপনি যদি এই কমান্ডটির জন্য একটি উপাত্ত তৈরি করেন এবং পরিবর্তে উপনামটি ব্যবহার করেন তবে এই আদেশটি খুব কার্যকর হবে।


1

যেহেতু শাখাটি মাস্টারের কাছ থেকে কাঁটাচামচ করা হয়েছিল তাই সমস্ত স্কোয়াশ করা:

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। সুরেলা উত্তরটি এটিই করে।
Maëlan

-1

আপনি খুব কাছাকাছি পেতে পারেন

গিট রিবেস - হেড ~ 4 হেড ~ মাস্টার

এটি ধরে নিয়েছে যে আপনি রৈখিক ইতিহাস নিয়ে মাস্টার on এটি বেশিরভাগ স্কোয়াশ নয় কারণ এটি মধ্যবর্তী কমিটগুলি বাদ দেয়। প্রতিশ্রুতি বার্তাটি পরিবর্তন করতে আপনাকে নতুন হেড সংশোধন করতে হবে।


ধন্যবাদ গ্রেগ; 'ছাড়' দিয়ে আপনি কি বোঝাতে চাইছেন যে মধ্যবর্তী কমিটগুলি গিট জিসি দ্বারা পরিষ্কারের সাপেক্ষে?
ফিলিপ

@ ফিলিপ হ্যাঁ, মধ্যবর্তী কমিটগুলি পুরানো হেডের পাশাপাশি আবর্জনা হয়ে উঠবে কারণ HEAD~4এটির পিতামাতা হিসাবে নতুন করে লেখা হয়েছে ।
গ্রেগ বেকন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.