গিট: কীভাবে সমস্ত শাখায় স্কোয়াশ করা যায়


315

আমি এর মাধ্যমে নতুন শাখা তৈরি করছি master:

git checkout -b testbranch

আমি এতে 20 টি কমিট করি।

এখন আমি সেই 20 টি কমিটিকে স্কোয়াশ করতে চাই। আমি এটি দিয়ে:

git rebase -i HEAD~20

আমি কয়টি কমিট জানি না? এর মতো কিছু করার কি কোনও উপায় আছে:

git rebase -i all on this branch

6
আপনি যা করতে পারেন git rebase -i 58333012713fc168bd70ad00d191b3bdc601fa2dতা একটি ইন্টারেক্টিভ রিবেস করতে পারবেন যেখানে কমিটমেন্টটি সর্বশেষ কমিট যেটি অপরিবর্তিত
49

@ এডেনস এই শাখায় শেষ প্রতিশ্রুতি সহ এই পদ্ধতিটি ব্যবহার করে আপনি দুর্দান্ত কাজ থেকে মুক্তি পাচ্ছেন । অনেক ধন্যবাদ!
জোশুয়া পিন্টার

উত্তর:


392

আপনার সমস্ত প্রতিশ্রুতি স্কোয়াশ করার অন্য উপায় হ'ল সূচকটি মাস্টারে পুনরায় সেট করা:

 git checkout yourBranch
 git reset $(git merge-base master yourBranch)
 git add -A
 git commit -m "one commit on yourBranch"

এটি নিখুঁত নয় কারণ এটি বোঝাচ্ছে আপনি "আপনার ব্রাঞ্চ" কোন শাখা থেকে আগত know
দ্রষ্টব্য: গিটের সাথে যে মূল শাখাটি সন্ধান করা সহজ / সম্ভব নয় ( দৃশ্যমান উপায়ে প্রায়শই সর্বাধিক সহজ , এখানে দেখা যায় )।


সম্পাদনা: আপনার ব্যবহার করতে হবে git push --force


Karlotcha Hoa থেকে যোগ মন্তব্য :

রিসেটের জন্য, আপনি এটি করতে পারেন

git reset $(git merge-base master $(git rev-parse --abbrev-ref HEAD)) 

[এটি] আপনি বর্তমানে যে শাখাটি চালু আছেন তা স্বয়ংক্রিয়ভাবে ব্যবহার করে।
এবং যদি আপনি এটি ব্যবহার করেন, আপনি একটি উপনামও ব্যবহার করতে পারেন, কারণ আদেশটি শাখার নামের উপর নির্ভর করে না


2
YourBranchবর্তমানে যেখানে আছেন তা প্রতিশ্রুতি দেওয়ার জন্য চেকআউট করা ভাল । YourBranchআপনি যখন করবেন তখন এটি অক্ষত থাকবেreset
ইউজেন কনকভ

1
@ আবদুররাহিম বা গিট ব্যাশ খুলুন এবং আপনি এই আদেশগুলি অনুলিপি করতে পারেন!
ভনসি

3
পুনরায় সেট করার জন্য, আপনি git reset $(git merge-base master $(git rev-parse --abbrev-ref HEAD))বর্তমানে যে শাখাটি চালু আছেন তা স্বয়ংক্রিয়ভাবে ব্যবহার করতে পারেন । এবং যদি আপনি এটি ব্যবহার করেন, আপনি একটি উপনামও ব্যবহার করতে পারেন, কারণ আদেশটি শাখার নামের উপর নির্ভর করে না।
কার্লোচা হোয়া

1
@ দ্রসকা সিম্পল শাখা-প্রশাখার ক্ষেত্রে, না, এটি ঠিকঠাক কাজ করা উচিত।
ভোনসি

1
@ শিমি হ্যাঁ, রিসেটের পরে আপনি জোর চাপিয়েছেন: git push --force(এবং যদি আপনি সেই শাখায় কাজ করছেন এমন অনেক লোক থাকেন তবে আপনার সহকর্মীদের সতর্ক করুন)
ভোনসি

112

যে শাখার জন্য আপনি সমস্ত কমিটকে একটি প্রতিশ্রুতিতে স্কোয়াশ করতে চান সেই শাখায় চেকআউট করুন। এটি বলা যাক feature_branch,।

git checkout feature_branch

ধাপ 1:

origin/feature_branchআপনার স্থানীয় masterশাখার সাথে আপনার সফ্ট রিসেট করুন (আপনার প্রয়োজনের উপর নির্ভর করে আপনি উত্স / মাস্টার দিয়েও পুনরায় সেট করতে পারেন)। এটি আপনার সমস্ত অতিরিক্ত কমিটগুলি পুনরায় সেট করবে feature_branchতবে স্থানীয়ভাবে আপনার ফাইলের কোনও পরিবর্তন ছাড়াই।

