স্কোয়াশ আমার শেষ এক্স একসাথে গিট ব্যবহার করে its


3584

আমি কীভাবে আমার শেষ এক্সকে একসাথে গিট ব্যবহার করে প্রতিশ্রুতিবদ্ধ করতে স্কোয়াশ করতে পারি?


12
একই প্রশ্ন: stackoverflow.com/questions/7275508/...
koppor


2
@ ম্যাট টর্টোজাইজিট হ'ল আপনার হাতিয়ার। এটি একটি একক ফাংশন "একত্রে সংহত করুন" সরবরাহ করে যা পটভূমিতে সমস্ত পদক্ষেপগুলি স্বয়ংক্রিয়ভাবে কল করবে। দুর্ভাগ্যক্রমে শুধুমাত্র উইন্ডোজের জন্য উপলব্ধ। আমার উত্তর নীচে দেখুন।
ম্যাথিয়াস এম

1
- পর্যন্ত স্কোয়াশিং জন্য প্রথম এই দেখতে কমিট stackoverflow.com/questions/1657017/...
goelakash

1
পোস্ট বল ধাক্কা করতে স্কোয়াশ এক প্রয়োজন stackoverflow.com/questions/10298291/...
vikramvi

উত্তর:


2090

git rebase -i <after-this-commit>দ্বিতীয়টিতে "বাছাই" ব্যবহার করুন এবং প্রতিস্থাপন করুন এবং ম্যানুয়ালটিতে বর্ণিত হিসাবে "স্কোয়াশ" বা "ফিক্সআপ" দিয়ে কমিট করবে

এই উদাহরণস্বরূপ, <after-this-commit>হয় SHA1 হ্যাশ বা বর্তমান শাখার হেড থেকে আপেক্ষিক অবস্থান যা থেকে রিবেস কমান্ডের জন্য কমিটগুলি বিশ্লেষণ করা হয়। উদাহরণস্বরূপ, যদি ব্যবহারকারী অতীতের বর্তমান হেড থেকে 5 টি কমিটগুলি দেখতে চায় তবে কমান্ডটি হ'ল git rebase -i HEAD~5


260
এটি, আমি মনে করি, এই প্রশ্নের উত্তরটি কিছুটা ভাল স্ট্যাকওভারফ্লো.com
রায় ট্রুইলোভ

92
বলতে কী বোঝায় <after-this-commit>?
2540625

42
<after-this-commit>X + 1 কমিট করা অর্থাত্ স্কোয়াশ করতে চান এমন পুরানো প্রতিশ্রুতির পিতা বা মাতা।
joozek

338
আমি এই উত্তরটি খুব স্পষ্টরূপে স্পষ্টভাবে দেখতে পেলাম un একটি উদাহরণ সাহায্য করতে পারে।
ইয়ান ওলম্যান

53
এই rebase -iপদ্ধতির মধ্যে পার্থক্য এবং reset --softতা হ'ল rebase -iআমাকে প্রতিশ্রুতিবদ্ধ লেখককে ধরে রাখতে reset --softদেয়, আবার আমাকে পুনরায় মঞ্জুরি দেওয়ার অনুমতি দেয়। কখনও কখনও লেখকদের তথ্য বজায় রাখার জন্য আমাকে টানার অনুরোধগুলির স্কোয়াশ করা দরকার। কখনও কখনও আমার নিজের কমিটগুলিতে নরম পুনরায় সেট করা দরকার। যাইহোক যাইহোক উভয়ের দুর্দান্ত উত্তরের দিকে সমর্থন জানায়।
জিয়োনিক্স

3824

আপনি 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})"

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


163
হা! আমি এই পদ্ধতিটি পছন্দ করি। সমস্যাটির চেতনা বন্ধ করে দেওয়া হয়। এটি দুঃখের বিষয় যে এর পক্ষে এত ভুডু দরকার। এরকম কিছু প্রাথমিক কমান্ডগুলির একটিতে যুক্ত করা উচিত। সম্ভবত git rebase --squash-recentবা এমনকি git commit --amend-many
অ্যাড্রিয়ান রত্নপাল

13
@ এ বি বি: আপনার শাখায় যদি একটি "উজান" সেট থাকে তবে আপনি ব্যবহার করতে সক্ষম হতে পারেন branch@{upstream}(বা কেবল @{upstream}বর্তমান শাখার জন্য; উভয় ক্ষেত্রেই শেষ অংশটি সংক্ষেপিত হতে পারে @{u}; গিটরিভিশনগুলি দেখুন )। এটি আপনার "সর্বশেষ ধাক্কা প্রতিশ্রুতি" থেকে পৃথক হতে পারে (উদাঃ যদি অন্য কেউ আপনার সাম্প্রতিক পুশের উপরে নির্মিত কোনও জিনিস ঠেকায় এবং তারপরে আপনি এটি এনেছিলেন) তবে মনে হয় এটি আপনি যা চান তার কাছাকাছি হতে পারে।
ক্রিস জনসেন

104
এই ধরণের ধরণের আমার প্রয়োজন push -fছিল তবে অন্যথায় এটি সুন্দর ছিল, ধন্যবাদ।
2rs2ts

39
@ 2rs2ts গিট পুশ-ফ শব্দটি বিপজ্জনক। কেবলমাত্র স্কোয়াশের স্থানীয় কমিটগুলি যত্ন নিন। কখনও ধাক্কা কমিট স্পর্শ!
ম্যাথিয়াস এম

20
git push --forceপরে আমারও এটি ব্যবহার করা দরকার যাতে এটি প্রতিশ্রুতি নেয়
Zach Sauceer

738

আপনি এটির 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 ক্রিস জনসন তার উত্তরে প্রস্তাবিত সরলতম পদ্ধতির চেয়ে এই পদ্ধতির একমাত্র আসল সুবিধা হ'ল আপনি যে প্রতিশ্রুতি পাঠাচ্ছেন তা প্রতিশ্রুতিবদ্ধ বার্তা দিয়ে প্রিপিউপুলেটেড পাবেন।


