যদি আমি ইতিমধ্যে পুনরায় বাস শুরু করি তবে আমি কীভাবে দুটি কমিটকে একের সাথে একীভূত করতে পারি?


1157

আমি 2 টি কমিটকে 1 এ একীভূত করার চেষ্টা করছি, তাই আমি গিট প্রস্তুত থেকে "পুনর্বাসনের সাথে স্কোয়াশিং কমিটস" অনুসরণ করেছি ।

আমি দৌড়ে গেলাম

git rebase --interactive HEAD~2

ফলস্বরূপ সম্পাদকটিতে, আমি পরিবর্তন pickকরি squashএবং তারপরে সেভ-প্রস্থান করি, তবে রিবেস ত্রুটির সাথে ব্যর্থ হয়

পূর্ববর্তী প্রতিশ্রুতি ব্যতীত 'স্কোয়াশ' করা যায় না

এখন আমার কাজের গাছ এই অবস্থায় পৌঁছেছে, পুনরুদ্ধারে আমার সমস্যা হচ্ছে।

কমান্ডটি git rebase --interactive HEAD~2ব্যর্থ:

ইন্টারেক্টিভ রিবেস ইতিমধ্যে শুরু হয়েছে

এবং সাথে git rebase --continueব্যর্থ

পূর্ববর্তী প্রতিশ্রুতি ব্যতীত 'স্কোয়াশ' করা যায় না


22
আমি এটাকেও মারলাম। আমার ভুলটি এই কারণে হয়েছিল যে গিট রিবেস -i গিট লগের বিপরীতে ক্রমগুলি তালিকাবদ্ধ করে; সর্বশেষ প্রতিশ্রুতি নীচে হয়!
lmsurprenant


1
: এছাড়াও খুঁজে বার করো git-scm.com/book/en/Git-Tools-Rewriting-History
Nha

উত্তর:


1732

সারসংক্ষেপ

ত্রুটি বার্তা

পূর্ববর্তী প্রতিশ্রুতি ব্যতীত 'স্কোয়াশ' করা যায় না

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

ঠিক করা

প্রথমে আপনি যেখানে শুরু করেছিলেন সেখানে ফিরে যান

$ git rebase --abort

আপনার ইতিহাস বলে

$ git log --pretty=oneline
a931ac7c808e2471b22b5bd20f0cad046b1c5d0d c
b76d157d507e819d7511132bdb5a80dd421d854f b
df239176e1a2ffac927d8b496ea00d5488481db5 a

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

(দ্রষ্টব্য: বেশিরভাগ প্ল্যাটফর্মে ডিফল্টরূপে git logপাইপগুলিতে পাইপগুলি lessচালিয়ে যায় the পেজারটি ছেড়ে দিতে এবং আপনার কমান্ড প্রম্পটে ফিরে আসতে, qকী টিপুন ))

দৌড় git rebase --interactive HEAD~2দিয়ে আপনাকে একটি সম্পাদক দেয় editor

pick b76d157 b
pick a931ac7 c

# Rebase df23917..a931ac7 onto df23917
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

(লক্ষ্য করুন যে এই টুডো তালিকাটি ফলাফলের তুলনায় বিপরীত ক্রমে রয়েছে git log))

বি এর পরিবর্তিত pickহওয়ার squashফলে আপনি যে ত্রুটি দেখেছেন তার ফলস্বরূপ, তবে পরিবর্তে আপনি সি-তে স্ক (স্ক্র্যাশ করে পুরানো বা "উপরের দিকে স্কোয়াশিং") এর মাধ্যমে টুডো তালিকা পরিবর্তন করে

pick   b76d157 b
squash a931ac7 c

এবং আপনার সম্পাদককে সংরক্ষণ-ছেড়ে দিলে আপনি অন্য সম্পাদক পাবেন যার বিষয়বস্তু

# This is a combination of 2 commits.
# The first commit's message is:

b

# This is the 2nd commit message:

c

আপনি সংরক্ষণ এবং প্রস্থান করার সময়, সম্পাদিত ফাইলের বিষয়বস্তুগুলি নতুন সম্মিলিত প্রতিশ্রুতিবদ্ধতার বার্তা হয়ে যায়:

$ git log --pretty=oneline
18fd73d3ce748f2a58d1b566c03dd9dafe0b6b4f b and c
df239176e1a2ffac927d8b496ea00d5488481db5 a