git reset --soft master

ধাপ ২:

আপনার গিট রেপো ডিরেক্টরিতে তৈরি হওয়া সমস্ত নতুন প্রতিশ্রুতিতে সমস্ত পরিবর্তন যুক্ত করুন। এবং একটি বার্তা দিয়ে একই প্রতিশ্রুতিবদ্ধ।

git add -A && git commit -m "commit message goes here"


6
এটি ছিল আমার পক্ষে সবচেয়ে নির্ভরযোগ্য সমাধান - কোনও পুনর্বাসনের ত্রুটি না ঘটায় এবং সংঘাতের সংঘাত সৃষ্টি না করে।
আনতারা

1
সতর্কতা: গিট অ্যাড-আপনার স্থানীয় ফোল্ডারে থাকা সমস্ত কিছু যুক্ত করুন - শাখায়।
ডেভিড এইচ

এই সমাধান ভালোবাসি! এটাই আমি চেয়েছিলাম!
জ্যাকোব্লেনউড

1
কোনও নুব-এর জন্য সেরা সমাধান - অ ধ্বংসাত্মক এবং কেবল উফ মুহূর্তে অ্যাপ্লিকেশন সিক্রেটস ইত্যাদির মতো খুব বেশি পরীক্ষা করা হতে পারে, যা আপনার কাছে সঠিক গিটিগনোর ফাইল রয়েছে কিনা তা বিবেচ্য নয়
kkarakk

@ এনএনএসডিউইট সংক্ষিপ্ত উত্তর: না, আপনার দরকার নেই। আমার উত্তরে উপরোক্ত পদক্ষেপগুলি করার পরে, আপনি কিছু কোড পরিবর্তন করে একটি প্রতিশ্রুতি দিয়ে শেষ করবেন। আপনি কিছু কোড পরিবর্তনের সাথে অন্য কোনও প্রতিশ্রুতির মতোই এটি ভাবতে পারেন। আপনি -fপতাকাটি ছাড়াই এটিকে আপনার প্রত্যন্ত শাখায় ঠেলাতে পারেন।
ঝাঁকুনি

110

আপনি যা করছেন তা বেশ ত্রুটিযুক্ত pr শুধু কর:

git rebase -i master

যা কেবলমাত্র সর্বশেষ সর্বশেষ মাস্টারের উপর কেবলমাত্র আপনার শাখার প্রতিশ্রুতিগুলিকে স্বয়ংক্রিয়ভাবে রিবাজ করবে।


5
ধন্যবাদ, আমি এটি পেয়েছি তবে আমার সিস্টেমে ত্রুটি কেন প্রবণ
ইউজার 3803850

10
সম্ভবত ভুলটি নম্বর পাওয়া সহজ কারণ?
ড্যানিয়েল স্কট

13
সম্মত হ'ল এটি আপনার সেরা সমাধান। তবে এই লিঙ্কটি অনুসরণ করুন কারণ এটি আপনাকে কী করা উচিত তা আরও ভালভাবে ব্যাখ্যা করে।
ক্রিস্টো

3
স্কোয়াশিং কমিটের পরিবর্তে, আপনি শাখাকে মাস্টারে মার্জ করতে পারেন এবং সমস্ত কমিটগুলি স্টেস্টেজ করার জন্য উত্স / মাস্টারকে গিট রিসেট করতে পারেন। এটি আপনাকে আপনার বিদ্যমান স্টেস্টেড কোডটি commit -am "the whole thing!"
কমেন্ট

2
@ নুরেটিন আমি মনে করি reset origin/masterপদ্ধতিটি খুব খারাপ কারণ এটি সরাসরি মাস্টারের প্রতি দায়বদ্ধতা করার মতো - সেখানে 'মার্জ শাখা' ইতিহাস নেই, কোনও অনুরোধের বিকল্প নেই। @ ওয়াজএএর উত্তরটি আমার মনে হয় স্বাভাবিক গিট ওয়ার্কফ্লোকে রেখে অনেক বেশি
Drenai

79

এটি করার আরেকটি সহজ উপায়: মূল শাখায় যান এবং একটি করুন merge --squash। এই আদেশটি "স্কোয়াশেড" কমিট করে না। আপনি যখন এটি করেন, আপনার ব্রাঙ্কের সমস্ত প্রতিশ্রুতিবদ্ধ বার্তা সংগ্রহ করা হবে।

$ git checkout master
$ git merge --squash yourBranch
$ git commit # all commit messages of yourBranch in one, really useful
 > [status 5007e77] Squashed commit of the following: ...

1
সত্য। আমি একত্রীকরণ --squash এবং রি-বেসের ফলে -i মধ্যে পার্থক্য উল্লেখ stackoverflow.com/a/2427520/6309
VonC

