গিট: রিবেস করার সময় "পূর্ববর্তী অঙ্গীকার ব্যতীত 'স্কোয়াশ' করা যায় না


102

করণীয় পাঠ্যে আমার নিম্নলিখিত রয়েছে git rebase -i HEAD~2:

pick 56bcce7 Closes #2774
pick e43ceba Lint.py: Replace deprecated link

# Rebase 684f917..e43ceba onto 684f917 (2 command(s))
#
...

এখন, আমি যখন প্রথমটি স্কোয়াশ করার চেষ্টা করি এবং প্রথমটির 56bcce7আগে "গুলি" যুক্ত করে দ্বিতীয়টি বাছাই করি, আমি নিম্নলিখিত ত্রুটিটি পেয়েছি:

Cannot 'squash' without a previous commit

কেউ আমাকে এর অর্থ কী তা ব্যাখ্যা করতে পারেন এবং আমি কীভাবে এটি করব?

আমি প্রথম প্রতিশ্রুতি ( 56bcce7) স্কোয়াশ করতে চাই এবং দ্বিতীয় ( e43ceba) প্রতিশ্রুতি "নির্বাচন এবং পুনর্নির্মাণ" করতে চাই


4
আপনি যদি সত্যিই স্কোয়াশ করতে চান তবে হেড ~ 2 কে হেড ~ 3 এ পরিবর্তন করুন।
এলিপেকে

4
এবং সম্ভবত --root ব্যবহার করুন, যদি HEAD ~ 2 হয় আপনার প্রথম প্রতিশ্রুতি: স্ট্যাকওভারফ্লো.com
a

উত্তর:


89

ইন্টারেক্টিভ রিবেস উপস্থাপন করার সময় আপনি যখন ব্যবহার করছেন তখন তার বিপরীত ক্রমে প্রতিশ্রুতিবদ্ধ git loggit rebase -iনির্বাচিত প্রতিশ্রুতিগুলি যথাযথভাবে (উপরে-ডাউন) ক্রমে পুনঃস্থাপন করে সেগুলি সংরক্ষণিত পুনর্বাসনের নির্দেশিকা ফাইলে তালিকাভুক্ত করা হয়েছে। স্কোয়াশিংয়ের সময়, স্কোয়াশিংয়ের জন্য নির্বাচিত প্রতিশ্রুতি সেই কমিটের সাথে মিলিত হয় যা এর আগে (সম্পাদিত) তালিকায় আসে, অর্থাৎ পূর্ববর্তী লাইন থেকে প্রতিশ্রুতিবদ্ধ। আপনার ক্ষেত্রে - এর জন্য পূর্বের কোন প্রতিশ্রুতি নেই 56bcce7। আপনাকে নিম্নলিখিতগুলির একটি করতে হবে

  • git rebase -i HEAD~3(আপনি স্কোয়াশ করতে চান তাহলে 56bcce7মধ্যে 684f917)
  • আপনি একত্রিত চাওয়ার কথা বলছেন তাহলে 56bcce7সঙ্গে e43ceba, এবং e43cebaউপর নির্ভর করে না 56bcce7, তারপর কেবল তাদের পুনর্বিন্যাস:

    r e43ceba Lint.py: Replace deprecated link
    s 56bcce7 Closes #2774
    

    আপডেট : নীচের গাসের উত্তর দু'জনের প্রতিশ্রুতি পুনরায় বিন্যাস না করে একই কাজ করার আরও ভাল উপায়ের পরামর্শ দেয়:

    r 56bcce7 Closes #2774
    s e43ceba Lint.py: Replace deprecated link
    

    এটি স্কোয়াশ / দুটি কমিটকে এক করে একীভূত করবে। ইন্টারেক্টিভ রি-বেসের ফলে একটি জন্য অনুরোধ যখন reworded জন্য বার্তা কমিট 56bcce7, বার্তা যে ইউনিয়ন বর্ণনা কমিট প্রদান 56bcce7এবং e43ceba