পুনর্লিখনের ইতিহাস সম্পর্কে নোট

ইন্টারেক্টিভ রিবেস ইতিহাস পুনর্লিখন করে। পুরানো ইতিহাস ধারণ করে এমন কোনও রিমোটে ঠেলে দেওয়ার চেষ্টা ব্যর্থ হবে কারণ এটি কোনও দ্রুতগামী নয়।

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

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

অন্যের উপর ভিত্তি করে কাজ করা শাখাটিকে (বা পুনর্লিখনের অন্য কোনও রূপ) রিবেসিং করা একটি খারাপ ধারণা: এর প্রবাহের যে কোনও ব্যক্তি ম্যানুয়ালি তাদের ইতিহাস ঠিক করতে বাধ্য হয়। এই বিভাগটি নীচে স্ট্রিমের দৃষ্টিকোণ থেকে কীভাবে ঠিক করবেন তা ব্যাখ্যা করে। প্রকৃত স্থিরতাটি হ'ল প্রথমে উজানের প্রবাহটি এড়াতে হবে। ...


আমি যদি কমিটিকে স্কোয়াশ করতে রিবেস ব্যবহার করি তবে দুটি চেঞ্জসেট সমন্বিত একটি নতুন "সম্মিলিত" কমিট তৈরি করা হয় তবে হ্যাশটি আলাদা। মূল কমিটগুলিও গিট দ্বারা সংরক্ষিত আছে?
ফেবসনেট

@ ফ্যাবসনেট হ্যাঁ এবং না। মূল প্রতিশ্রুতিগুলি এখনও অ্যাক্সেসযোগ্য তবে সম্ভবত কোনও রেফারেন্স (আপনার ইতিহাসের বিবরণের উপর নির্ভর করে) থেকে আর অ্যাক্সেসযোগ্য। অবাস্তব কমিটগুলি অবশেষে আবর্জনা সংগ্রহের প্রক্রিয়াটির মধ্য দিয়ে বাতিল করা হয়।
গ্রেগ বেকন

আমি কেবল চারপাশে খেলছিলাম ... আমি git log hashoftheoldcommitএটি করেছি এবং এটি কাজ করেছে, তবে git log --graphএই সমস্ত
অপ্রাপ্য কমিটস

এই স্কোয়াশটি ধাক্কা দেওয়ার আগে কমিটগুলি সংগঠিত করার জন্য ভাল হাতিয়ার, তবে আমি যদি কোনওটিকে প্রতিশ্রুতি দেয় তবে আমি এটিকে স্কোয়াশ করতে পারি না? গিট বলেছেন: সাফল্যের সাথে রিবেসড এবং আপডেট পৃথক হেড।
সর্জিও

দ্বিতীয় দফায় সম্পাদক পাচ্ছি না, গিট ব্যাশ কিছু প্রক্রিয়াতে হিমশীতল বলে মনে হচ্ছে। কি করো?

411

যদি একাধিক কমিট থাকে তবে আপনি git rebase -iদুটি কমিটকে একটিতে স্কোয়াশ করতে ব্যবহার করতে পারেন ।

আপনি যদি মার্জ করতে চান কেবল দুটি কমিট এবং সেগুলি "অতি সাম্প্রতিক দুটি" হয় তবে দুটি কমিটকে এক সাথে সংযুক্ত করতে নিম্নলিখিত কমান্ডগুলি ব্যবহার করা যেতে পারে:

git reset --soft "HEAD^"
git commit --amend

6
পুনর্বাসনের তুলনায় নেতিবাচক দিকটি কী? আমি ব্যবহার করতে অনেক সহজ খুঁজে।
Guillaume86

17
শুধুমাত্র - তুমি নির্বিচারে নির্দেশ মতো যোগ দিতে পারবেন না গত দুই করে
dr0i

50
@ dr0i আপনি যতটা কমিট করতে চান ততক্ষণ মার্জ করতে পারবেন, যতক্ষণ না তারা শেষ এক্স কমিট করবেন, না মাঝের কোথাও নয়। কেবল চালান git reset --soft HEAD~10, যেখানে 10 টি আপনি একত্রিত করতে চান এমন কমিটের সংখ্যা।
ফ্রেগান্ট

2
আপনার যদি কোনও দূরবর্তী উত্স সেট না থাকে এবং আপনার কেবল দুটি কমিট থাকে তবে এটি ব্যবহার করা যেতে পারে।
আবেদজ