16
আপনি বলছেন এটি তুলনায় আরও 'মার্জিত' git rebase -iতবে আপনি এর কারণ দেবেন না। এটিকে সাময়িকভাবে -1 করা কারণ এটি আমার কাছে মনে হয় বাস্তবে বিপরীতটি সত্য এবং এটি একটি হ্যাক; আপনি বিশেষভাবে জন্য ডিজাইন করা git mergeজিনিসগুলির মধ্যে একটি জোর করার জন্য প্রয়োজনের চেয়ে আরও বেশি কমান্ড সম্পাদন করছেন না git rebase?
মার্ক আমেরিকা

76
@ মার্ক আমেরিকা: বিভিন্ন কারণ রয়েছে যা আমি বলেছিলাম যে এটি আরও মার্জিত। উদাহরণস্বরূপ, এটি অযৌক্তিকভাবে একটি সম্পাদক তৈরি এবং তারপরে অনুসন্ধান এবং "টু-ডু" ফাইলটিতে স্ট্রিংয়ের পরিবর্তে জড়িত না। ব্যবহার git merge --squashএকটি স্ক্রিপ্ট ব্যবহার করার জন্য সহজ। মূলত, যুক্তিটি হ'ল এর জন্য আপনার মোটেও "ইন্টারেক্টিভিটি" দরকার নেই git rebase -i
লংগায়ার

12
আর একটি সুবিধা হ'ল git merge --squashপ্রত্যাবর্তনের তুলনায় মুভ / মুছে ফেলা / পুনর্নবীকরণের ক্ষেত্রে মার্জ কোন্দল তৈরি হওয়ার সম্ভাবনা কম, বিশেষত যদি আপনি কোনও স্থানীয় শাখা থেকে মার্জ করছেন। (অস্বীকৃতি: কেবলমাত্র একটি অভিজ্ঞতার ভিত্তিতে, সাধারণ ক্ষেত্রে এটি সত্য না হলে আমাকে সংশোধন করুন!)
চিজমিস্টার

2
হার্ড রিসেটের ক্ষেত্রে আমি সর্বদা খুব দ্বিধা বোধ করি - আমি HEAD@{1}নিরাপদ পাশে থাকার পরিবর্তে একটি টেম্পোরাল ট্যাগ ব্যবহার করতাম যেমন আপনার কর্মপ্রবাহ যখন বিদ্যুৎ বিভ্রাটের ফলে এক ঘন্টা বাধাপ্রাপ্ত হয় ইত্যাদি
টোবিয়াস কেইঞ্জলার

