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


479

আপনি প্রথম প্রতিশ্রুতিতে কীভাবে আপনার সম্পূর্ণ সংগ্রহস্থলটিকে স্কোয়াশ করবেন?

আমি প্রথম প্রতিশ্রুতিতে পুনর্বাসনা করতে পারি, তবে এটি আমাকে 2 টি কমিট দিয়ে ছেড়ে দেয়। প্রথমটির আগে কমিট রেফারেন্স দেওয়ার কোনও উপায় আছে কি?


8
"প্রথমটির আগে প্রতিশ্রুতিবদ্ধ"?
innaM

31
@ আইএনএএম - এটি আদিম প্রতিশ্রুতি যা গিটের জন্ম দেয় । (আশা রসবোধ ইন্টারভয়েব মাধ্যমে যথেষ্ট ভাল পাস)।
ripper234

11
এই প্রশ্নে যারা পরে আসছেন তাদের জন্য আরও আধুনিক উত্তরটি ব্যবহার করতে ভুলবেন না ।
দ্রোগানস

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

2
Imo,: এই @MrTux থেকে উত্তম stackoverflow.com/questions/30236694/...
J0hnG4lt

উত্তর:


130

সম্ভবত সবচেয়ে সহজ উপায় হ'ল ওয়ার্কিং কপির বর্তমান অবস্থার সাথে একটি নতুন সংগ্রহশালা তৈরি করা। আপনি যদি প্রথমে করতে পারেন এমন সমস্ত প্রতিশ্রুতি বার্তা রাখতে চান git log > original.logএবং তারপরে নতুন ভাণ্ডারে আপনার প্রাথমিক প্রতিশ্রুতি বার্তাটির জন্য এটি সম্পাদনা করুন:

rm -rf .git
git init
git add .
git commit

অথবা

git log > original.log
# edit original.log as desired
rm -rf .git
git init
git add .
git commit -F original.log

62
তবে আপনি এই পদ্ধতির সাথে শাখাগুলি
হারাচ্ছেন

150
এই উত্তর দেওয়ার পরে গিটটি বিকশিত হয়েছে। না, একটি সহজ এবং ভাল উপায় হল: git rebase -i --root। দেখুন: স্ট্যাকওভারফ্লো.com
ডেভিড জে

5
এটি কিছু ক্ষেত্রে কার্যকর হতে পারে তবে এটি মূলত প্রশ্নের উত্তর নয়। এই রেসিপিটির সাহায্যে আপনি আপনার সমস্ত কনফিগারেশন এবং অন্যান্য সমস্ত শাখাও আলগা করুন।
iwein

3
এটি একটি ভয়ঙ্কর সমাধান যা অকারণে ধ্বংসাত্মক। দয়া করে এটি ব্যবহার করবেন না।
ড্যানিয়েল কামিল কোজার

5
এছাড়াও সাবমডিউলগুলি ভেঙে দেবে। -1
ক্রুম

692

1.6.2 গিট হিসাবে , আপনি ব্যবহার করতে পারেন git rebase --root -i

প্রথমটি বাদে প্রতিটি প্রতিশ্রুতির জন্য, এ পরিবর্তন pickকরুন squash


49
দয়া করে একটি সম্পূর্ণ, কার্যকারী কমান্ড উদাহরণ যুক্ত করুন যা মূল প্রশ্নের উত্তর দেয়।
জেক

29
আমি আশা করি গ্রহণযোগ্য উত্তরের মতো আমার পুরো সংগ্রহশালাটি উড়িয়ে দেওয়ার আগে আমি এটি পড়তে পারি: /
মাইক চেম্বারলাইন

38
এই উত্তরটি ঠিক আছে , তবে আপনি যদি 20 টি কমিটের পরিবর্তে ইন্টারেক্টিভভাবে আরও বেশি ছাড় দিচ্ছেন তবে ইন্টারেক্টিভ রিবেসটি সম্ভবত খুব ধীর এবং স্বাস্থ্যকর হবে। আপনি সম্ভবত কয়েকশো বা হাজার হাজার কমিটকে স্কোয়াশ করার চেষ্টা করতে খুব কঠিন সময় কাটাচ্ছেন। আমি মূল প্রতিশ্রুতিতে একটি নরম বা মিশ্রিত রিসেট নিয়ে যাব, তারপরে সেই ক্ষেত্রে পুনরায় স্বীকার করব।