8
কমিটের SHA1 আইডি কোথায় রয়েছে তা HEADব্যবহার করে আপনি কতগুলি আছে তা গণনা করতে না চাইলে আপনি একটি নির্দিষ্ট প্রতিশ্রুতিতেও পুনরায় সেট করতে পারেন । git reset --soft 47b5c5...47b5c5...
dguay

112

রিবেস: আপনার প্রয়োজন হবে না:

সর্বাধিক ঘন ঘন দৃশ্যের জন্য একটি সহজ উপায়।

অধিকাংশ ক্ষেত্রে:

আসলে আপনি যদি চান সব ঠিক কেবল এক মধ্যে বেশ কিছু সাম্প্রতিক করে মেশা কিন্তু প্রয়োজন হবে না drop, rewordএবং অন্যান্য রি-বেসের ফলে হবে।

আপনি সহজভাবে করতে পারেন:

git reset --soft "HEAD~n"
  • ধরে নেওয়া যাক ~nকরার জন্য বদ্ধ পরিকর সংখ্যা ধীরে ধীরে জাতিসংঘের কমিট (অর্থাত ~1, ~2, ...)

তারপরে, প্রতিশ্রুতি বার্তাটি পরিবর্তন করতে নিম্নলিখিত কমান্ডটি ব্যবহার করুন।

git commit --amend

যা বেশ দীর্ঘ squashএবং একরকমের সমান pick

এবং এটি এন কমিটের জন্য কাজ করে তবে উপরের উত্তরটি অনুরোধ হিসাবে কেবল দুটি কমিট নয়।


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

1
ধরে নেওয়া যাক ~nধীরে ধীরে জাতিসংঘের কমিট (অর্থাত করার জন্য বদ্ধ পরিকর সংখ্যা ~1, ~2, ...)
সত্যজিৎ

1
আমি যদি মার্জ করতে চাই তবে nসর্বশেষ nকমিট না করে মাঝখানে কমিট করবে? আমি কি সহজেই এটি করতে পারি?
চুমাকফ

1
তারপরে git rebase -iআপনার squashকাজটি করা দরকার । @ চুমাকোফ
পাম্বদা

3
সুতরাং যোগদানের জন্য nএক, প্রথম ব্যবহারের মধ্যে সাম্প্রতিকতম করে git reset --soft @~m, যেখানেm = n - 1
Łukasz Rajchel

55

প্রথমে আপনার কতটি কমিট রয়েছে তা যাচাই করা উচিত:

git log

দুটি স্থিতি রয়েছে:

এক আছে হয় শুধুমাত্র দুই করে:

উদাহরণ স্বরূপ:

commit A
commit B

(এই ক্ষেত্রে, আপনি গিট রিবেসটি করতে ব্যবহার করতে পারবেন না) আপনার নিম্নলিখিতগুলি করা দরকার।

$ git reset --soft HEAD^1

$ git commit --amend

আর একটি হ'ল দু'জনেরও বেশি কমিট রয়েছে; আপনি কমিট সি এবং ডি মার্জ করতে চান

উদাহরণ স্বরূপ:

commit A
commit B
commit C
commit D

(এই শর্তে আপনি গিট রিবেস ব্যবহার করতে পারেন)

git rebase -i B

এবং "স্কোয়াশ" ব্যবহার করার চেয়ে বেশি। বাকী পাতাগুলি খুব সহজ। আপনি যদি এখনও জানেন না, দয়া করে http://zerodie.github.io/blog/2012/01/19/git-rebase-i/ পড়ুন