1
এটি কাজ করে যদি আপনি পিতামাত শাখায় স্কোয়াশ চান না, কেবল তৈরি করুন এবং প্যারেন্ট ব্রাঞ্চের ভিত্তিতে একটি নতুন শাখায় স্যুইচ করুন এবং স্কোয়াশটিকে এতে মার্জ করুন do
শার্লট

চিয়ারস সাথী, দুর্দান্ত টিপ!
নেস্টর মিলিয়ায়েভ

চমৎকার! আমি প্রথমে "আপনার ব্র্যাঞ্চ" কে স্কোয়াশ করার জন্য "মাস্টার" থেকে "টেম্প" শাখা তৈরি করি, তারপরে "টেম্পর" কে "মাস্টার" তে মিশ্রিত করি।
লাজিবার্ড

34

ধরে নিই যে আপনি মাস্টারের কাছ থেকে শাখা করছেন, আপনাকে yourBranchসার্বক্ষণিক পুনরায় সেট করার পদক্ষেপে প্রবেশ করার দরকার নেই :

git checkout yourBranch
git reset --soft HEAD~$(git rev-list --count HEAD ^master)
git add -A
git commit -m "one commit on yourBranch"

ব্যাখ্যা :

  • git rev-list --count HEAD ^masterআপনি মাস্টার, এফেক্স থেকে আপনার বৈশিষ্ট্য শাখা তৈরি করার পরে কমিট গণনা করে f 20।
  • git reset --soft HEAD~20সর্বশেষ 20 টি কমিটকে একটি নরম রিসেট তৈরি করবে। এটি ফাইলগুলিতে আপনার পরিবর্তনগুলি ছেড়ে দেয় তবে কমিটগুলি সরিয়ে দেয়।

ব্যবহার :

আমার .bash_ প্রোফাইলে আমি gisquashএকটি কমান্ড দিয়ে এটি করার জন্য একটি উপনাম যুক্ত করেছি :

# squash all commits into one
alias gisquash='git reset --soft HEAD~$(git rev-list --count HEAD ^master)'

পুনরায় নির্ধারণ এবং প্রতিশ্রুতিবদ্ধ করার পরে আপনার একটি করা দরকার git push --force

ইঙ্গিত :

আপনি যদি গিটলব> = ১১.০ ব্যবহার করছেন তবে শাখা মার্জ করার সময় এটিতে স্কোয়াশিং বিকল্প রয়েছে বলে আপনার আর এটি করার দরকার নেই । গিটল্যাব স্কোয়াশিং বিকল্প


15

স্কোয়াশিংয়ের বিষয়ে বেশ কয়েকটি স্ট্যাকওভারফ্লো প্রশ্ন এবং উত্তর পড়ার ভিত্তিতে, আমি মনে করি এটি একটি শাখায় সমস্ত কমান্ড স্কোয়াশ করার জন্য ভাল একটি লাইনার:

git reset --soft $(git merge-base master YOUR_BRANCH) && git commit -am "YOUR COMMIT MESSAGE" && git rebase -i master

এটি ধরে নিচ্ছে যে মাস্টারটি বেস শাখা।


1
অনেক অনেক ধন্যবাদ, সংস্থার জায়গায় প্রচুর বিধিনিষেধ রয়েছে এবং কোনও সম্পাদকের সাথে যথাযথভাবে রিবেস করতে পারেনি কারণ এটি সংরক্ষণের জন্য উচ্চস্বরে ছিল না। এছাড়াও স্কোয়াশ ব্যবহার করতে পারে না এবং গিটে বৈশিষ্ট্যগুলি একীভূত করতে পারে না কারণ এই শাখাটি মার্জ হওয়ার জন্য লিড দেবের কাছে যায় এবং সে এটি পছন্দ করে না। এই 1 টি লাইনার কাজ করে এবং মাথা ব্যথা বাঁচায়। চমৎকার কাজ.
L1ghtk3ira

10

ক্লিক করা পছন্দ করে এমন লোকদের জন্য সমাধান:

  1. সোর্সট্রি ইনস্টল করুন (এটি নিখরচায়)

  2. আপনার কমিটগুলি কেমন দেখাচ্ছে তা পরীক্ষা করুন। সম্ভবত আপনার এর সাথে কিছু মিল রয়েছে এখানে চিত্র বর্ণনা লিখুন

  3. প্যারেন্ট কমিট এ ডান ক্লিক করুন । আমাদের ক্ষেত্রে এটি মাস্টার শাখা।

এখানে চিত্র বর্ণনা লিখুন

  1. আপনি বাটন ক্লিক করে আগেরটির সাথে স্কোয়াশ কমিট করতে পারেন। আমাদের ক্ষেত্রে আমাদের 2 বার ক্লিক করতে হবে। আপনি প্রতিশ্রুতি বার্তা পরিবর্তন করতে পারেন এখানে চিত্র বর্ণনা লিখুন

  2. ফলাফল দুর্দান্ত এবং আমরা ধাক্কা প্রস্তুত! এখানে চিত্র বর্ণনা লিখুন