4
আমি স্কোয়াশ করতে চান 56bcce7 মধ্যে e43ceba। সুতরাং, আমি এখানে কীভাবে পদক্ষেপ 1 করব?
দাওয়ানি 33

86

আমার অনুরূপ সমস্যা ছিল যা আমি নীচে সমাধান করেছি:

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

1 s 01cc5a08 Removes open div
2 s a2b6eecf Restores old fonts
3 s 603479ff Cleans left out div
4 pick 5afdbc33 Update: show logo on landing page
5 s 04c1cb13 change version of dev and prod from 1 to 2
6 s bbe6a8f8 Update: show logo on landing page if they have one
7 s c0d6008a Adds check for C users

আপনি দেখতে পারেন, আমি না চেয়েছিলেন। 4, তবে 1, 2 এবং 3 এর মধ্যে স্কোয়াশের কোনও পূর্ব প্রতিশ্রুতি ছিল না । অতএব কোনও পূর্ববর্তী কমিট ত্রুটি ছাড়াই 'স্কোয়াশ' করা যায় না

আমার সমাধানটি rবিকল্পটি ব্যবহার করা ছিল# r, reword = use commit, but edit the commit message

সুতরাং আমার কমিটের তালিকাটি এরকম দেখাচ্ছে:

1 r 01cc5a08 Removes open div
2 s a2b6eecf Restores old fonts
3 s 603479ff Cleans left out div
4 s 5afdbc33 Update: show logo on landing page
5 s 04c1cb13 change version of dev and prod from 1 to 2
6 s bbe6a8f8 Update: show logo on landing page if they have one
7 s c0d6008a Adds check for C users

সংরক্ষণের পরে, ইন্টারেক্টিভ শেলটি আমাকে নির্বাচিত প্রতিশ্রুতিটির পুনর্নির্মাণের জন্য জিজ্ঞাসা করেছিল।

এর পরে, আমার প্রতিশ্রুতি লগের ফলসই একক প্রতিশ্রুতি যার ফলস্বরূপ একটি ক্লিনার প্রতিশ্রুতিবদ্ধ ইতিহাস।


4
আমার মত আপনি যদি ত্রুটি পেয়ে থাকেন কারণ আপনি উল্লেখ বা ত্রুটি বাছাই করা এবং উল্লেখ করা ত্রুটি (প্রশ্নে) পাওয়ার কোনও প্রতিশ্রুতি বেছে নেন নি, আপনাকে git rebase --edit-todoএই উত্তরটি উল্লেখ করে তা করতে হবে এবং তারপরে করবেgit rebase --continue
Old-monk

এই উত্তরটি সংক্ষিপ্ত এবং এই মুহুর্তে, সত্যই সাহায্য করেছিল, ধন্যবাদ
২৯:১০ এ গঞ্জোফিশ

20

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

1 pick 01mn9h78 The lastest commit
2 pick a2b6pcfr A commit before the latest
3 pick 093479uf An old commit i made a while back

এখন আপনি যদি বলেন git rebase -i HEAD~3এবং আপনি যেমন কিছু করেন

1 pick 01mn9h78 The lastest commit
2 s a2b6pcfr A commit before the latest
3 s 093479uf An old commit i made a while back

এর ফলে ত্রুটি হবে:

ত্রুটি: পূর্বের প্রতিশ্রুতি ব্যতীত 'স্কোয়াশ' করতে পারবেন না আপনি এটি 'গিট রিবেস - এডিট-টুডো' দিয়ে ঠিক করতে পারেন এবং তারপরে 'গিট রিবেস - কন্টিনিউ' চালাতে পারেন। অথবা আপনি 'গিট রিবেস --abort' দিয়ে রিবেসটি বাতিল করতে পারেন।

সমাধান:

স্কোয়াশিং কমিট করার সময় আপনার পুরানো লোকদের কাছে সাম্প্রতিক কমিটগুলি স্কোয়াশ করা উচিত thusদৃষ্টিতে এটি উদাহরণস্বরূপ এটি হতে পারে:

1 s 01mn9h78 The lastest commit
2 s a2b6pcfr A commit before the latest
3 pick 093479uf An old commit i made a while back