রিসেট --সোফ্ট এবং কমিট --amend একমাত্র উপায় যা আপনার যদি ইতিমধ্যে অগ্রিম অগ্রগতিতে (এবং এই প্রতিশ্রুতিটির জন্য 'স্কোয়াশের পরিবর্তে' সম্পাদনা 'বেছে নিয়েছিলেন) কাজ করে। +1
জেসেক ল্যাচ

1
প্রথম এবং কেবল দু'জনকেই কোনও সংগ্রহস্থলে একীভূত করা, ঠিক আমার প্রান্তের ক্ষেত্রে :-)
ক্রিস হুয়াং-লিভার

1
দয়া করে git push -f origin masterএটি neccesary হতে পারে।
habষভ অগ্রহরি

33

ধরে নিচ্ছি আপনি নিজের টপিক শাখায় ছিলেন। আপনি যদি সর্বশেষ 2 টি কমিটকে একটিতে মিশ্রিত করতে চান এবং নায়কের মতো দেখতে চান তবে আপনি শেষ দুটি প্রতিশ্রুতি দেওয়ার ঠিক আগে অঙ্গীকারটি বন্ধ করুন branch

git checkout -b temp_branch HEAD^2

তারপরে স্কোয়াশ এই নতুন শাখায় অন্য শাখায় প্রতিশ্রুতিবদ্ধ:

git merge branch_with_two_commits --squash

এটি পরিবর্তন আনবে তবে তাদের প্রতিশ্রুতি দেবে না। সুতরাং কেবল তাদের প্রতিশ্রুতিবদ্ধ এবং আপনি সম্পন্ন।

git commit -m "my message"

এখন আপনি এই নতুন বিষয় শাখাকে আপনার মূল শাখায় ফেরত দিতে পারবেন।


5
এটি আসলে আমার পক্ষে সবচেয়ে সহায়ক উত্তর, কারণ এটির জন্য ম্যানুয়াল রিবেসিংয়ের প্রয়োজন ছিল না, বরং কেবল পুরো শাখার সমস্ত কমান্ডকে স্কট করে একটি কমিট করে। খুব সুন্দর.
রবার্ট

এর জন্য ধন্যবাদ! আমার মাথায় স্কোয়াশিং কমিটের চিত্র কীভাবে এইভাবে গিট করতে হবে!
মার্জন ভেনেমা

আশ্চর্যজনক উত্তর, বিকল্পগুলির চেয়ে অনেক সহজ

স্পষ্টতই, এই উত্তরটি ক্ষেত্রে উপযুক্ত নয় aএবং যখন cএকত্রে একত্রীকরণ করতে হয় এবং bযেমন হয় তেমন রাখতে হয় keep
তালহা আশরাফ

2
গিটের সাম্প্রতিক সংস্করণগুলিতে কিছু পরিবর্তন হয়েছে? আমি যখন git checkout -b combine-last-two-commits "HEAD^2"গিট সংস্করণ fatal: 'HEAD^2' is not a commit and a branch 'combine-last-two-commits' cannot be created from it
২.১17

23

আপনি এই রিবেস বাতিল করতে পারেন

git rebase --abort

এবং আপনি যখন ইন্টারেক্টিভ রিবেস কমান্ডটি আবার চালাবেন তখন স্কোয়াশ; প্রতিশ্রুতি অবশ্যই তালিকার পিক কমিটের নীচে থাকতে হবে


16

আমি প্রায়শই গিট রিসেট ব্যবহার করি - আপনি একীভূত করতে চান এমন একাধিক প্রতিশ্রুতি দেওয়ার আগে বেস সংস্করণটি রিভার্ট করার জন্য মিক্সড করা হয়, তারপরে আমি একটি নতুন প্রতিশ্রুতিবদ্ধ করি, আপনি সার্ভারে ধাক্কা দেওয়ার পরে আপনার সংস্করণটি হেড হওয়ার আশ্বাস দেয়।

commit ac72a4308ba70cc42aace47509a5e
Author: <me@me.com>
Date:   Tue Jun 11 10:23:07 2013 +0500

    Added algorithms for Cosine-similarity

commit 77df2a40e53136c7a2d58fd847372
Author: <me@me.com>
Date:   Tue Jun 11 13:02:14 2013 -0700

    Set stage for similar objects

commit 249cf9392da197573a17c8426c282
Author: Ralph <ralph@me.com>
Date:   Thu Jun 13 16:44:12 2013 -0700

    Fixed a bug in space world automation

যদি আমি মাথা দুটি কমিটকে একটিতে মার্জ করতে চাই তবে প্রথমে আমি ব্যবহার করি:

git reset --mixed 249cf9392da197573a17c8426c282

"249cf9392da197573a17c8426c282" এটি তৃতীয় সংস্করণ ছিল, আপনার মার্জ হওয়ার আগে এটিও আপনার বেস সংস্করণ, এর পরে আমি একটি নতুন প্রতিশ্রুতিবদ্ধ:

git add .
git commit -m 'some commit message'

সব কিছু, আশা সবার জন্য অন্য উপায়।

এফওয়াইআই, এর থেকে git reset --help:

 --mixed
     Resets the index but not the working tree (i.e., the changed files are
     preserved but not marked for commit) and reports what has not been
     updated. This is the default action.

আমি '- মিক্সড' এর জন্য ডকগুলি পড়িনি তবে আমি নিশ্চিত যে অন্যান্য লোকেরা পোস্টটি পড়ে এবং একই জিনিসটি নিয়ে অবাক হয়: - মিক্সড ব্যবহারের সুবিধা কী? ম্যান পৃষ্ঠার একটি স্নিপেট অন্তর্ভুক্ত করতে আপনার পোস্টকে উন্নত করতে পারে।
funroll

@ ফনরল আমি এই উত্তরটি লেখার আগে খুব বেশি পরিমাণে - মিক্সড জানতাম না, আমার নিজের অভিজ্ঞতা অনুসারে, মিশ্র অপারেশনটি এমন একটি সংস্করণ নির্দিষ্ট করবে যা আমি আর্গুমেন্ট হিসাবে হেড সংস্করণ হিসাবে আর্গুমেন্ট হিসাবে পাস করি এবং সেই সংস্করণের পরে কিছুই হারাতে পারে না, সুতরাং আমরা এখনও এই পরিবর্তনগুলি পরিচালনা করতে পারি।
ভিন্সস্টাইলিং

14

$ git rebase --abort

আপনি গিট রিবেসটি পূর্বাবস্থায় ফিরিয়ে আনতে চাইলে যে কোনও সময় এই কোডটি চালান

$ git rebase -i HEAD~2

শেষ দুটি কমিটি পুনরায় আবেদন করতে। উপরের কমান্ডটি একটি কোড সম্পাদক খুলবে

  • [ সর্বশেষ প্রতিশ্রুতি নীচে থাকবে ] স্কোয়াশের সর্বশেষ প্রতিশ্রুতি পরিবর্তন করুন s যেহেতু স্কোয়াশ পূর্বের প্রতিশ্রুতি দিয়ে মেশানো হবে।
  • তারপরে এসকি কী টিপুন এবং সংরক্ষণ করুন এবং বন্ধ করতে ডাব্লুডাব্লু টাইপ করুন

এর পরে: ডাব্লিউকিউ আপনি সক্রিয় রিবেস মোডে থাকবেন

দ্রষ্টব্য : কোনও সতর্কতা / ত্রুটি বার্তাগুলি না থাকলে আপনি অন্য সম্পাদক পাবেন, যদি কোনও ত্রুটি থাকে বা সতর্ককারী অন্য সম্পাদক দেখায় না$ git rebase --abortতবে আপনি যদি কোনও ত্রুটি দেখেন বা সতর্কতা দেখেন তবে চালিয়ে দিয়েবাতিল করতে পারেন অন্যদিকে চালিয়ে যেতে$ git rebase --continue

আপনি আপনার 2 টি প্রতিশ্রুতি বার্তা দেখতে পাবেন। একটি চয়ন করুন বা আপনার নিজস্ব প্রতিশ্রুতি বার্তা লিখুন, সংরক্ষণ করুন এবং প্রস্থান করুন [: wq]

দ্রষ্টব্য 2: আপনার রিবেস কমান্ড চালানো হলে আপনাকে রিমোট রেপোতে আপনার পরিবর্তনগুলি জোর করে চাপতে হবে

$ git push -f

$ git push -f origin master


1
দ্রষ্টব্য 2: git push -f origin/masterঅন্যান্য উত্তরগুলি কী অনুপস্থিত। +1
isষভ অগ্রহরি

2

যেহেতু আমি git cherry-pickপ্রায় সবকিছুর জন্যই ব্যবহার করি, আমার কাছে এটি এখানে প্রাকৃতিকভাবে আসে।

আমি এটি branchXপরীক্ষা করে দেখেছি এবং এর ডগায় দুটি কমিট রয়েছে যার মধ্যে আমি তাদের সামগ্রীর সংমিশ্রণে একটি প্রতিশ্রুতি তৈরি করতে চাই, আমি এটি করি:

git checkout HEAD^ // Checkout the privious commit
git cherry-pick --no-commit branchX // Cherry pick the content of the second commit
git commit --amend // Create a new commit with their combined content

যদি branchXআমিও আপডেট করতে চাই (এবং আমি মনে করি এটি এই পদ্ধতির নীচের দিক) তবে আমারও করতে হবে:

git checkout branchX
git reset --hard <the_new_commit>

1

যদি আপনার মাস্টার শাখাটি git logনীচের মতো কিছু দেখায়:

commit ac72a4308ba70cc42aace47509a5e
Author: <me@me.com>
Date:   Tue Jun 11 10:23:07 2013 +0500

    Added algorithms for Cosine-similarity

commit 77df2a40e53136c7a2d58fd847372
Author: <me@me.com>
Date:   Tue Jun 11 13:02:14 2013 -0700

    Set stage for similar objects

commit 249cf9392da197573a17c8426c282
Author: Ralph <ralph@me.com>
Date:   Thu Jun 13 16:44:12 2013 -0700

    Fixed a bug in space world automation

এবং আপনি শীর্ষ দুটি কমিটকে মার্জ করতে চান কেবল সহজ পদক্ষেপগুলি অনুসরণ করে:

  1. প্রথমে নিরাপদ দিকে চেকআউট করার জন্য একটি পৃথক শাখায় দ্বিতীয় শেষ প্রতিশ্রুতি। আপনি শাখার নাম বলতে পারেন।git checkout 77df2a40e53136c7a2d58fd847372 -b merged-commits
  2. এখন, কেবলমাত্র চেরি-বাছাই শেষ থেকে আপনার পরিবর্তন হিসাবে এই নতুন শাখা মধ্যে সমর্পণ git cherry-pick -n -x ac72a4308ba70cc42aace47509a5e। (যদি কোনও উত্থাপিত হয় তবে বিরোধগুলি সমাধান করুন)
  3. সুতরাং এখন, শেষ প্রতিশ্রুতিতে আপনার পরিবর্তনগুলি আপনার দ্বিতীয় শেষ প্রতিশ্রুতিতে রয়েছে। তবে আপনাকে এখনও প্রতিশ্রুতিবদ্ধ থাকতে হবে, তাই প্রথমে আপনি কেবল চেরি-বাছাই করা পরিবর্তনগুলি যুক্ত করুন এবং তারপরে সম্পাদন করুন git commit --amend

এটাই. আপনি যদি চান তবে আপনি এই মার্জ করা সংস্করণটি "মার্জড-কমিটস" শাখায় ঠেলাতে পারেন।

এছাড়াও, আপনি এখন আপনার মাস্টার শাখায় ব্যাক-টু-ব্যাক দুটি কমিট বাতিল করতে পারেন। কেবলমাত্র আপনার মাস্টার শাখাটিকে আপডেট করুন:

git checkout master
git reset --hard origin/master (CAUTION: This command will remove any local changes to your master branch)
git pull

0

আপনি যদি দুটি সাম্প্রতিক কমিটগুলি একত্রিত করতে চান এবং কেবল পুরানো প্রতিশ্রুতি বার্তাটি ব্যবহার করতে চান তবে আপনি ব্যবহার করে প্রক্রিয়াটি স্বয়ংক্রিয় করতে পারেন expect

আমি অনুমান করি:

  • আপনি vi কে আপনার সম্পাদক হিসাবে ব্যবহার করছেন
  • আপনার প্রতিশ্রুতি প্রতিটি এক-লাইন হয়

আমি পরীক্ষা দিয়েছি git version 2.14.3 (Apple Git-98)


#!/usr/bin/env expect
spawn git rebase -i HEAD~2

# change the second "pick" to "squash"
# down, delete word, insert 's' (for squash), Escape, save and quit
send "jdwis \033:wq\r"

expect "# This is a"

# skip past first commit message (assumed to be one line), delete rest of file
# down 4, delete remaining lines, save and quit
send "4jdG\r:wq\r"

interact

আপনার স্ক্রিপ্ট কী করে তা অস্পষ্ট।
বুটজ

@buhtz আমি আরও কিছু মন্তব্য যুক্ত করেছি। আপনি যদি এখনও এটি বিভ্রান্তিকর খুঁজে পান এবং যদি তাই হয় তবে কোন অংশটি তা আমাকে জানান।
ইরওয়ামান

আপনার স্ক্রিপ্ট কী করে তা এখনও অস্পষ্ট। এছাড়াও expectundescribed করা হয়।
বুট্জ

@ বুট্টজ কোন অংশটি অস্পষ্ট? আমি এর জন্য আরও ডকুমেন্টেশন সহ একটি পৃষ্ঠায় একটি লিঙ্ক সরবরাহ করেছি expect
ইরওয়ামান

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