20
@ প্রেড squashসকল কমিটের জন্য ব্যবহার করবেন না । একেবারে প্রথমটি হওয়া দরকার pick
গিরট

14
আপনার যদি অনেক কমিট থাকে তবে ম্যানুয়ালি 'বাছাই' থেকে 'স্কোয়াশ' এ পরিবর্তন করা শক্ত। এটি ব্যবহার করে দ্রুত ভিআইএম কমান্ড লাইনে % s / পিক / স্কোয়াশ / জি ব্যবহার করুন ।
eilas 4'17 ই

314

হালনাগাদ

আমি একটি উপনাম তৈরি করেছি git squash-all
উদাহরণ ব্যবহার : git squash-all "a brand new start"

[alias]
  squash-all = "!f(){ git reset $(git commit-tree HEAD^{tree} -m \"${1:-A new start}\");};f"

সাবধানতা : একটি মন্তব্য প্রদান মনে রাখবেন, অন্যথায় ডিফল্ট প্রতিশ্রুতি বার্তা "একটি নতুন শুরু" ব্যবহৃত হবে।

অথবা আপনি নিম্নলিখিত কমান্ডের সাহায্যে উপন্যাসটি তৈরি করতে পারেন:

git config --global alias.squash-all '!f(){ git reset $(git commit-tree HEAD^{tree} -m "${1:-A new start}");};f'

এক রৈখিক

git reset $(git commit-tree HEAD^{tree} -m "A new start")

দ্রষ্টব্য : এখানে " A new start" একটি উদাহরণ, নিজের ভাষা ব্যবহার করতে নির্দ্বিধায়।

টি এল; ডিআর

স্কোয়াশ করার দরকার নেই, git commit-treeএতিম কমিট তৈরি করতে ব্যবহার করুন এবং এটির সাথে চলুন।

ব্যাখ্যা করা

  1. মাধ্যমে একটি একক প্রতিশ্রুতি তৈরি করুন git commit-tree

    কি git commit-tree HEAD^{tree} -m "A new start"করে:

    সরবরাহ করা ট্রি অবজেক্টের উপর ভিত্তি করে একটি নতুন কমিট অবজেক্ট তৈরি করে এবং stdout এ নতুন কমিট অবজেক্ট আইডি নির্গত করে। লগ বার্তাটি স্ট্যান্ডার্ড ইনপুট থেকে পঠিত হয়, যদি না -m বা -F বিকল্পগুলি দেওয়া না হয়।

    অভিব্যক্তিটির HEAD^{tree}অর্থ গাছের বস্তু সম্পর্কিত HEADযা আপনার বর্তমান শাখার ডগা। দেখতে বৃক্ষ-অবজেক্টস এবং কমিট-অবজেক্টস

  2. নতুন শাখাতে বর্তমান শাখাটি পুনরায় সেট করুন

    তারপরে git resetকেবল নতুন তৈরি করা কমিট অবজেক্টে বর্তমান শাখাটি পুনরায় সেট করুন।

এইভাবে, কর্মক্ষেত্রের কোনও কিছুই স্পর্শ করা হয়নি, বা পুনর্বাস / স্কোয়াশের কোনও প্রয়োজন নেই, যা এটি সত্যই দ্রুত করে তোলে। এবং প্রয়োজনীয় সময়টি সংগ্রহস্থলের আকার বা ইতিহাসের গভীরতার সাথে অপ্রাসঙ্গিক।

প্রকরণ: একটি প্রকল্প টেম্পলেট থেকে নতুন রেপো

টেমপ্লেট / আরচাইটিপ / বীজ / কঙ্কাল হিসাবে অন্য সংগ্রহস্থল ব্যবহার করে নতুন প্রকল্পে "প্রাথমিক প্রতিশ্রুতি" তৈরি করতে এটি দরকারী। উদাহরণ স্বরূপ:

cd my-new-project
git init
git fetch --depth=1 -n https://github.com/toolbear/panda.git
git reset --hard $(git commit-tree FETCH_HEAD^{tree} -m "initial commit")

এটি টেম্পলেট রেপোকে দূরবর্তী ( originবা অন্যথায়) হিসাবে যুক্ত করা এড়িয়ে যায় এবং আপনার প্রাথমিক প্রতিশ্রুতিতে টেম্পলেট রেপোর ইতিহাসকে ধসে পড়ে।