এটি দুর্দান্ত কাজ করবে, যদি আপনি আপনার সমস্ত প্রতিশ্রুতিবদ্ধ বার্তা চান তবে আমি স্কোয়াশের পরিবর্তে ফিক্সআপের পরামর্শ দেব ।


4
আপনাকে ধন্যবাদ- আমি স্কোয়াশ প্রায়শই প্রতিশ্রুতিবদ্ধ না এবং সবচেয়ে পুরানো প্রতিশ্রুতি বাছাইয়ের পরামর্শটিই আমাকে একটি অনিচ্ছাকৃত গিট ত্রুটির মধ্য দিয়ে যেতে সহায়তা করেছে।
0x574F4F54

4

বিপরীত যুক্তি সহ স্কোয়াশ । আপনি পরবর্তী পদক্ষেপে পছন্দসই প্রতিশ্রুতি বার্তাটি নির্বাচন করতে সক্ষম হবেন।

  • pickপ্রথম প্রতিশ্রুতিবদ্ধ যে আপনি প্রতিশ্রুতি-বার্তা চান না
  • squashবা আপনি fixupযে সংঘটিত হতে চান সেগুলি হ'ল যতক্ষণ না আপনি যে প্রতিশ্রুতিবদ্ধ বার্তাটি সত্যই চেয়েছিলেন has
pick 56bcce7 Closes #2774
squash e43ceba Lint.py: Replace deprecated link
  • পরিবর্তন নিশ্চিত করুন ( :x)
  • মুছতে বার্তা কমিট (গুলি) যে আপনি চান না এবং শুধুমাত্র বার্তা এবং ছেড়ে কমিট থেকে আপনি ইচ্ছা যে (এই ক্ষেত্রে: Lint.py: Replace deprecated link)।
  • পছন্দ নিশ্চিত করুন ( :x)

আশা করি এটি কারওর জন্য পরিষ্কার ✌🏽


2

কমিটস যুক্ত ইন্টারেক্টিভ এডিটরটিতে কেবল বলা ভাল, গিটটি সর্বদা নীচ থেকে উপরে স্কোয়াশ থাকে এবং নীচে থেকে স্কোয়াশগুলি পেতে শীর্ষে একটি "পিক" এন্ট্রি ছেড়ে দেওয়া উচিত।


2

আমি কেবল এই পদ্ধতির চেষ্টা করেছি।

গিট লগ -n3

এটি সর্বশেষ 3 টি প্রতিশ্রুতিগুলি দেখায় যা আমাকে সর্বশেষ প্রতিশ্রুতিবদ্ধ এবং কোনটি আগে গিয়েছিল তা সম্পর্কে ধারণা দেয়। এখন প্রত্যাখ্যান,

গিট রিবেস -i হেড ~ 3

সর্বশেষতম প্রতিশ্রুতি চয়ন করুন যার উপরে আমাদের অন্য দুটি স্কোয়াশ দরকার। বেস কমিট হিসাবে বেছে নেওয়া কমিট আইডি যেমন হবে,

কমিট_আইডি বাছাই করুন

অন্য দুটি কমিট আইডির জন্য, এগুলিতে পরিবর্তন করুন,

স্কোয়াশ কমিট_আইডি

বা সহজভাবে,

s কমিট_আইডি


0

আমি ইতিমধ্যে এই সমস্যার সাথে এখনই দেখা করেছি, এটি কেবল গাফিল। প্রথমটি নয় আপনি পরবর্তী ওয়েব সাইটটিও উল্লেখ করতে পারেন: http://backlogtool.com/git-guide/en/stepup/stepup7_5.html


4
ওহে ! আপনি যদি স্ট্যাক ওভারফ্লোতে ভবিষ্যতের প্রয়াসের জন্য একটি ন্যূনতম, সম্পূর্ণ এবং যাচাইযোগ্য উদাহরণ কীভাবে তৈরি করবেন তা যদি আপনি চেকআউট করেন। আপনাকে ধন্যবাদ
মমিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.