আমি কীভাবে আমার শেষ এক্সকে একসাথে গিট ব্যবহার করে প্রতিশ্রুতিবদ্ধ করতে স্কোয়াশ করতে পারি?
আমি কীভাবে আমার শেষ এক্সকে একসাথে গিট ব্যবহার করে প্রতিশ্রুতিবদ্ধ করতে স্কোয়াশ করতে পারি?
উত্তর:
git rebase -i <after-this-commit>
দ্বিতীয়টিতে "বাছাই" ব্যবহার করুন এবং প্রতিস্থাপন করুন এবং ম্যানুয়ালটিতে বর্ণিত হিসাবে "স্কোয়াশ" বা "ফিক্সআপ" দিয়ে কমিট করবে ।
এই উদাহরণস্বরূপ, <after-this-commit>
হয় SHA1 হ্যাশ বা বর্তমান শাখার হেড থেকে আপেক্ষিক অবস্থান যা থেকে রিবেস কমান্ডের জন্য কমিটগুলি বিশ্লেষণ করা হয়। উদাহরণস্বরূপ, যদি ব্যবহারকারী অতীতের বর্তমান হেড থেকে 5 টি কমিটগুলি দেখতে চায় তবে কমান্ডটি হ'ল git rebase -i HEAD~5
।
<after-this-commit>
?
<after-this-commit>
X + 1 কমিট করা অর্থাত্ স্কোয়াশ করতে চান এমন পুরানো প্রতিশ্রুতির পিতা বা মাতা।
rebase -i
পদ্ধতির মধ্যে পার্থক্য এবং reset --soft
তা হ'ল rebase -i
আমাকে প্রতিশ্রুতিবদ্ধ লেখককে ধরে রাখতে reset --soft
দেয়, আবার আমাকে পুনরায় মঞ্জুরি দেওয়ার অনুমতি দেয়। কখনও কখনও লেখকদের তথ্য বজায় রাখার জন্য আমাকে টানার অনুরোধগুলির স্কোয়াশ করা দরকার। কখনও কখনও আমার নিজের কমিটগুলিতে নরম পুনরায় সেট করা দরকার। যাইহোক যাইহোক উভয়ের দুর্দান্ত উত্তরের দিকে সমর্থন জানায়।
আপনি git rebase
বা ছাড়াই মোটামুটি সহজেই এটি করতে পারেন git merge --squash
। এই উদাহরণে, আমরা শেষ 3 টি কমিটকে স্কোয়াশ করব।
আপনি যদি স্ক্র্যাচ থেকে নতুন প্রতিশ্রুতি বার্তা লিখতে চান তবে এটি যথেষ্ট:
git reset --soft HEAD~3 &&
git commit
যদি আপনি বিদ্যমান প্রতিশ্রুতি বার্তাগুলি (যেমন একটি পিক / স্কোয়াশ / স্কোয়াশ /… / স্কোয়াশ git rebase -i
নির্দেশিকা তালিকার সাথে শুরু করা হয় তার অনুরূপ) দিয়ে নতুন প্রতিশ্রুতি বার্তাটি সম্পাদনা শুরু করতে চান , তবে আপনাকে সেই বার্তাগুলি বের করে পাস করতে হবে তাদের git commit
:
git reset --soft HEAD~3 &&
git commit --edit -m"$(git log --format=%B --reverse HEAD..HEAD@{1})"
এই দুটি পদ্ধতির স্কোয়াশ দুটিই একইভাবে একক নতুন প্রতিশ্রুতিবদ্ধ হয়ে প্রতিশ্রুতিবদ্ধ। নরম রিসেটটি কেবল শেষ প্রতিশ্রুতিতে পুনরায় নির্দেশ করে যে আপনি স্কোয়াশ করতে চান না। আপনার নতুন প্রতিশ্রুতির জন্য সূচকটিকে পছন্দসই অবস্থায় রেখে, সূচক বা কার্যকারী গাছকেই স্পর্শ করা যায় না (যেমন এটি ইতিমধ্যে যে সমস্ত কমিটগুলি আপনি "দূরে ফেলে" যাচ্ছেন তার সমস্ত পরিবর্তন রয়েছে)।
git rebase --squash-recent
বা এমনকি git commit --amend-many
।
branch@{upstream}
(বা কেবল @{upstream}
বর্তমান শাখার জন্য; উভয় ক্ষেত্রেই শেষ অংশটি সংক্ষেপিত হতে পারে @{u}
; গিটরিভিশনগুলি দেখুন )। এটি আপনার "সর্বশেষ ধাক্কা প্রতিশ্রুতি" থেকে পৃথক হতে পারে (উদাঃ যদি অন্য কেউ আপনার সাম্প্রতিক পুশের উপরে নির্মিত কোনও জিনিস ঠেকায় এবং তারপরে আপনি এটি এনেছিলেন) তবে মনে হয় এটি আপনি যা চান তার কাছাকাছি হতে পারে।
push -f
ছিল তবে অন্যথায় এটি সুন্দর ছিল, ধন্যবাদ।
git push --force
পরে আমারও এটি ব্যবহার করা দরকার যাতে এটি প্রতিশ্রুতি নেয়
আপনি এটির git merge --squash
জন্য ব্যবহার করতে পারেন , যা তুলনায় কিছুটা মার্জিত git rebase -i
। ধরুন আপনি মাস্টার হয়ে আছেন এবং আপনি সর্বশেষ 12 টি কমিটকে স্কোয়াশ করতে চান।
সতর্কতা: প্রথমে নিশ্চিত হয়ে নিন যে আপনি নিজের কাজটি করেছেন — git status
যা পরিষ্কার তা পরীক্ষা করুন (যেহেতু git reset --hard
পর্যায়ক্রমে এবং অস্থির পরিবর্তনগুলি ফেলে দেওয়া হবে)
তারপর:
# Reset the current branch to the commit just before the last 12:
git reset --hard HEAD~12
# HEAD@{1} is where the branch was just before the previous command.
# This command sets the state of the index to be as it would just
# after a merge from that commit:
git merge --squash HEAD@{1}
# Commit those squashed changes. The commit message will be helpfully
# prepopulated with the commit messages of all the squashed commits:
git commit
ডকুমেন্টেশনgit merge
বর্ণনা --squash
আরো বিস্তারিত বিকল্প।
আপডেট:git reset --soft HEAD~12 && git commit
ক্রিস জনসন তার উত্তরে প্রস্তাবিত সরলতম পদ্ধতির চেয়ে এই পদ্ধতির একমাত্র আসল সুবিধা হ'ল আপনি যে প্রতিশ্রুতি পাঠাচ্ছেন তা প্রতিশ্রুতিবদ্ধ বার্তা দিয়ে প্রিপিউপুলেটেড পাবেন।
git rebase -i
তবে আপনি এর কারণ দেবেন না। এটিকে সাময়িকভাবে -1 করা কারণ এটি আমার কাছে মনে হয় বাস্তবে বিপরীতটি সত্য এবং এটি একটি হ্যাক; আপনি বিশেষভাবে জন্য ডিজাইন করা git merge
জিনিসগুলির মধ্যে একটি জোর করার জন্য প্রয়োজনের চেয়ে আরও বেশি কমান্ড সম্পাদন করছেন না git rebase
?
git merge --squash
একটি স্ক্রিপ্ট ব্যবহার করার জন্য সহজ। মূলত, যুক্তিটি হ'ল এর জন্য আপনার মোটেও "ইন্টারেক্টিভিটি" দরকার নেই git rebase -i
।
git merge --squash
প্রত্যাবর্তনের তুলনায় মুভ / মুছে ফেলা / পুনর্নবীকরণের ক্ষেত্রে মার্জ কোন্দল তৈরি হওয়ার সম্ভাবনা কম, বিশেষত যদি আপনি কোনও স্থানীয় শাখা থেকে মার্জ করছেন। (অস্বীকৃতি: কেবলমাত্র একটি অভিজ্ঞতার ভিত্তিতে, সাধারণ ক্ষেত্রে এটি সত্য না হলে আমাকে সংশোধন করুন!)
HEAD@{1}
নিরাপদ পাশে থাকার পরিবর্তে একটি টেম্পোরাল ট্যাগ ব্যবহার করতাম যেমন আপনার কর্মপ্রবাহ যখন বিদ্যুৎ বিভ্রাটের ফলে এক ঘন্টা বাধাপ্রাপ্ত হয় ইত্যাদি
আমি git reset
যখন সম্ভব হয় এড়ানো পরামর্শ দিই - বিশেষত গিট-নোভিসদের জন্য। বেশ কয়েকটি কমিটের উপর ভিত্তি করে আপনার যদি সত্যিই কোনও প্রক্রিয়া স্বয়ংক্রিয় করার প্রয়োজন না হয়, তবে একটি কম বিদেশি উপায় আছে ...
git merge --squash (working branch name)
git commit
প্রতিশ্রুতিবদ্ধ বার্তা স্কোয়াশের উপর ভিত্তি করে প্রিপোপুলেটেড হবে।
gitk
আপনি স্কোয়াশ করছেন এমন লাইনটি লেবেল করতে জিওআই ইন্টারফেসটি ব্যবহার করুন এবং এটিতে স্কোয়াশ করতে হবে তার ভিত্তিতে লেবেলও দিন। সাধারণ ক্ষেত্রে, এই দুটি লেবেল ইতিমধ্যে বিদ্যমান থাকবে, সুতরাং পদক্ষেপ (1) এড়ানো যায়।
git branch your-feature && git reset --hard HEAD~N
সবচেয়ে সুবিধাজনক উপায় খুঁজে পেয়েছি । যাইহোক, এটি আবার গিট রিসেট জড়িত, যা এই উত্তর এড়াতে চেষ্টা করেছে।
ক্রিস জনসেনের উত্তরের ভিত্তিতে ,
বাশ থেকে একটি বিশ্বব্যাপী "স্কোয়াশ" নাম যুক্ত করুন: (বা উইন্ডোজে গিট বাশ)
git config --global alias.squash '!f(){ git reset --soft HEAD~${1} && git commit --edit -m"$(git log --format=%B --reverse HEAD..HEAD@{1})"; };f'
... অথবা উইন্ডোজ কমান্ড প্রম্পট ব্যবহার:
git config --global alias.squash "!f(){ git reset --soft HEAD~${1} && git commit --edit -m\"$(git log --format=%B --reverse HEAD..HEAD@{1})\"; };f"
আপনার ~/.gitconfig
এখন এই উপনামটি থাকা উচিত:
[alias]
squash = "!f(){ git reset --soft HEAD~${1} && git commit --edit -m\"$(git log --format=%B --reverse HEAD..HEAD@{1})\"; };f"
ব্যবহার:
git squash N
... যা স্বয়ংক্রিয়ভাবে শেষ কমিটগুলি N
সমেত একসাথে স্কোয়াশ করে।
দ্রষ্টব্য: ফলস্বরূপ প্রতিশ্রুতি বার্তা হ'ল ক্রমযুক্ত সমস্ত স্কটিশ কমিটের সংমিশ্রণ। আপনি যদি এতে সন্তুষ্ট হন তবে আপনি সর্বদা git commit --amend
এটি ম্যানুয়ালি সংশোধন করতে পারেন । (বা, আপনার স্বাদ মেলে উপন্যাস সম্পাদনা করুন।)
git squash -m "New summary."
এবং N
চাপবিহীন কমিটের সংখ্যা হিসাবে স্বয়ংক্রিয়ভাবে নির্ধারণ করেছি ।
git commit --amend
বার্তাটি আরও পরিবর্তন করতে ব্যবহার করতে পারেন তবে এই উপনামটি আপনাকে প্রতিশ্রুতি বার্তায় কী হওয়া উচিত তার একটি ভাল সূচনা করতে দেয়।
এই সুবিধাজনক ব্লগ পোস্টের জন্য ধন্যবাদ আমি পেয়েছি যে আপনি শেষ 3 টি কমিটিকে স্কোয়াশ করতে এই আদেশটি ব্যবহার করতে পারেন:
git rebase -i HEAD~3
আপনি কোনও ট্র্যাকিংয়ের তথ্য / দূরবর্তী রেপো না দিয়ে কোনও স্থানীয় শাখায় থাকা অবস্থায়ও এটি কাজ করে y
কমান্ডটি ইন্টারেক্টিভ রিবেস সম্পাদকটি খুলবে যা তারপরে আপনাকে স্বাভাবিক হিসাবে পুনরায় অর্ডার, স্কোয়াশ, পুনর্নির্মাণের অনুমতি দেয়।
ইন্টারেক্টিভ রিবেস সম্পাদক ব্যবহার করে:
ইন্টারেক্টিভ রিবেস সম্পাদক শেষ তিনটি কমিট দেখায়। HEAD~3
কমান্ড চালানোর সময় এই সীমাবদ্ধতা নির্ধারণ করা হয়েছিল git rebase -i HEAD~3
।
সর্বাধিক সাম্প্রতিক প্রতিশ্রুতিবদ্ধতা, HEAD
প্রথম লাইনটিতে প্রদর্শিত হয় 1 এর সাথে শুরু হওয়া লাইনগুলি #
মন্তব্য / ডকুমেন্টেশন।
প্রদর্শিত ডকুমেন্টেশন বেশ পরিষ্কার। যে কোনও প্রদত্ত লাইনে আপনি pick
কমান্ডটি আপনার পছন্দসই কমান্ড থেকে পরিবর্তন করতে পারেন ।
আমি কমান্ডটি ব্যবহার করতে পছন্দ করি fixup
এই "স্কোয়াশস" হিসাবে উপরের লাইনে কমিটের প্রতিশ্রুতিতে পরিবর্তিত হয়ে কমিটিকে এবং কমিটের বার্তাটি বাতিল করে দিই।
যেমন 1 লাইনের প্রতিশ্রুতিবদ্ধতা HEAD
, বেশিরভাগ ক্ষেত্রে আপনি এটিকে ছেড়ে চলে যাবেন pick
। আপনি ব্যবহার করতে পারবেন না squash
বা fixup
যেমন প্রতিশ্রুতি স্কোয়াশ করার জন্য অন্য কোনও প্রতিশ্রুতি নেই।
আপনি কমিটের ক্রমও পরিবর্তন করতে পারেন। এটি আপনাকে স্কোয়াশ বা ফিক্সআপ করার অনুমতি দেয় যা কালানুক্রমিকভাবে সংলগ্ন নয়।
একটি বাস্তব দৈনন্দিন উদাহরণ
আমি সম্প্রতি একটি নতুন বৈশিষ্ট্য প্রতিশ্রুতিবদ্ধ করেছি। তার পর থেকে আমি দুটি বাগ সংশোধন করেছি। তবে এখন আমি প্রতিশ্রুতিবদ্ধ নতুন বৈশিষ্ট্যে একটি বাগ (বা সম্ভবত কেবল একটি বানানের ত্রুটি) আবিষ্কার করেছি। কি বিরক্তিকর! আমি আমার প্রতিশ্রুতিবদ্ধ ইতিহাস দূষিত নতুন প্রতিশ্রুতি চাই না!
আমি প্রথম জিনিসটি ভুলটি সংশোধন করে মন্তব্যটি দিয়ে একটি নতুন প্রতিশ্রুতিবদ্ধ squash this into my new feature!
।
আমি তখন চালানোর git log
বা gitk
এবং (এই ক্ষেত্রে নতুন বৈশিষ্ট্যের রয়েছে SHA কমিট পেতে 1ff9460
)।
এরপরে, আমি ইন্টারেক্টিভ রিবেস সম্পাদকটি সাথে আনছি git rebase -i 1ff9460~
। ~
কমিট পরে রয়েছে SHA সম্পাদক বলে অন্তর্ভুক্ত করা যে সম্পাদকে কমিট।
এরপরে, আমি fe7f1e0
বৈশিষ্ট্যটির প্রতিশ্রুতিটির নীচে স্থির ( ) সংযুক্ত প্রতিশ্রুতিটি স্থানান্তর করি এবং এতে পরিবর্তন pick
করি fixup
।
সম্পাদকটি বন্ধ করার সময়, বৈশিষ্ট্যটি প্রতিশ্রুতিতে ফিক্সটি স্কোয়াশ হয়ে যাবে এবং আমার প্রতিশ্রুতিবদ্ধ ইতিহাসটি দেখতে সুন্দর এবং পরিষ্কার দেখাবে!
সমস্ত কমিট স্থানীয় থাকাকালীন এটি ভালভাবে কাজ করে তবে আপনি যদি ইতিমধ্যে দূরবর্তী স্থানে পাঠানো কোনও কমিটগুলি পরিবর্তন করার চেষ্টা করেন আপনি একই শাখাটি পরীক্ষা করে দেখেছেন এমন অন্যান্য দেবদের জন্য সত্যই সমস্যা দেখা দিতে পারে!
pick
লাইনে 1 ছেড়ে যান you আপনি যদি লাইন 1 squash
বা fixup
কমিটের জন্য চয়ন করেন তবে গিট একটি বার্তা দেখায় যা "ত্রুটি: পূর্ববর্তী প্রতিশ্রুতি ছাড়া 'ফিক্সআপ' করতে পারে না" saying তারপরে এটি আপনাকে এটি ঠিক করার বিকল্প দেবে: "আপনি এটি 'গিট রিবেস --edit-todo' দিয়ে ঠিক করতে পারেন এবং তারপরে 'গিট রিবেস - কনটিনিউ' চালাতে পারেন" " অথবা আপনি কেবল গর্ভপাত বন্ধ করতে পারেন এবং আবার শুরু করতে পারেন: "অথবা আপনি 'গিট রিবেস --abort' দিয়ে রিবাজটি বাতিল করতে পারেন।
আপনি যদি টরটোইজিট ব্যবহার করেন তবে আপনি এই কাজটি করতে পারেন Combine to one commit
:
Show Log
Combine to one commit
প্রসঙ্গ মেনু থেকে নির্বাচন করুনএই ফাংশনটি স্বয়ংক্রিয়ভাবে সমস্ত প্রয়োজনীয় একক গিট পদক্ষেপগুলি কার্যকর করে। দুর্ভাগ্যজনকভাবে কেবল উইন্ডোজের জন্য উপলব্ধ।
এটি করতে আপনি নিম্নলিখিত গিট কমান্ডটি ব্যবহার করতে পারেন।
git rebase -i HEAD~n
n (= এখানে 4) হ'ল সর্বশেষ কমিটের সংখ্যা। তারপরে আপনি নিম্নলিখিত বিকল্পগুলি পেয়েছেন,
pick 01d1124 Message....
pick 6340aaa Message....
pick ebfd367 Message....
pick 30e0ccb Message....
pick
এক প্রতিশ্রুতি নীচে এবং squash
অন্যদের সাম্প্রতিকতম হিসাবে আপডেট করুন ,
p 01d1124 Message....
s 6340aaa Message....
s ebfd367 Message....
s 30e0ccb Message....
বিস্তারিত জানার জন্য লিংকে ক্লিক করুন
এই নিবন্ধের ভিত্তিতে আমি এই পদ্ধতিটি আমার ব্যবহারের জন্য সহজভাবে খুঁজে পেয়েছি।
আমার 'দেব' শাখাটি 96 টি কমিট দ্বারা 'উত্স / দেব' এর চেয়ে এগিয়ে ছিল (সুতরাং এই কমিটগুলি এখনও রিমোটে ঠেলা যায়নি)।
আমি পরিবর্তনের দিকে এগিয়ে যাওয়ার আগে এই প্রতিশ্রুতিগুলিকে স্কোয়াশ করতে চেয়েছিলাম। আমি শাখাটিকে 'উত্স / দেব' অবস্থায় পুনরায় সেট করতে পছন্দ করি (এটি st৯ টি কমিটস ছাড়াই সমস্ত পরিবর্তন ছাড়বে) এবং তারপরে একবারে পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ:
git reset origin/dev
git add --all
git commit -m 'my commit message'
শাখায় আপনি কমিটগুলি একত্রিত করতে চান, চালান:
git rebase -i HEAD~(n number of commits back to review)
উদাহরণ:
git rebase -i HEAD~1
এটি পাঠ্য সম্পাদকটি খুলবে এবং আপনি যদি এই প্রতিশ্রুতিগুলি একত্রে একত্রিত করতে চান তবে আপনাকে অবশ্যই 'স্কোয়াশ' এর সাথে প্রতিটি কমিটের সামনে 'বাছাই' স্যুইচ করতে হবে। ডকুমেন্টেশন থেকে:
উদাহরণস্বরূপ, আপনি যদি সমস্ত কমিটকে একের সাথে একীভূত করতে চান, তবে 'বাছাই' হ'ল আপনার করা প্রথম প্রতিশ্রুতি এবং ভবিষ্যতের সমস্তগুলি (প্রথমটির নীচে স্থাপন করা) 'স্কোয়াশ' এ সেট করা উচিত। যদি ভিএম ব্যবহার করে থাকেন তবে এক্স ব্যবহার করুন তবে সম্পাদকটি সংরক্ষণ এবং প্রস্থান করতে সন্নিবেশ মোডে করুন।
তারপরে রিবেস চালিয়ে যেতে:
git rebase --continue
আপনার প্রতিশ্রুতিবদ্ধ ইতিহাস পুনরায় লেখার জন্য এবং অন্যান্য উপায়গুলির জন্য আরও এই সহায়ক পোস্টটি দেখুন
--continue
এবং vim কী করে তাও ব্যাখ্যা করুন :x
।
git add
যখন আপনার প্রতিশ্রুতিতে যান এবং ফাইলগুলি git rebase --continue
মার্জ করতে শুরু করেন তখন আপনার ফাইলগুলিতে সঠিক কনফিগারেশন ব্যবহার করার পরে, আপনার শাখায় কমে যাওয়ার মাধ্যমে রিবেস ব্লকগুলিতে ঘটবে blocks :x
আর মাত্র একটি কমান্ড যে ফাইল পরিবর্তন যখন তেজ দেখতে ব্যবহার করে সংরক্ষণ করুন করবে এই
অ্যানোমির উত্তর ভাল, তবে আমি এ সম্পর্কে নিরাপত্তাহীনতা বোধ করেছি তাই আমি বেশ কয়েকটি স্ক্রিনশট যুক্ত করার সিদ্ধান্ত নিয়েছি।
আপনি কোথায় আছেন দেখুন git log
। সর্বাধিক গুরুত্বপূর্ণ, আপনি যে স্কোয়াশ করতে চান না সেই প্রথম প্রতিশ্রুতিটির কমিট হ্যাশ সন্ধান করুন । সুতরাং শুধুমাত্র:
সম্পাদন git rebase -i [your hash]
, আমার ক্ষেত্রে:
$ git rebase -i 2d23ea524936e612fae1ac63c95b705db44d937d
আমার ক্ষেত্রে, আমি প্রথমে যে প্রতিশ্রুতি দিয়েছিলাম তাতে সমস্ত কিছু স্কোয়াশ করতে চাই। ক্রমটি প্রথম থেকে শেষ পর্যন্ত, ঠিক যেমনটি অন্যভাবে git log
। আমার ক্ষেত্রে, আমি চাই:
আপনি যদি একটি মাত্র প্রতিশ্রুতি বাছাই করে থাকেন এবং বাকীগুলি স্কোয়াশ করেন তবে আপনি একটি প্রতিশ্রুতি বার্তা সামঞ্জস্য করতে পারেন:
এটাই. আপনি এটি ( :wq
) সংরক্ষণ করার পরে , আপনি হয়ে গেছেন। এটি দিয়ে দেখুন git log
।
git log
1) কমিট শর্ট হ্যাশ সনাক্ত করুন
# git log --pretty=oneline --abbrev-commit
abcd1234 Update to Fix for issue B
cdababcd Fix issue B
deab3412 Fix issue A
....
এখানেও git log --oneline
শর্ট হ্যাশ পেতে ব্যবহার করা যেতে পারে।
2) আপনি স্কোয়াশ করতে চান (মার্জ) শেষ দুটি কমিট
# git rebase -i deab3412
3) এটি nano
মার্জ করার জন্য একটি সম্পাদক খোলে । এবং এটি নীচের মত দেখাচ্ছে
....
pick cdababcd Fix issue B
pick abcd1234 Update to Fix for issue B
....
4) শব্দ পুনঃনামকরণ pick
করা squash
হয় যা আগে উপস্থিত abcd1234
। নতুন নামকরণের পরে এটি নীচের মতো হওয়া উচিত।
....
pick cdababcd Fix issue B
squash abcd1234 Update to Fix for issue B
....
5) এখন nano
সম্পাদকটি সংরক্ষণ করুন এবং বন্ধ করুন । সংরক্ষণ করতে টিপুন ctrl + o
এবং টিপুন Enter
। এবং তারপরে ctrl + x
সম্পাদক থেকে প্রস্থান করতে টিপুন ।
)) তারপরে nano
সম্পাদক আবার মন্তব্য আপডেট করার জন্য খোলেন, প্রয়োজনে এটি আপডেট করুন।
7) এখন এটি সফলভাবে স্কোয়াশড, আপনি লগগুলি পরীক্ষা করে এটি যাচাই করতে পারেন।
# git log --pretty=oneline --abbrev-commit
1122abcd Fix issue B
deab3412 Fix issue A
....
8) এখন রেপো চাপুন। +
শাখার নামের আগে সাইন যোগ করার জন্য নোট করুন । এর অর্থ জোর করে ধাক্কা।
# git push origin +master
দ্রষ্টব্য: এটি ubuntu
শেলের উপর গিট ব্যবহারের উপর ভিত্তি করে । আপনি যদি বিভিন্ন ওএস ( Windows
বা Mac
) ব্যবহার করে থাকেন তবে উপরের কমান্ডগুলি সম্পাদক ব্যতীত সমান। আপনি বিভিন্ন সম্পাদক পেতে পারেন।
git add <files>
--fixup
বিকল্পটি ব্যবহার করে প্রতিশ্রুতিবদ্ধ করুন এবং OLDCOMMIT
যেটিতে আমাদের এই কমিটটি মার্জ (স্কোয়াশ) করতে হবে তা হওয়া উচিত।git commit --fixup=OLDCOMMIT
এখন এটি হেডের শীর্ষে একটি নতুন প্রতিশ্রুতি তৈরি করে fixup1 <OLDCOMMIT_MSG>
।
OLDCOMMIT
।git rebase --interactive --autosquash OLDCOMMIT^
এখানে ^
পূর্বের প্রতিশ্রুতি দেওয়া মানে OLDCOMMIT
। এই rebase
কমান্ডটি একটি সম্পাদক (ভিম বা ন্যানো) এর সাথে ইন্টারেক্টিভ উইন্ডোটি খুলবে যে আমাদের কেবল কিছু সংরক্ষণ করার দরকার নেই এবং প্রস্থান করা যথেষ্ট। কারণ এতে পাস করা বিকল্পটি স্বয়ংক্রিয়ভাবে সর্বশেষ প্রতিশ্রুতিটিকে পুরানো প্রতিশ্রুতিতে স্থানান্তরিত করবে এবং অপারেশনটিকে এতে পরিবর্তন করবেfixup
(স্কোয়াশের সমতুল্য) এ । তারপরে রিবেস অব্যাহত থাকে এবং শেষ হয়।
--amend
ব্যবহার করা যেতে পারে git-commit
। # git log --pretty=oneline --abbrev-commit
cdababcd Fix issue B
deab3412 Fix issue A
....
# git add <files> # New changes
# git commit --amend
# git log --pretty=oneline --abbrev-commit
1d4ab2e1 Fix issue B
deab3412 Fix issue A
....
এখানে --amend
সর্বশেষ প্রতিশ্রুতিতে নতুন পরিবর্তনগুলি মার্জ করে cdababcd
এবং নতুন প্রতিশ্রুতি আইডি উত্পন্ন করে1d4ab2e1
শেষ 10 টি স্কোয়াশ করতে 1 টি একক প্রতিশ্রুতিতে:
git reset --soft HEAD~10 && git commit -m "squashed commit"
আপনি যদি স্কোয়াশেড কমিটের সাহায্যে রিমোট শাখাটি আপডেট করতে চান:
git push -f
যদি আপনি কোনও সুদূর শাখায় থাকেন (যাকে বলা হয় feature-branch
) গোল্ডেন রিপোজিটরি ( golden_repo_name
) থেকে ক্লোন করা হয়েছে, তবে আপনার প্রতিশ্রুতিগুলিকে স্কোয়াশ করার কৌশলটি এখানে:
সোনার রেপো চেকআউট করুন
git checkout golden_repo_name
এটি থেকে একটি নতুন শাখা তৈরি করুন (সোনার রেপো) নীচে
git checkout -b dev-branch
আপনার ইতিমধ্যে আপনার স্থানীয় শাখায় স্কোয়াশ মার্জ
git merge --squash feature-branch
আপনার পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ (এটিই একমাত্র অঙ্গীকার যা দেব-শাখায় চলে)
git commit -m "My feature complete"
আপনার স্থানীয় সংগ্রহস্থলে শাখাটি পুশ করুন
git push origin dev-branch
আসলে কি সুবিধাজনক হতে পারে:
আপনি যে স্ক্র্যাশ করতে চান তার উপরের কমিট হ্যাশটি সন্ধান করুন, বলুন d43e15
।
এখন ব্যবহার করুন
git reset d43e15
git commit -am 'new commit name'
এটি সুপার-ডুপার ক্লডগি, তবে এক ধরণের দুর্দান্ত উপায়ে, তাই আমি এটিকে কেবল রিংয়ে টস করব:
GIT_EDITOR='f() { if [ "$(basename $1)" = "git-rebase-todo" ]; then sed -i "2,\$s/pick/squash/" $1; else vim $1; fi }; f' git rebase -i foo~5 foo
অনুবাদ: গিটের জন্য একটি নতুন "সম্পাদক" সরবরাহ করুন, যদি সম্পাদনা করা ফাইলের git-rebase-todo
নামটি (ইন্টারেক্টিভ রিবেস প্রম্পট) হয় তবে প্রথম "বাছাই" ব্যতীত "স্কোয়াশ" এ সমস্ত পরিবর্তন হয়, এবং অন্যথায় ভিম তৈরি হয় - যাতে আপনাকে অনুরোধ করা হয় স্কোয়াশেড কমিট বার্তা সম্পাদনা করতে, আপনি ভিম পাবেন। (এবং স্পষ্টতই আমি শাখা ফু-তে সর্বশেষ পাঁচটি প্রতিশ্রুতি স্কোয়াশ করছিলাম, তবে আপনি নিজের পছন্দ মতো পরিবর্তন করতে পারেন))
যদিও মার্ক লংএয়ারের পরামর্শ ছিল আমি সম্ভবত তাই করতাম ।
আপনি যদি প্রতিটি প্রতিশ্রুতি একক প্রতিশ্রুতিতে স্কোয়াশ করতে চান (যেমন প্রথমবারের জন্য কোনও প্রকল্প প্রকাশ্যে প্রকাশ করার সময়), চেষ্টা করুন:
git checkout --orphan <new-branch>
git commit
আমি মনে করি এটি করার সবচেয়ে সহজ উপায় হ'ল মাস্টার অফ করে নতুন শাখা তৈরি করা এবং বৈশিষ্ট্য শাখার মার্জ - স্কোয়াশ করা।
git checkout master
git checkout -b feature_branch_squashed
git merge --squash feature_branch
তারপরে আপনার কাছে পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ করার জন্য প্রস্তুত।
আপনি যে শাখায় স্কোয়াশ করতে চান সেই শাখায় বর্তমানে রয়েছেন এমন সরল ওয়ানলাইনারটি সর্বদা কাজ করে, সর্বশেষ প্রতিশ্রুতিতে প্রতিশ্রুতিবদ্ধ বার্তা এবং লেখক রয়েছে যা আপনি ব্যবহার করতে চান:
git reset --soft $(git merge-base HEAD master) && git commit --reuse-message=HEAD@{1}
উদাহরণস্বরূপ যদি আপনি সর্বশেষ 3 টি স্কোয়াশ করতে চান একটি শাখায় (রিমোট রিপোজিটরি) উদাহরণস্বরূপ: একক প্রতিশ্রুতিতে প্রতিশ্রুতিবদ্ধ: https://bitbucket.org
আমি যা করেছি তা হ'ল
(MASTER)
Fleetwood Mac Fritz
║ ║
Add Danny Lindsey Stevie
Kirwan Buckingham Nicks
║ ╚═══╦══════╝
Add Christine ║
Perfect Buckingham
║ Nicks
LA1974══════════╝
║
║
Bill <══════ YOU ARE EDITING HERE
Clinton (CHECKED OUT, CURRENT WORKING DIRECTORY)
Https://github.com/fleetwood-mac/band-history repository এর এই সংক্ষিপ্ত বিবরণ ইতিহাসে আপনি বিল ক্লিন্টন কমিটকে আসল ( MASTER
) ফ্লিটউড ম্যাক কমিটে মার্জ করার জন্য একটি টান অনুরোধটি খুলেছেন ।
আপনি একটি টানার অনুরোধ খুলেছেন এবং গিটহাবে আপনি এটি দেখতে পেয়েছেন:
চারটি অঙ্গীকার:
এই ভেবে যে কেউ কখনই সম্পূর্ণ সংগ্রহস্থলের ইতিহাস পড়ার চিন্তা করবেন না। (প্রকৃতপক্ষে একটি ভান্ডার রয়েছে, উপরের লিঙ্কটিতে ক্লিক করুন!) আপনি এই কমিটিগুলি স্কোয়াশ করার সিদ্ধান্ত নিয়েছেন। সুতরাং আপনি যান এবং চালান git reset --soft HEAD~4 && git commit
। তারপরে আপনি git push --force
এটি আপনার পিআর পরিষ্কার করতে গিটহাবের উপরে onto
আর কি হয়? আপনি কেবল একক প্রতিশ্রুতিবদ্ধ করেছেন যা ফ্রিটজ থেকে বিল ক্লিনটনের কাছে পৌঁছেছে। কারণ আপনি ভুলে গেছেন যে গতকাল আপনি এই প্রকল্পের বাকিংহাম নিক্স সংস্করণে কাজ করছেন। এবং git log
আপনি গিটহাবের সাথে যা দেখেন তা মেলে না।
git checkout
তাদেরgit reset --soft
এটিgit commit
থেকে সরাসরি যে warps থেকে থেকে থেকেযদি আপনি অন্তর্বর্তীকালীন কমিটগুলির প্রতিশ্রুতিবদ্ধ বার্তাগুলি সম্পর্কে চিন্তা না করেন তবে আপনি ব্যবহার করতে পারেন
git reset --mixed <commit-hash-into-which-you-want-to-squash>
git commit -a --amend
git rebase -i HEAD^^
যেখানে এর সংখ্যাটি এক্স
(এক্ষেত্রে স্কোয়াশ দুটি শেষ কমিট)
অন্যান্য দুর্দান্ত উত্তরের পাশাপাশি, আমি যুক্ত করতে চাই যে কীভাবে git rebase -i
আমাকে সর্বদা কমিটের আদেশের সাথে বিভ্রান্ত করে তোলে - পুরোনো থেকে নতুন বা তার বিপরীতে? সুতরাং এটি আমার কর্মপ্রবাহ:
git rebase -i HEAD~[N]
, যেখানে সাম্প্রতিকতমটি থেকে শুরু করে আমি যোগ দিতে চাইছি এমন কমিটের সংখ্যা এন । সুতরাং git rebase -i HEAD~5
"স্কোয়াশটি সর্বশেষ 5 টি নতুন করে কমিট করে" এর অর্থ হবে;এই জাতীয় একটি ওয়ার্কফ্লো সম্পর্কিত প্রশ্নের উত্তর সম্পর্কে কি?
merge --squash
পরে বিকাশকারীদের পক্ষে আরও সহজ হবে , তবে দলটি ভেবেছিল যে প্রক্রিয়াটি ধীর করবে would)এই পৃষ্ঠায় আমি এর মতো কোনও ওয়ার্কফ্লো দেখিনি। (এটি আমার চোখ হতে পারে)) যদি আমি rebase
সঠিকভাবে বুঝতে পারি তবে একাধিক সংশ্লেষের জন্য একাধিক সংঘাতের সমাধানের প্রয়োজন হবে । আমি এমনকি এটি সম্পর্কে চিন্তা করতে চাই না!
সুতরাং, এটি আমাদের পক্ষে কাজ করে বলে মনে হচ্ছে।
git pull master
git checkout -b new-branch
git checkout -b new-branch-temp
git checkout new-branch
git merge --squash new-branch-temp
// সমস্ত পরিবর্তনকে পর্যায়ক্রমে রাখেgit commit 'one message to rule them all'
git push
আমি আরও একটি জেনেরিক সমাধান 'এন' কমিটগুলি নির্দিষ্ট করা নয়, বরং আপনি যে শাখা / প্রতিশ্রুতি-আইডি উপরে স্কোয়াশ করতে চান তা বোঝানো হয়েছে। নির্দিষ্ট অঙ্গীকারের প্রতিশ্রুতি গণনা করার চেয়ে এটি ত্রুটি-প্রবণতা কম — কেবলমাত্র ট্যাগটি সরাসরি উল্লেখ করুন বা আপনি যদি সত্যিই গণনা করতে চান তবে আপনি HEAD ~ N নির্দিষ্ট করতে পারেন।
আমার কর্মপ্রবাহে, আমি একটি শাখা শুরু করি এবং সেই শাখায় আমার প্রথম প্রতিশ্রুতি লক্ষ্যটির সংক্ষিপ্তসার দেয় (অর্থাত্ সাধারণত এটিই আমি সর্বজনীন ভাণ্ডারের কাছে বৈশিষ্ট্যটির জন্য 'চূড়ান্ত' বার্তা হিসাবে চাপ দেব)) সুতরাং আমি যখন সম্পন্ন করেছি তখন সমস্ত আমি করতে চাই git squash master
প্রথম বার্তায় ফিরে এসে আমি চাপ দেওয়ার জন্য প্রস্তুত।
আমি উপনামটি ব্যবহার করি:
squash = !EDITOR="\"_() { sed -n 's/^pick //p' \"\\$1\"; sed -i .tmp '2,\\$s/^pick/f/' \"\\$1\"; }; _\"" git rebase -i
এটি ইতিহাসটি স্কোয়াশ হওয়ার আগেই ফেলে দেবে — এটি যদি আপনি ফিরে যেতে চান তবে কনসোল থেকে একটি পুরানো প্রতিশ্রুতি আইডি ধরে পুনরুদ্ধার করার সুযোগ দেয়। (সোলারিস ব্যবহারকারীরা মনে করেন এটি জিএনইউ সেড -i
বিকল্পটি ব্যবহার করে , ম্যাক এবং লিনাক্স ব্যবহারকারীদের এটির সাথে ভাল হওয়া উচিত))
git squash master
যখন ক্রীতদাসকে পরীক্ষা করে দেখি তখন ব্যবহার করি। এটা কি হবে? আমরা কি দ্বন্দ্ব গোপন করব?
প্রশ্নটিতে এটি "শেষ" বলতে কী বোঝায় তা অস্পষ্ট হতে পারে।
উদাহরণস্বরূপ git log --graph
নিম্নলিখিতগুলি (সরলীকৃত) আউটপুট দেয়:
* commit H0
|
* merge
|\
| * commit B0
| |
| * commit B1
| |
* | commit H1
| |
* | commit H2
|/
|
তারপরে সর্বশেষ কমিটগুলি হ'ল এইচ 0, মার্জ, বি 0। তাদের স্কোয়াশ করতে আপনাকে আপনার মার্জ করা শাখাটি কমিট এইচ 1 এ পুনরায় চালু করতে হবে।
সমস্যাটি হ'ল এইচ 0 এ এইচ 1 এবং এইচ 2 রয়েছে (এবং সাধারণত মার্জ হওয়ার আগে এবং শাখা প্রশাখার পরে আরও বেশি কমিট করে) যখন বি 0 থাকে না। সুতরাং আপনাকে কমপক্ষে H0, মার্জ, H1, H2, B0 থেকে পরিবর্তনগুলি পরিচালনা করতে হবে।
রিবেস ব্যবহার করা সম্ভব তবে ভিন্ন পদ্ধতিতে অন্যদের উত্তরগুলির মধ্যে উল্লিখিত:
rebase -i HEAD~2
এটি আপনাকে পছন্দের বিকল্পগুলি প্রদর্শন করবে (অন্যান্য উত্তরে উল্লিখিত হিসাবে):
pick B1
pick B0
pick H0
এইচ 0 তে বাছাইয়ের পরিবর্তে স্কোয়াশ রাখুন:
pick B1
pick B0
s H0
সংরক্ষণ এবং প্রস্থান রিবেসের পরে H1 এর পরিবর্তে কমিটগুলি প্রয়োগ করা হবে। এর অর্থ হল যে এটি আপনাকে পুনরায় বিবাদগুলি সমাধান করতে বলবে (যেখানে প্রথমে হেড এইচ 1 হবে এবং তারপরে প্রয়োগ হওয়ার সাথে সাথে কমিটগুলি সংগ্রহ করবে)।
পুনর্বাসনের কাজ শেষ হওয়ার পরে আপনি স্কোয়াশেড এইচ 0 এবং বি 0 এর জন্য বার্তা চয়ন করতে পারেন:
* commit squashed H0 and B0
|
* commit B1
|
* commit H1
|
* commit H2
|
পিএস যদি আপনি বিও তে কিছু রিসেট করেন: (উদাহরণস্বরূপ, এটি ব্যবহার করে reset --mixed
এখানে আরও বিস্তারিতভাবে ব্যাখ্যা করা হয়েছে https://stackoverflow.com/a/18690845/2405850 ):
git reset --mixed hash_of_commit_B0
git add .
git commit -m 'some commit message'
তারপরে আপনি এইচ 0, এইচ 1, এইচ 2 এর বি0 পরিবর্তনগুলিতে স্কোয়াশ করুন (ব্রাঞ্চিংয়ের পরে এবং মার্জ হওয়ার আগে পরিবর্তনের জন্য পুরোপুরি প্রতিশ্রুত হারাতে হবে।