8
@ বিটি: আপনার প্রতিশ্রুতি নষ্ট করেছেন? :( আমি তার দ্বারা কী বোঝাতে চাইছি তা আমি নিশ্চিত নই you আপনি যে প্রতিশ্রুতিবদ্ধ করেছিলেন তা আপনারা সহজেই গিটের রিফ্লোগ থেকে ফিরে আসতে পারবেন you যদি আপনার কোনও কাজ ছাড়াই থাকে তবে ফাইলগুলি মঞ্চস্থ করা হয়, আপনি এখনও পেতে সক্ষম হবেন তাদের বিষয়বস্তু ফিরে, যদিও এটি আরও কাজ হবে your আপনার কাজটি এমনকি মঞ্চস্থ না করা হলেও, আমি ভয় করি যে কাজটি খুব কম করা যায়; তাই উত্তরটি সামনেই বলে: "প্রথমে গিটের অবস্থাটি পরিষ্কার কিনা তা পরীক্ষা করে দেখুন that (যেহেতু গিট রিসেট --হার্ড স্টেজড এবং স্টেস্টেড পরিবর্তনগুলি এড়াতে দেবে) "।
মার্ক লংগায়ার

218

আমি git resetযখন সম্ভব হয় এড়ানো পরামর্শ দিই - বিশেষত গিট-নোভিসদের জন্য। বেশ কয়েকটি কমিটের উপর ভিত্তি করে আপনার যদি সত্যিই কোনও প্রক্রিয়া স্বয়ংক্রিয় করার প্রয়োজন না হয়, তবে একটি কম বিদেশি উপায় আছে ...

  1. টু-স্কোয়াশড কমিটসকে একটি কার্যকারী শাখায় রাখুন (যদি তারা ইতিমধ্যে না থাকে) - এর জন্য গিটক ব্যবহার করুন
  2. লক্ষ্য শাখা পরীক্ষা করুন (যেমন 'মাস্টার')
  3. git merge --squash (working branch name)
  4. git commit

প্রতিশ্রুতিবদ্ধ বার্তা স্কোয়াশের উপর ভিত্তি করে প্রিপোপুলেটেড হবে।


4
এটি সবচেয়ে নিরাপদ পদ্ধতি: কোনও রিসেট নরম / হার্ড (!!), বা রিফ্লোগ ব্যবহৃত হয়নি!
TeChn4K

14
আপনি (1) এ প্রসারিত হলে দুর্দান্ত হবে।
আদম

2
@ অ্যাডাম: মূলত, এর মানে হল gitkআপনি স্কোয়াশ করছেন এমন লাইনটি লেবেল করতে জিওআই ইন্টারফেসটি ব্যবহার করুন এবং এটিতে স্কোয়াশ করতে হবে তার ভিত্তিতে লেবেলও দিন। সাধারণ ক্ষেত্রে, এই দুটি লেবেল ইতিমধ্যে বিদ্যমান থাকবে, সুতরাং পদক্ষেপ (1) এড়ানো যায়।
নোবার

3
মনে রাখবেন যে এই পদ্ধতিটি কার্যকরী শাখাকে পুরোপুরি একত্রিত হওয়ার হিসাবে চিহ্নিত করে না, সুতরাং এটি অপসারণের জন্য মুছে ফেলতে বাধ্য করা প্রয়োজন। :(
কির্স্টেলাইন

2
(1) এর জন্য, আমি git branch your-feature && git reset --hard HEAD~Nসবচেয়ে সুবিধাজনক উপায় খুঁজে পেয়েছি । যাইহোক, এটি আবার গিট রিসেট জড়িত, যা এই উত্তর এড়াতে চেষ্টা করেছে।
eis

132

ক্রিস জনসেনের উত্তরের ভিত্তিতে ,

বাশ থেকে একটি বিশ্বব্যাপী "স্কোয়াশ" নাম যুক্ত করুন: (বা উইন্ডোজে গিট বাশ)

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এটি ম্যানুয়ালি সংশোধন করতে পারেন । (বা, আপনার স্বাদ মেলে উপন্যাস সম্পাদনা করুন।)


6
আকর্ষণীয়, তবে আমি স্কোয়াশেড কমিট ম্যাসেজটি নিজেই টাইপ করব, আমার একাধিক প্রতিশ্রুতিগুলির বর্ণনামূলক সংক্ষিপ্তসার হিসাবে, এটি আমার জন্য স্বয়ংক্রিয়ভাবে প্রবেশ করার চেয়ে বেশি। সুতরাং আমি বরং উল্লেখ করেছি git squash -m "New summary."এবং Nচাপবিহীন কমিটের সংখ্যা হিসাবে স্বয়ংক্রিয়ভাবে নির্ধারণ করেছি ।
একিউম্যানাস

1
@ এ বি বি, এটি আলাদা প্রশ্নের মতো মনে হচ্ছে। (আমি মনে করি না এটি ওপি ঠিক কী বলেছিল; আমি আমার
গিটার

3
এটা বেশ মিষ্টি। ব্যক্তিগতভাবে আমি এমন একটি সংস্করণ চাই যা স্কোয়াশেড-একসাথে কমিট করার প্রথমটির প্রতিশ্রুতি বার্তা ব্যবহার করে। হোয়াইটস্পেস টুইটের মতো জিনিসগুলির জন্য ভাল হবে।
funroll

@ ফনরোল একমত কেবলমাত্র শেষ প্রতিশ্রুতি রক্ষা করা আমার জন্য একটি অতি সাধারণ প্রয়োজন। আমাদের এটি রুপ করতে সক্ষম হওয়া উচিত ...
স্টিভ ক্লে

2
@ এ বি বি আপনি git commit --amendবার্তাটি আরও পরিবর্তন করতে ব্যবহার করতে পারেন তবে এই উপনামটি আপনাকে প্রতিশ্রুতি বার্তায় কী হওয়া উচিত তার একটি ভাল সূচনা করতে দেয়।
dashesy

131

এই সুবিধাজনক ব্লগ পোস্টের জন্য ধন্যবাদ আমি পেয়েছি যে আপনি শেষ 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

সম্পাদকটি বন্ধ করার সময়, বৈশিষ্ট্যটি প্রতিশ্রুতিতে ফিক্সটি স্কোয়াশ হয়ে যাবে এবং আমার প্রতিশ্রুতিবদ্ধ ইতিহাসটি দেখতে সুন্দর এবং পরিষ্কার দেখাবে!

সমস্ত কমিট স্থানীয় থাকাকালীন এটি ভালভাবে কাজ করে তবে আপনি যদি ইতিমধ্যে দূরবর্তী স্থানে পাঠানো কোনও কমিটগুলি পরিবর্তন করার চেষ্টা করেন আপনি একই শাখাটি পরীক্ষা করে দেখেছেন এমন অন্যান্য দেবদের জন্য সত্যই সমস্যা দেখা দিতে পারে!

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


5
আপনার কি শীর্ষটি বাছতে হবে এবং বাকীটি স্কোয়াশ করতে হবে? ইন্টারেক্টিভ রিবেস সম্পাদককে আরও বিস্তারিতভাবে কীভাবে ব্যবহার করতে হয় সে সম্পর্কে আপনাকে নিজের উত্তরটি সম্পাদনা করতে হবে
কলব ক্যানিয়ন

2
হ্যাঁ, pickলাইনে 1 ছেড়ে যান you আপনি যদি লাইন 1 squashবা fixupকমিটের জন্য চয়ন করেন তবে গিট একটি বার্তা দেখায় যা "ত্রুটি: পূর্ববর্তী প্রতিশ্রুতি ছাড়া 'ফিক্সআপ' করতে পারে না" saying তারপরে এটি আপনাকে এটি ঠিক করার বিকল্প দেবে: "আপনি এটি 'গিট রিবেস --edit-todo' দিয়ে ঠিক করতে পারেন এবং তারপরে 'গিট রিবেস - কনটিনিউ' চালাতে পারেন" " অথবা আপনি কেবল গর্ভপাত বন্ধ করতে পারেন এবং আবার শুরু করতে পারেন: "অথবা আপনি 'গিট রিবেস --abort' দিয়ে রিবাজটি বাতিল করতে পারেন।
br3nt

56

আপনি যদি টরটোইজিট ব্যবহার করেন তবে আপনি এই কাজটি করতে পারেন Combine to one commit:

  1. কচ্ছপগ্রাহ্য প্রসঙ্গ মেনু খুলুন
  2. নির্বাচন করা Show Log
  3. লগ ভিউতে সম্পর্কিত কমিটগুলি চিহ্নিত করুন
  4. Combine to one commitপ্রসঙ্গ মেনু থেকে নির্বাচন করুন

একত্রিত

এই ফাংশনটি স্বয়ংক্রিয়ভাবে সমস্ত প্রয়োজনীয় একক গিট পদক্ষেপগুলি কার্যকর করে। দুর্ভাগ্যজনকভাবে কেবল উইন্ডোজের জন্য উপলব্ধ।


আমি যতদূর জানি, এটি মার্জ কমিটের জন্য কাজ করবে না।
থারকিল হলম-জ্যাকবসন

1
যদিও এটি অন্য কোনও দ্বারা মন্তব্য করা হয়নি, এটি এমন শৃঙ্খলার জন্যও কাজ করে যা হেডে নেই। উদাহরণস্বরূপ, আমার প্রয়োজনটি ছিল এমন কিছু ডাব্লুআইপি কমিটিকে স্কোয়াশ করা যা আমি ধাক্কা দেওয়ার আগে আরও বুদ্ধিমান বিবরণ দিয়ে করতাম। সুন্দর কাজ করেছেন। অবশ্যই, আমি এখনও আশা করি কমান্ড দ্বারা এটি কীভাবে করা যায় তা শিখতে পারি।
চার্লস রবার্তো কানাটো

55

এটি করতে আপনি নিম্নলিখিত গিট কমান্ডটি ব্যবহার করতে পারেন।

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

বিস্তারিত জানার জন্য লিংকে ক্লিক করুন


48

এই নিবন্ধের ভিত্তিতে আমি এই পদ্ধতিটি আমার ব্যবহারের জন্য সহজভাবে খুঁজে পেয়েছি।

আমার 'দেব' শাখাটি 96 টি কমিট দ্বারা 'উত্স / দেব' এর চেয়ে এগিয়ে ছিল (সুতরাং এই কমিটগুলি এখনও রিমোটে ঠেলা যায়নি)।

আমি পরিবর্তনের দিকে এগিয়ে যাওয়ার আগে এই প্রতিশ্রুতিগুলিকে স্কোয়াশ করতে চেয়েছিলাম। আমি শাখাটিকে 'উত্স / দেব' অবস্থায় পুনরায় সেট করতে পছন্দ করি (এটি st৯ টি কমিটস ছাড়াই সমস্ত পরিবর্তন ছাড়বে) এবং তারপরে একবারে পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ:

git reset origin/dev
git add --all
git commit -m 'my commit message'

1
ঠিক যেটা আমার দরকার ছিল. স্কোয়াশ ডাউনটি আমার বৈশিষ্ট্য শাখা থেকে কমিট করে এবং তারপরে আমি চেরি বাছাই করি যা আমার মাস্টারের মধ্যে প্রতিশ্রুতিবদ্ধ।
ডেভিড ভিক্টর

1
এটি পূর্বের কমিটগুলি স্কোয়াশ করে না!
ইগোরগানাপলস্কি

আপনি কি আরও কিছুটা ইগোরগানাপলস্কি ব্যাখ্যা করতে পারেন?
ট্রডলফ

3
টুইটার এটি আপনার সমস্ত পরিবর্তন একবারে কমিট করার আরও বেশি।
ইগোরগানাপলস্কি

15
হ্যাঁ, সুতরাং এটি আপনার সমস্ত অঙ্গীকারকে এক করে স্কোয়াশ করে। অভিনন্দন!
ট্রুডলফ

45

শাখায় আপনি কমিটগুলি একত্রিত করতে চান, চালান:

git rebase -i HEAD~(n number of commits back to review)

উদাহরণ:

git rebase -i HEAD~1

এটি পাঠ্য সম্পাদকটি খুলবে এবং আপনি যদি এই প্রতিশ্রুতিগুলি একত্রে একত্রিত করতে চান তবে আপনাকে অবশ্যই 'স্কোয়াশ' এর সাথে প্রতিটি কমিটের সামনে 'বাছাই' স্যুইচ করতে হবে। ডকুমেন্টেশন থেকে:

পি, বাছাই = ব্যবহার প্রতিশ্রুতি

s, স্কোয়াশ = ব্যবহার প্রতিশ্রুতিবদ্ধ, কিন্তু পূর্ববর্তী প্রতিশ্রুতিতে মিলিত

উদাহরণস্বরূপ, আপনি যদি সমস্ত কমিটকে একের সাথে একীভূত করতে চান, তবে 'বাছাই' হ'ল আপনার করা প্রথম প্রতিশ্রুতি এবং ভবিষ্যতের সমস্তগুলি (প্রথমটির নীচে স্থাপন করা) 'স্কোয়াশ' এ সেট করা উচিত। যদি ভিএম ব্যবহার করে থাকেন তবে এক্স ব্যবহার করুন তবে সম্পাদকটি সংরক্ষণ এবং প্রস্থান করতে সন্নিবেশ মোডে করুন।

তারপরে রিবেস চালিয়ে যেতে:

git rebase --continue

আপনার প্রতিশ্রুতিবদ্ধ ইতিহাস পুনরায় লেখার জন্য এবং অন্যান্য উপায়গুলির জন্য আরও এই সহায়ক পোস্টটি দেখুন


2
দয়া করে --continueএবং vim কী করে তাও ব্যাখ্যা করুন :x
not2qubit

আপনি git addযখন আপনার প্রতিশ্রুতিতে যান এবং ফাইলগুলি git rebase --continueমার্জ করতে শুরু করেন তখন আপনার ফাইলগুলিতে সঠিক কনফিগারেশন ব্যবহার করার পরে, আপনার শাখায় কমে যাওয়ার মাধ্যমে রিবেস ব্লকগুলিতে ঘটবে blocks :xআর মাত্র একটি কমান্ড যে ফাইল পরিবর্তন যখন তেজ দেখতে ব্যবহার করে সংরক্ষণ করুন করবে এই
aabiro

32

অ্যানোমির উত্তর ভাল, তবে আমি এ সম্পর্কে নিরাপত্তাহীনতা বোধ করেছি তাই আমি বেশ কয়েকটি স্ক্রিনশট যুক্ত করার সিদ্ধান্ত নিয়েছি।

পদক্ষেপ 0: গিট লগ

আপনি কোথায় আছেন দেখুন git log। সর্বাধিক গুরুত্বপূর্ণ, আপনি যে স্কোয়াশ করতে চান না সেই প্রথম প্রতিশ্রুতিটির কমিট হ্যাশ সন্ধান করুন । সুতরাং শুধুমাত্র:

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

পদক্ষেপ 1: গিট রিবেস

সম্পাদন git rebase -i [your hash], আমার ক্ষেত্রে:

$ git rebase -i 2d23ea524936e612fae1ac63c95b705db44d937d

পদক্ষেপ 2: আপনি যা চান তা বাছুন / স্কোয়াশ করুন

আমার ক্ষেত্রে, আমি প্রথমে যে প্রতিশ্রুতি দিয়েছিলাম তাতে সমস্ত কিছু স্কোয়াশ করতে চাই। ক্রমটি প্রথম থেকে শেষ পর্যন্ত, ঠিক যেমনটি অন্যভাবে git log। আমার ক্ষেত্রে, আমি চাই:

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

পদক্ষেপ 3: বার্তা সামঞ্জস্য করুন

আপনি যদি একটি মাত্র প্রতিশ্রুতি বাছাই করে থাকেন এবং বাকীগুলি স্কোয়াশ করেন তবে আপনি একটি প্রতিশ্রুতি বার্তা সামঞ্জস্য করতে পারেন:

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

এটাই. আপনি এটি ( :wq) সংরক্ষণ করার পরে , আপনি হয়ে গেছেন। এটি দিয়ে দেখুন git log


2
চূড়ান্ত ফলাফলটি দেখতে খুব ভাল লাগবে যেমন,git log
তীমথিয় এলজে স্টুয়ার্ট

2
না ধন্যবাদ. আমি আমার প্রতিশ্রুতিগুলি ঠিক এইভাবেই করি।
এক্সালিক্স

@ অ্যাকালিক্স আপনি কি আপনার সমস্ত লাইন সরিয়েছেন? এভাবেই আপনি আপনার প্রতিশ্রুতিগুলি হারাবেন।
a3y3

31

পদ্ধতি 1

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) ব্যবহার করে থাকেন তবে উপরের কমান্ডগুলি সম্পাদক ব্যতীত সমান। আপনি বিভিন্ন সম্পাদক পেতে পারেন।

পদ্ধতি 2

  1. প্রথমে কমিট করার জন্য প্রয়োজনীয় ফাইলগুলি যুক্ত করুন
git add <files>
  1. তারপরে --fixupবিকল্পটি ব্যবহার করে প্রতিশ্রুতিবদ্ধ করুন এবং OLDCOMMITযেটিতে আমাদের এই কমিটটি মার্জ (স্কোয়াশ) করতে হবে তা হওয়া উচিত।
git commit --fixup=OLDCOMMIT

এখন এটি হেডের শীর্ষে একটি নতুন প্রতিশ্রুতি তৈরি করে fixup1 <OLDCOMMIT_MSG>

  1. তারপরে নিচের কমান্ডটি কার্যকর করুন নতুন প্রতিশ্রুতি মার্জ (স্কোয়াশ) করতে OLDCOMMIT
git rebase --interactive --autosquash OLDCOMMIT^

এখানে ^পূর্বের প্রতিশ্রুতি দেওয়া মানে OLDCOMMIT। এই rebaseকমান্ডটি একটি সম্পাদক (ভিম বা ন্যানো) এর সাথে ইন্টারেক্টিভ উইন্ডোটি খুলবে যে আমাদের কেবল কিছু সংরক্ষণ করার দরকার নেই এবং প্রস্থান করা যথেষ্ট। কারণ এতে পাস করা বিকল্পটি স্বয়ংক্রিয়ভাবে সর্বশেষ প্রতিশ্রুতিটিকে পুরানো প্রতিশ্রুতিতে স্থানান্তরিত করবে এবং অপারেশনটিকে এতে পরিবর্তন করবেfixup (স্কোয়াশের সমতুল্য) এ । তারপরে রিবেস অব্যাহত থাকে এবং শেষ হয়।

পদ্ধতি 3

  1. সর্বশেষ কমিটের সাথে নতুন পরিবর্তন যুক্ত করার প্রয়োজন থাকলে এটি --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

উপসংহার

  • 1 ম পদ্ধতির সুবিধা হ'ল একাধিক কমিটি স্কোয়াশ করা এবং পুনরায় অর্ডার করা। তবে আমাদের যদি খুব পুরানো প্রতিশ্রুতিতে কোনও সংশোধন করতে হয় তবে এই পদ্ধতিটি কঠিন হবে।
  • সুতরাং 2 য় প্রক্রিয়া কমিটটি খুব পুরানো কমিটে সহজেই মার্জ করতে সহায়তা করে।
  • এবং 3 য় পদ্ধতি সর্বশেষ প্রতিশ্রুতিতে নতুন পরিবর্তনগুলি স্কোয়াশ করার ক্ষেত্রে কার্যকর is

এটি কেবলমাত্র শেষ দুটি প্রতিশ্রুতিগুলি আপডেট করে এমনকি আমি commit ষ্ঠ শেষ প্রতিশ্রুতিতে পুনরায় সেট করি, কেন জানি না
কার্লোস লিউ

এমনকি আপনি কমিট অর্ডারটি পুনরায় সাজিয়ে নিতে পারেন। এটা ঠিক কাজ করে।
রাশোক

29

শেষ 10 টি স্কোয়াশ করতে 1 টি একক প্রতিশ্রুতিতে:

git reset --soft HEAD~10 && git commit -m "squashed commit"

আপনি যদি স্কোয়াশেড কমিটের সাহায্যে রিমোট শাখাটি আপডেট করতে চান:

git push -f

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

27

যদি আপনি কোনও সুদূর শাখায় থাকেন (যাকে বলা হয় feature-branch) গোল্ডেন রিপোজিটরি ( golden_repo_name) থেকে ক্লোন করা হয়েছে, তবে আপনার প্রতিশ্রুতিগুলিকে স্কোয়াশ করার কৌশলটি এখানে:

  1. সোনার রেপো চেকআউট করুন

    git checkout golden_repo_name
    
  2. এটি থেকে একটি নতুন শাখা তৈরি করুন (সোনার রেপো) নীচে

    git checkout -b dev-branch
    
  3. আপনার ইতিমধ্যে আপনার স্থানীয় শাখায় স্কোয়াশ মার্জ

    git merge --squash feature-branch
    
  4. আপনার পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ (এটিই একমাত্র অঙ্গীকার যা দেব-শাখায় চলে)

    git commit -m "My feature complete"
    
  5. আপনার স্থানীয় সংগ্রহস্থলে শাখাটি পুশ করুন

    git push origin dev-branch
    

যেহেতু আমি মাত্র 100 ডলার কমিট (স্ক্রিন-এসএনএন-এর মাধ্যমে এসএনএন শাখাগুলি সিঙ্ক করার জন্য) স্কোয়াশ করছি, এটি ইন্টারেক্টিভভাবে রিবেসিংয়ের চেয়ে অনেক দ্রুত!
ঋষি

1
নিচে পড়া, আমি দেখতে @ ক্রিস এর মন্তব্য, যা আমি কি করতে (রি-বেসের ফলে --soft ...) ব্যবহৃত হয়েছে - খুব খারাপ যে Stackoverflow আর উপরের upvotes শত শত উত্তর নির্বাণ হয় ...
ঋষি

1
আপনার সাথে একমত হন s সেজ, আসুন আশা করি তারা ভবিষ্যতে কোনও সময় এটি করতে পারে
সন্দেশ কুমার

এটি সঠিক উপায়। রিবেস অ্যাপ্রোচ ভাল, তবে স্কোয়াশের জন্য কেবল এটিই সর্বশেষ সমাধানের সমাধান হিসাবে ব্যবহার করা উচিত।
এক্সালিক্স

20

আসলে কি সুবিধাজনক হতে পারে:
আপনি যে স্ক্র্যাশ করতে চান তার উপরের কমিট হ্যাশটি সন্ধান করুন, বলুন d43e15

এখন ব্যবহার করুন

git reset d43e15
git commit -am 'new commit name'

2
এই. কেন আরও লোকেরা এটি ব্যবহার করে না? এটি স্বতন্ত্র প্রতিশ্রুতিগুলি রিবাজেড এবং স্কোয়াশ করার চেয়েও দ্রুত।
a3y3

17

এটি সুপার-ডুপার ক্লডগি, তবে এক ধরণের দুর্দান্ত উপায়ে, তাই আমি এটিকে কেবল রিংয়ে টস করব:

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নামটি (ইন্টারেক্টিভ রিবেস প্রম্পট) হয় তবে প্রথম "বাছাই" ব্যতীত "স্কোয়াশ" এ সমস্ত পরিবর্তন হয়, এবং অন্যথায় ভিম তৈরি হয় - যাতে আপনাকে অনুরোধ করা হয় স্কোয়াশেড কমিট বার্তা সম্পাদনা করতে, আপনি ভিম পাবেন। (এবং স্পষ্টতই আমি শাখা ফু-তে সর্বশেষ পাঁচটি প্রতিশ্রুতি স্কোয়াশ করছিলাম, তবে আপনি নিজের পছন্দ মতো পরিবর্তন করতে পারেন))

যদিও মার্ক লংএয়ারের পরামর্শ ছিল আমি সম্ভবত তাই করতাম ।


7
+1: এটি মজাদার এবং শিক্ষণীয়, এটি আপনার কাছে মোটেই স্পষ্ট ছিল না যে আপনি GIT_EDITOR এনভায়রনমেন্ট ভেরিয়েবলের কোনও প্রোগ্রামের নামের চেয়ে আরও জটিল কিছু রাখতে পারবেন।
লংগায়ারকে

16

আপনি যদি প্রতিটি প্রতিশ্রুতি একক প্রতিশ্রুতিতে স্কোয়াশ করতে চান (যেমন প্রথমবারের জন্য কোনও প্রকল্প প্রকাশ্যে প্রকাশ করার সময়), চেষ্টা করুন:

git checkout --orphan <new-branch>
git commit

14

আমি মনে করি এটি করার সবচেয়ে সহজ উপায় হ'ল মাস্টার অফ করে নতুন শাখা তৈরি করা এবং বৈশিষ্ট্য শাখার মার্জ - স্কোয়াশ করা।

git checkout master
git checkout -b feature_branch_squashed
git merge --squash feature_branch

তারপরে আপনার কাছে পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ করার জন্য প্রস্তুত।


14

2020 রিবেস ছাড়াই সহজ সমাধান:

git reset --soft HEAD~2

git commit -m "new commit message"

git push --force

2 এর অর্থ শেষ দুটি কমিটি স্কোয়াশ করা হবে। আপনি যে কোনও সংখ্যা দ্বারা এটি প্রতিস্থাপন করতে পারেন


12

আপনি যে শাখায় স্কোয়াশ করতে চান সেই শাখায় বর্তমানে রয়েছেন এমন সরল ওয়ানলাইনারটি সর্বদা কাজ করে, সর্বশেষ প্রতিশ্রুতিতে প্রতিশ্রুতিবদ্ধ বার্তা এবং লেখক রয়েছে যা আপনি ব্যবহার করতে চান:

git reset --soft $(git merge-base HEAD master) && git commit --reuse-message=HEAD@{1}

4
স্কোয়াশিং কমিটগুলি সম্পর্কে হতাশার সাথে আমি একেবারেই প্রাণবন্ত হয়েছি এবং এটি কতটা নির্বোধ জটিল - কেবলমাত্র শেষ বার্তাটি ব্যবহার করুন এবং তাদের সকলকে একটি প্রতিশ্রুতিবদ্ধ করার জন্য স্কোয়াশ করুন! কেন এমন কঠিন ???? এই ওলাইনারটি আমার জন্য এটি করে। আমার ক্রুদ্ধ হৃদয়ের নীচ থেকে আপনাকে ধন্যবাদ।
লোকেন

12

উদাহরণস্বরূপ যদি আপনি সর্বশেষ 3 টি স্কোয়াশ করতে চান একটি শাখায় (রিমোট রিপোজিটরি) উদাহরণস্বরূপ: একক প্রতিশ্রুতিতে প্রতিশ্রুতিবদ্ধ: https://bitbucket.org

আমি যা করেছি তা হ'ল

  1. গিট রিসেট - সাফ হেড ~ 3 &&
  2. গিট কমিট
  3. গিট পুশ অরিজিন (শাখা_নাম) - বল

3
শুধু সাবধান হন, যেহেতু আপনি শক্তি ব্যবহার করেন তবে আপনি পূর্ববর্তী
কমিটগুলি

12

। সতর্কতা: "আমার শেষ এক্স কমিট" অস্পষ্ট হতে পারে।

  (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) ফ্লিটউড ম্যাক কমিটে মার্জ করার জন্য একটি টান অনুরোধটি খুলেছেন ।

আপনি একটি টানার অনুরোধ খুলেছেন এবং গিটহাবে আপনি এটি দেখতে পেয়েছেন:

চারটি অঙ্গীকার:

  • ড্যানি কিরওয়ান যুক্ত করুন
  • ক্রিস্টিন পারফেক্ট যুক্ত করুন
  • LA1974
  • বিল ক্লিনটন

এই ভেবে যে কেউ কখনই সম্পূর্ণ সংগ্রহস্থলের ইতিহাস পড়ার চিন্তা করবেন না। (প্রকৃতপক্ষে একটি ভান্ডার রয়েছে, উপরের লিঙ্কটিতে ক্লিক করুন!) আপনি এই কমিটিগুলি স্কোয়াশ করার সিদ্ধান্ত নিয়েছেন। সুতরাং আপনি যান এবং চালান git reset --soft HEAD~4 && git commit। তারপরে আপনি git push --forceএটি আপনার পিআর পরিষ্কার করতে গিটহাবের উপরে onto

আর কি হয়? আপনি কেবল একক প্রতিশ্রুতিবদ্ধ করেছেন যা ফ্রিটজ থেকে বিল ক্লিনটনের কাছে পৌঁছেছে। কারণ আপনি ভুলে গেছেন যে গতকাল আপনি এই প্রকল্পের বাকিংহাম নিক্স সংস্করণে কাজ করছেন। এবং git logআপনি গিটহাবের সাথে যা দেখেন তা মেলে না।

ST গল্পের মোরাল

  1. আপনি পেতে চান সঠিক সেগুলি খুঁজে পান করতে , এবং git checkoutতাদের
  2. আপনি ইতিহাসে ঠিক কী পূর্বের প্রতিশ্রুতি রাখতে চান তা সন্ধান করুন এবং git reset --softএটি
  3. একটি করুন git commitথেকে সরাসরি যে warps থেকে থেকে থেকে

1
এটি এটি করার সহজতম উপায় 100%। যদি আপনার বর্তমান হেড হ'ল সঠিক অবস্থা আপনি চান তবে আপনি # 1 এড়িয়ে যেতে পারেন।
স্ট্যান

আমি জানি এটিই একমাত্র উপায় যা প্রথম প্রতিশ্রুতিবদ্ধ ইতিহাস পুনরায় লেখার অনুমতি দেয়।
ভাদোরাকোয়েস্ট

9

যদি আপনি অন্তর্বর্তীকালীন কমিটগুলির প্রতিশ্রুতিবদ্ধ বার্তাগুলি সম্পর্কে চিন্তা না করেন তবে আপনি ব্যবহার করতে পারেন

git reset --mixed <commit-hash-into-which-you-want-to-squash>
git commit -a --amend

7

আপনি যদি গিটল্যাব নিয়ে কাজ করছেন, আপনি নীচে দেখানো হিসাবে মার্জ অনুরোধের মধ্যে স্কোয়াশ বিকল্পটি ক্লিক করতে পারেন। প্রতিশ্রুতিবদ্ধ বার্তাটি মার্জ অনুরোধের শিরোনাম হবে।

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



6

অন্যান্য দুর্দান্ত উত্তরের পাশাপাশি, আমি যুক্ত করতে চাই যে কীভাবে git rebase -iআমাকে সর্বদা কমিটের আদেশের সাথে বিভ্রান্ত করে তোলে - পুরোনো থেকে নতুন বা তার বিপরীতে? সুতরাং এটি আমার কর্মপ্রবাহ:

  1. git rebase -i HEAD~[N], যেখানে সাম্প্রতিকতমটি থেকে শুরু করে আমি যোগ দিতে চাইছি এমন কমিটের সংখ্যা এন । সুতরাং git rebase -i HEAD~5"স্কোয়াশটি সর্বশেষ 5 টি নতুন করে কমিট করে" এর অর্থ হবে;
  2. সম্পাদকটি পপ আপ করে, আমি যে একত্রীকরণ করতে চাইছি তার তালিকা প্রদর্শন করে। এখন সেগুলি বিপরীত ক্রমে প্রদর্শিত হয় : পুরানো প্রতিশ্রুতি শীর্ষে রয়েছে। "স্কোয়াশ" বা "গুলি" হিসাবে চিহ্নিত করুন এখানে প্রথম / পুরানো ব্যতীত সমস্ত কমিট করে : এটি একটি সূচনা পয়েন্ট হিসাবে ব্যবহৃত হবে। সম্পাদক সংরক্ষণ এবং বন্ধ করুন;
  3. সম্পাদক নতুন প্রতিশ্রুতির জন্য একটি ডিফল্ট বার্তা নিয়ে আবার পপ আপ: এটি আপনার প্রয়োজনে পরিবর্তন করুন, সংরক্ষণ করুন এবং বন্ধ করুন। স্কোয়াশ শেষ!

উত্স এবং অতিরিক্ত পঠন: # 1 , # 2


6

এই জাতীয় একটি ওয়ার্কফ্লো সম্পর্কিত প্রশ্নের উত্তর সম্পর্কে কি?

  1. বহু স্থানীয় কমিটস, একাধিক মার্জ থেকে FROM মাস্টার মিশ্রিত ,
  2. অবশেষে দূরবর্তী দিকে ধাক্কা,
  3. পিআর এবং পর্যালোচক দ্বারা মাস্টার করতে মার্জ করুন । (হ্যাঁ, জনগণের merge --squashপরে বিকাশকারীদের পক্ষে আরও সহজ হবে , তবে দলটি ভেবেছিল যে প্রক্রিয়াটি ধীর করবে would)

এই পৃষ্ঠায় আমি এর মতো কোনও ওয়ার্কফ্লো দেখিনি। (এটি আমার চোখ হতে পারে)) যদি আমি rebaseসঠিকভাবে বুঝতে পারি তবে একাধিক সংশ্লেষের জন্য একাধিক সংঘাতের সমাধানের প্রয়োজন হবে । আমি এমনকি এটি সম্পর্কে চিন্তা করতে চাই না!