6
গিট রিভিশন সিনট্যাক্স (শিরোনাম {{গাছ}) সিনট্যাক্সটি এখানে অন্য কেউ যদি ভাবতে থাকে তবে এখানে ব্যাখ্যা করা হয়েছে: jk.gs/gitrevisions.html
কলিন

1
এটি কি স্থানীয় এবং দূরবর্তী সংগ্রহস্থল উভয়ই পুনরায় সেট করে, বা কেবল তাদের মধ্যে একটি?
আলেকারসন

4
@ আলেকারসন, এটি কেবলমাত্র স্থানীয় ভাণ্ডারে বর্তমান শাখাটি পুনরায় সেট করে, git push -fপ্রচারের জন্য ব্যবহার করে ।
ryenus

2
জড়িত নয় এমন একটি প্রকল্পের টেম্পলেট সংগ্রহশালা থেকে নতুন প্রকল্প শুরু করার উপায় সন্ধান করার সময় আমি এই উত্তরটি পেয়েছি git clone। আপনি যোগ তাহলে --hardকরার git resetসুইচ এবং HEADসঙ্গে FETCH_HEADgit commit-treeটেমপ্লেটে রেপো আনার সময় পর ইনিশিয়াল কমিট তৈরি করতে পারেন। আমি উত্তরটি সম্পাদনা করে শেষে এই অংশটি প্রদর্শন করেছি demonst
টুলবার

4
আপনি এই "ক্যাভ্যাট" থেকে মুক্তি পেতে পারেন তবে কেবল ব্যবহার করছেন${1?Please enter a message}
এলিয়ট ক্যামেরন

172

যদি আপনি যা করতে চান তা হ'ল আপনার সমস্ত প্রতিশ্রুতিগুলি রুট কমিটের জন্য স্কোয়াশ করা হয়, তবে কিছুক্ষণ

git rebase --interactive --root

কাজ করতে পারে, এটি প্রচুর সংখ্যক কমিট (উদাহরণস্বরূপ, কয়েকশো কমিটস) এর জন্য অবৈধ,

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

বিকল্প সমাধান # 1: এতিম শাখা

আপনি কেবল আপনার বর্তমান শাখার ডগায় (অর্থাত্ সাম্প্রতিকতম প্রতিশ্রুতি) একটি নতুন এতিম শাখা তৈরি করতে পারেন। এই অনাথ শাখা সম্পূর্ণ নতুন এবং পৃথক প্রতিশ্রুতিবদ্ধ বৃক্ষের প্রাথমিক মূল প্রতিশ্রুতি গঠন করে, যা কার্যকরভাবে আপনার সমস্ত প্রতিশ্রুতি স্কোয়াশ করার সমতুল্য:

git checkout --orphan new-master master
git commit -m "Enter commit message for your new initial commit"

# Overwrite the old master branch reference with the new one
git branch -M new-master master

ডকুমেন্টেশন:

বিকল্প সমাধান # 2: নরম রিসেট

আর একটি দক্ষ সমাধান হ'ল মূল প্রতিশ্রুতিতে একটি মিশ্র বা নরম রিসেট ব্যবহার করা <root>:

git branch beforeReset

git reset --soft <root>
git commit --amend

# Verify that the new amended root is no different
# from the previous branch state
git diff beforeReset

ডকুমেন্টেশন:


22
বিকল্প সমাধান # 1: এতিম শাখা - শিলা!
থমাস

8
বিকল্প সমাধান # 1 FTW। কেবল যুক্ত করতে, আপনি যদি নিজের পরিবর্তনগুলি দূরবর্তীটিতে ঠেলাতে চান তবে করুন git push origin master --force
এডি ভার্ব্রুগেন

1
ভুলে যাওয়া উচিত নয়git push --force
NecipAllef

কোডে অনাথ শাখা করবেন না (যেমন বিকল্প সমাধান # 1 উপরে করবেন না) যদি আপনি একটি খোলা গিথুব পুলের অনুরোধটি চালাচ্ছেন !!! গিথুব আপনার জনসংযোগ বন্ধ করবে কারণ বর্তমান মাথা সঞ্চিত মাথা শের বংশধর নয়
অ্যান্ড্রু ম্যাকি

বিকল্প সমাধান # 1 এছাড়াও স্কোয়াশিংয়ের সময় সংঘটিত হওয়ার সময় সংঘটিত হওয়া সংঘাতগুলি এড়িয়ে চলে
ফার্নআেন্ডার

52
echo "message" | git commit-tree HEAD^{tree}

এটি হেডের গাছের সাথে অনাথ প্রতিশ্রুতি তৈরি করবে এবং স্ট্যান্ডআউটে এর নাম (SHA-1) আউটপুট দেবে। তারপরে সেখানে আপনার শাখাটি পুনরায় সেট করুন।

git reset SHA-1

27
git reset $(git commit-tree HEAD^{tree} -m "commit message")এটি আরও সহজ করে তুলবে
ryenus

4
এই! - একটি উত্তর হতে হবে। এটি লেখকের উদ্দেশ্য ছিল কিনা তা সম্পূর্ণরূপে নিশ্চিত নয়, তবে এটি আমার ছিল (একক প্রতিশ্রুতি সহ একটি প্রাথমিক রেপোর প্রয়োজন, এবং এটি কাজটি সম্পন্ন করে)।
চেস্টারবার

@ আরিনুস, আপনার সমাধান আমি যা খুঁজছিলাম ঠিক সেভাবেই করেছে। যদি আপনি উত্তর হিসাবে আপনার মন্তব্য যোগ করেন, আমি এটি গ্রহণ করব।
tldr

2
আমি সাবসেল-বৈকল্পিকটি নিজেই প্রস্তাব না দেওয়ার কারণটি হ'ল এটি উইন্ডোজে cmd.exe এ কাজ করবে না।
কুসমা

উইন্ডোজ প্রম্পটে আপনার শেষ প্যারামিটারটি উদ্ধৃত করতে হতে পারে: echo "message" | git commit-tree "HEAD^{tree}"
বার্নার্ড

41

আমি এখানে এটি কীভাবে শেষ করেছি, কেবল যদি এটি অন্য কারও জন্য কাজ করে তবে:

মনে রাখবেন যে এ জাতীয় কাজগুলিতে সর্বদা ঝুঁকি থাকে এবং শুরু করার আগে সেভ ব্রাঞ্চ তৈরি করা কখনই খারাপ ধারণা নয়।

লগিং দ্বারা শুরু করুন

git log --oneline

প্রথমে প্রতিশ্রুতিবদ্ধ করতে স্ক্রোল করুন, SHA অনুলিপি করুন

git reset --soft <#sha#>

<#sha#>লগ থেকে ডাব্লু / SHA অনুলিপি প্রতিস্থাপন করুন

git status

নিশ্চিত করুন যে সবকিছু সবুজ, অন্যথায় চালানো git add -A

git commit --amend

সমস্ত বর্তমান পরিবর্তনগুলি বর্তমান প্রথম প্রতিশ্রুতিতে সংশোধন করুন

এখন এই শাখাটি জোর করে চাপুন এবং এটি সেখানে কী রয়েছে তা ওভাররাইট করবে।


1
দুর্দান্ত বিকল্প! সত্যিই সহজ।
twojr

1
এটি চমত্কার চেয়েও বেশি! ধন্যবাদ!
ম্যাট কোমার্নিকিকি

1
মনে রাখবেন যে এটি সম্ভবত ইতিহাসটিকে প্রায় ফেলে রেখেছিল। আপনি এতিম, কিন্তু এখনও আছে।
ব্র্যাড

খুব দরকারী উত্তর ... তবে আপনার সচেতন হওয়া উচিত যে সংশোধন কমান্ডের পরে আপনি এর বিশেষ বাক্য গঠন সহ নিজেকে ভিএম এডিটারে পাবেন। ESC, ENTER,: x আপনার বন্ধু।
এরিক কোয়েস্টার

দুর্দান্ত বিকল্প!
ড্যানিভিকারিও

36

আমি গ্রাফ্ট ব্যবহার সম্পর্কে কিছু পড়ি তবে এটি কখনও তদন্ত করে দেখিনি।

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

git reset HEAD~1
git add -A
git commit --amend

4
এটি আসলে আমি যে উত্তরটির সন্ধান করছিলাম এটি হ'ল এটি যদি স্বীকৃত হয়!
জে

এটি এমন আশ্চর্যজনক উত্তর
মাস্টার যোদা

36

সবচেয়ে সহজ উপায় হ'ল update-refবর্তমান শাখাটি মুছে ফেলার জন্য 'নদীর গভীরতানির্ণয়' কমান্ডটি ব্যবহার করা ।

আপনি git branch -Dবর্তমান শাখাটি মোছা থামাতে আপনার সুরক্ষা ভাল্ব থাকায় আপনি এটি ব্যবহার করতে পারবেন না ।

এটি আপনাকে 'প্রাথমিক প্রতিশ্রুতি' অবস্থায় ফিরিয়ে দেয় যেখানে আপনি একটি নতুন প্রাথমিক প্রতিশ্রুতি দিয়ে শুরু করতে পারেন।

git update-ref -d refs/heads/master
git commit -m "New initial commit"

16

প্রথমে আপনার সমস্ত প্রতিশ্রুতিগুলি স্কোয়াশ করে একক প্রতিশ্রুতি ব্যবহার করে git rebase --interactive। এখন আপনার স্কোয়াশের দুটি কমিট বাকি রয়েছে। এটি করতে, যে কোনও একটি পড়ুন


15

6 টি শব্দের একটি লাইনে

git checkout --orphan new_root_branch  &&  git commit

@ আলেকজান্ডারমিলস, আপনার git help checkoutসম্পর্কে পড়তে হবে--orphan
kyb

আপনি কি এর জন্য ডক্সের সাথে লিঙ্ক করতে পারেন যাতে যে কেউ এটি পড়েন তাদের ম্যানুয়ালি এটি অনুসন্ধান করতে হবে না?
আলেকজান্ডার মিলস

1
সহজ। এটি এখানেgit help checkout --orphan
kyb

8

একটি ব্যাকআপ তৈরি করুন

git branch backup

নির্দিষ্ট প্রতিশ্রুতি পুনরায় সেট করুন

git reset --soft <#root>

তারপরে মঞ্চে সমস্ত ফাইল যুক্ত করুন

git add .

বার্তা আপডেট না করে প্রতিশ্রুতিবদ্ধ

git commit --amend --no-edit

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

git push -f

এটি কি পূর্ববর্তী প্রতিশ্রুতি বার্তাগুলি সংরক্ষণ করবে?
not2qubit

1
@ not2qubit না এটি পূর্বের প্রতিশ্রুতি বার্তাগুলি সংরক্ষণ করবে না, প্রতিশ্রুতি # 1, প্রতিশ্রুতি # 2, প্রতিশ্রুতি # 3 এর পরিবর্তে, আপনি এই কমিটির সমস্ত পরিবর্তনগুলি একটি একক প্রতিশ্রুতি # 1 এ প্যাক করে পাবেন get প্রতিশ্রুতি # 1 হ'ল <root>আপনি যে প্রতিশ্রুতিতে ফিরে এসেছেন তা হবে। git commit --amend --no-editবর্তমান প্রতিশ্রুতিতে যা যা <root>কমিট করার বার্তাটি সম্পাদনা করার প্রয়োজন ছাড়াই সমস্ত পরিবর্তনের প্রতিশ্রুতিবদ্ধ।
ডেভিড মর্টন

5

গ্রাফ্ট ব্যবহার করে স্কোয়াশ করা

একটি ফাইল যুক্ত করুন .git/info/grafts , আপনি নিজের মূল হতে চান এমন প্রতিশ্রুতিবদ্ধ হ্যাশ রাখুন

git log এখন যে প্রতিশ্রুতি থেকে শুরু হবে

এটি 'আসল' রান করতে git filter-branch


1

এই উত্তরটি উপরে একটি দম্পতি উপর উন্নত (তাদের ভোট আপ করুন) অভিমানী তৈরি ছাড়াও এক কমিট যে (নো-বাবা নো ইতিহাস), আপনি এছাড়াও কমিট-ডেটা যে কমিট সব ধরে রাখতে চাই:

  • লেখক (নাম এবং ইমেল)
  • রচনা তারিখ
  • অঙ্গীকার (নাম এবং ইমেল)
  • প্রতিশ্রুতিবদ্ধ তারিখ
  • লগ বার্তা কমিট করুন

অবশ্যই নতুন / একক কমিটের কমিট-এসএএ পরিবর্তন হবে, কারণ এটি একটি নতুন (অ-অ) ইতিহাসের প্রতিনিধিত্ব করে, পিতৃতাহীন / রুট-কমিট হয়ে ওঠে becoming

এটি git logকিছু ভেরিয়েবল পড়ার এবং সেট করে করা যেতে পারে git commit-tree। ধরে নিই যে উপরের কমিট-ডেটা ধরে রেখে masterআপনি একটি নতুন শাখায় একটি একক প্রতিশ্রুতি তৈরি করতে চান one-commit:

git checkout -b one-commit master ## create new branch to reset
git reset --hard \
$(eval "$(git log master -n1 --format='\
COMMIT_MESSAGE="%B" \
GIT_AUTHOR_NAME="%an" \
GIT_AUTHOR_EMAIL="%ae" \
GIT_AUTHOR_DATE="%ad" \
GIT_COMMITTER_NAME="%cn" \
GIT_COMMITTER_EMAIL="%ce" \
GIT_COMMITTER_DATE="%cd"')" 'git commit-tree master^{tree} <<COMMITMESSAGE
$COMMIT_MESSAGE
COMMITMESSAGE
')

1

এটি করার জন্য, আপনি স্থানীয় গিট সংগ্রহস্থলটিকে প্রথম প্রতিশ্রুতিবদ্ধ হ্যাশট্যাগে পুনরায় সেট করতে পারেন, সুতরাং সেই প্রতিশ্রুতি দেওয়ার পরে আপনার সমস্ত পরিবর্তন আনস্টেজ করা হবে, তারপরে আপনি --amend বিকল্পের সাথে প্রতিশ্রুতিবদ্ধ করতে পারেন।

git reset your-first-commit-hashtag
git add .
git commit --amend

এবং তারপরে প্রয়োজনে প্রথম কমিট নামটি সম্পাদনা করুন এবং ফাইলটি সংরক্ষণ করুন।


1

আমার জন্য এটি এটির মতো কাজ করেছিল: আমার মোট 4 টি কমিট ছিল এবং ইন্টারেক্টিভ রিবেস ব্যবহৃত হয়েছিল:

git rebase -i HEAD~3

প্রথম প্রতিশ্রুতি রইল এবং আমি সর্বশেষ 3 টি কমিট নিয়েছি।

আপনি যদি সম্পাদকীয় হিসাবে আটকে থাকেন যা পরবর্তী প্রদর্শিত হয়, আপনি স্মিথ দেখতে পাবেন:

pick fda59df commit 1
pick x536897 commit 2
pick c01a668 commit 3

আপনাকে প্রথমে প্রতিশ্রুতি নিতে হবে এবং অন্যকে স্কোয়াশ করতে হবে। আপনার যা হওয়া উচিত তা হ'ল:

pick fda59df commit 1
squash x536897 commit 2
squash c01a668 commit 3

এর জন্য 'সন্নিবেশ' এবং 'সম্পাদনা' মোড পরিবর্তন করতে INSERT কী ব্যবহার করুন।

সম্পাদকটি ব্যবহার করে সংরক্ষণ এবং প্রস্থান করতে :wq। যদি আপনার কার্সারটি সেই প্রতিশ্রুতিবদ্ধ রেখাগুলির মধ্যে থাকে বা অন্য কোথাও ESC চাপুন এবং আবার চেষ্টা করুন।

ফলস্বরূপ আমার দুটি কমিট হয়েছিল: প্রথমটি যা রয়ে গেল এবং দ্বিতীয়টি "এটি 3 টি কমিটের সংমিশ্রণ" with

বিশদটি এখানে দেখুন: https://makandracards.com/makandra/527-squash-several-git-commits-into-a-single-commit


0

আমি সাধারণত এটি করে:

  • সবকিছু প্রতিশ্রুতিবদ্ধ তা নিশ্চিত করুন এবং কিছু ভুল হয়ে যাওয়ার ক্ষেত্রে সর্বশেষ কমিট আইডিটি লিখুন বা ব্যাকআপ হিসাবে একটি পৃথক শাখা তৈরি করুন

  • git reset --soft `git rev-list --max-parents=0 --abbrev-commit HEAD`প্রথম প্রতিশ্রুতিতে আপনার মাথাটি পুনরায় সেট করতে চালান , তবে আপনার সূচিটি অপরিবর্তিত রেখে দিন। প্রথম প্রতিশ্রুতি থেকে সমস্ত পরিবর্তন এখন প্রতিশ্রুতিবদ্ধ প্রস্তুত প্রদর্শিত হবে।

  • চালান git commit --amend -m "initial commit"সংশোধনের আপনার কমিট প্রথম কমিট এবং পরিবর্তন বার্তা কমিট, অথবা আপনি যদি বিদ্যমান কমিট বার্তা রাখতে চান, আপনি চালাতে পারেনgit commit --amend --no-edit

  • চালান git push -fবল আপনার পরিবর্তনগুলি ধাক্কা

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