পার্শ্ব দ্রষ্টব্য: আপনি যদি আংশিক প্রতিশ্রুতিগুলি দূরবর্তী স্থানে চাপ দিচ্ছেন তবে আপনাকে স্কোয়াশের পরে জোর ধাক্কা ব্যবহার করতে হবে


এর জন্য ধন্যবাদ!
ক্রিস্টাল

0

আর একটি সমাধান হ'ল কোনও ফাইলের সমস্ত প্রতিশ্রুতিবদ্ধ লগ সংরক্ষণ করা

গিট লগ> শাখা.লগ

এখন ব্রাঞ্চ.লগের প্রথম থেকেই সমস্ত কমিটস আইডি থাকবে .. প্রথম কমিট ব্যবহার করে ডাউন স্ক্রোল করুন এবং প্রথম প্রতিশ্রুতি (এটি টার্মিনালে কঠিন হবে) নিন

গিট রিসেট - সফ্ট

সমস্ত প্রতিশ্রুতি স্কোয়াশ করা হবে


0

গিট রিসেট, যেমন আগে অনেক উত্তরে উল্লিখিত হয়েছে, আপনি যা চান তা অর্জনের পক্ষে সর্বোত্তম এবং সহজতম উপায়। আমি এটি নিম্নলিখিত কর্মপ্রবাহে ব্যবহার করি:

(উন্নয়ন শাখায়)

git fetch
git merge origin/master  #so development branch has all current changes from master
git reset origin/master  #will show all changes from development branch to master as unstaged
git gui # do a final review, stage all changes you really want
git commit # all changes in a single commit
git branch -f master #update local master branch
git push origin master #push it

0

আপনি যদি পদক্ষেপগুলি সঠিকভাবে এবং কিছু ধরণের জেনির কাজ করেন তবে এই সমস্ত গিটটি পুনরায় সেট করা, শক্ত, নরম এবং এখানে বর্ণিত সমস্ত কিছু সম্ভবত কাজ করছে (এটি আমার পক্ষে হয়নি)।
আপনি যদি গড় জো ধূমপান হন তবে এটি চেষ্টা করুন:
গিট মার্জ - স্কোয়াশ কীভাবে ব্যবহার করবেন?


আমার জীবন বাঁচিয়েছে এবং স্কোয়াশে আমার যেতে হবে, যখনই আমি এটি সম্পর্কে জানতে পেরেছি তখন এটি 4 বার ব্যবহার করে চলেছে। সাধারণ, পরিষ্কার এবং মূলত 1 কোমন্ড সংক্ষেপে:


আপনি যদি একটি শাখায় থাকেন তবে এটিকে "আমার_নিউজ ফিচার" বিকাশ বন্ধ করতে দিন এবং আপনার টানার অনুরোধে 35 টি কমিট (বা তবে অনেকগুলি) রয়েছে এবং আপনি এটি 1 হতে চান want

এ। নিশ্চিত করুন যে আপনার শাখাটি আপ টু ডেট রয়েছে, এগিয়ে যান বিকাশ করুন, সর্বশেষ হন এবং একত্রীকরণ করুন এবং "মাই_নিউজ ফিচার"
(যেকোন সময় আপনি যত তাড়াতাড়ি পারবেন তত তাড়াতাড়ি নেওয়া উচিত) সাথে বিবাদগুলি সমাধান

করুন B.

সি যাদু এখানে আছে।
আপনি আপনার কাজটি "আমার_নিউ_ফ্যাচার" থেকে "আমার_নিউ_ফ্যাচার_সম্পর্কিত" পর্যন্ত নিতে চান
তাই ঠিক করুন (আপনার নতুন শাখায় থাকাকালীন আমরা বিকাশ শুরু করেছি):
গিট মার্জ - স্কোয়াশ মাই_নিউজ ফিচার

আপনার সমস্ত পরিবর্তনগুলি এখন আপনার নতুন শাখায় থাকবে, এটি পরীক্ষা করে নির্দ্বিধায় অনুভব করুন, তারপরে আপনার সেই 1 শাখাটির একক কমিট, পুশ করুন, নতুন পিআর করুন - এবং পরের দিন পুনরাবৃত্তির জন্য অপেক্ষা করুন।
আপনি কোডিং পছন্দ করেন না? :)


0

এই সরঞ্জামটির জন্য বিশেষভাবে তৈরি করা সরঞ্জাম আপনি ব্যবহার করতে পারেন:

https://github.com/sheerun/git-squash

মূলত আপনাকে কল করতে হবে git squash masterএবং আপনি শেষ করেছেন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.