সুতরাং, এটি আমাদের পক্ষে কাজ করে বলে মনে হচ্ছে।

  1. git pull master
  2. git checkout -b new-branch
  3. git checkout -b new-branch-temp
  4. স্থানীয়ভাবে সম্পাদনা এবং প্রতিশ্রুতিবদ্ধ, নিয়মিত মাস্টার মার্জ করুন
  5. git checkout new-branch
  6. git merge --squash new-branch-temp // সমস্ত পরিবর্তনকে পর্যায়ক্রমে রাখে
  7. git commit 'one message to rule them all'
  8. git push
  9. রিভিউর পিআর করে এবং মাস্টারগুলিতে মিশে যায়।

অনেক মতামত থেকে আমি আপনার পদ্ধতির পছন্দ। এটি খুব সুবিধাজনক এবং দ্রুত
আর্টেম সলোভভ

5

আমি আরও একটি জেনেরিক সমাধান 'এন' কমিটগুলি নির্দিষ্ট করা নয়, বরং আপনি যে শাখা / প্রতিশ্রুতি-আইডি উপরে স্কোয়াশ করতে চান তা বোঝানো হয়েছে। নির্দিষ্ট অঙ্গীকারের প্রতিশ্রুতি গণনা করার চেয়ে এটি ত্রুটি-প্রবণতা কম — কেবলমাত্র ট্যাগটি সরাসরি উল্লেখ করুন বা আপনি যদি সত্যিই গণনা করতে চান তবে আপনি 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বিকল্পটি ব্যবহার করে , ম্যাক এবং লিনাক্স ব্যবহারকারীদের এটির সাথে ভাল হওয়া উচিত))


আমি ওরফে চেষ্টা করেছিলাম তবে সেড প্রতিস্থাপনের কোনও প্রভাব আছে কিনা তা আমি নিশ্চিত নই। তাদের কী করা উচিত?
বালিকা

প্রথম সেডটি ইতিহাসকে কনসোলে ফেলে দেয় d দ্বিতীয় সেড সমস্ত 'পিক' এর পরিবর্তে 'এফ' (ফিক্সআপ) দিয়ে এবং এডিটর ফাইলটিকে জায়গায়-জায়গায় (-i বিকল্প) পুনর্লিখন করে। সুতরাং দ্বিতীয়টি সমস্ত কাজ করে।
এথন

আপনি ঠিক বলেছেন, নির্দিষ্ট কমিটের N- নম্বর গণনা করা খুব ত্রুটিযুক্ত। এটি আমাকে বেশ কয়েকবার স্ক্রু করেছে এবং রিবেসটি পূর্বাবস্থায় ফেলার চেষ্টা করে ঘন্টা নষ্ট করেছে।
ইগোরগানাপলস্কি

হাই ইথান, আমি জানতে চাই যে এই কর্মপ্রবাহটি মার্জ করার ক্ষেত্রে সম্ভাব্য দ্বন্দ্বগুলি আড়াল করবে কিনা। সুতরাং দয়া করে বিবেচনা করুন যদি আপনার দুটি শাখা মাস্টার এবং ক্রীতদাস থাকে। যদি ক্রীতদাসের সাথে মাস্টারের সাথে বিরোধ হয় এবং আমরা git squash masterযখন ক্রীতদাসকে পরীক্ষা করে দেখি তখন ব্যবহার করি। এটা কি হবে? আমরা কি দ্বন্দ্ব গোপন করব?
সেরজিও বিলেলো

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

5

প্রশ্নটিতে এটি "শেষ" বলতে কী বোঝায় তা অস্পষ্ট হতে পারে।

উদাহরণস্বরূপ 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 পরিবর্তনগুলিতে স্কোয়াশ করুন (ব্রাঞ্চিংয়ের পরে এবং মার্জ হওয়ার আগে পরিবর্তনের জন্য পুরোপুরি প্রতিশ্রুত হারাতে হবে।


4

1) গিট রিসেট - সাফ হেড ~ n

n - কমিটের সংখ্যা, স্কোয়াশ করা দরকার

2) গিট কমিট - এম "নতুন প্রতিশ্রুতি বার্তা"

3) গিট পুশ আদি শাখা_নাম - বল

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