আমি কীভাবে দুটি অবিচ্ছিন্ন কমিটি স্কোয়াশ করব?


182

আমি গিটের মধ্যে পুরো রিবিসিং বৈশিষ্ট্যে কিছুটা নতুন। ধরা যাক যে আমি নিম্নলিখিত প্রতিশ্রুতিবদ্ধ করেছি:

A -> B -> C -> D

এরপরে, আমি বুঝতে পারি যে Dএকটি ফিক্স রয়েছে যা যুক্ত হওয়া কিছু নতুন কোডের উপর নির্ভর করে Aএবং এই কমিটগুলি এক সাথে সম্পর্কিত। আমি কিভাবে স্কোয়াশ না A& Dএকসাথে ছুটি BCএকা?

উত্তর:


256

আপনি git rebase --interactiveবি এবং স্কোয়াশ ডি এর আগে ডি চালনা এবং পুনঃক্রম করতে পারেন A.

গিট একটি সম্পাদক খুলবে, এবং আপনি এর মতো একটি ফাইল দেখতে পাবেন, যেমন: git rebase --interactive HEAD~4

pick aaaaaaa Commit A
pick bbbbbbb Commit B
pick ccccccc Commit C
pick ddddddd Commit D

# Rebase aaaaaaa..ddddddd onto 1234567 (4 command(s))
#
# 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
# x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

এখন আপনি ফাইলটি দেখতে দেখতে এটি পরিবর্তন করুন:

pick aaaaaaa Commit A
squash ddddddd Commit D
pick bbbbbbb Commit B
pick ccccccc Commit C

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


5
প্রথমদিকে, আমি এটিকে "A এ রিবাজে ডি, স্কোয়াশ ডি এ তে, তারপরে বি-কে ডিএতে পুনঃনির্মাণ" হিসাবে পড়েছি। এটি উত্তর থেকে স্পষ্ট নয় যে এটি কোনও পাঠ্য সম্পাদকের লাইনে পুনরায় অর্ডার করে করা যেতে পারে।
ভিক্টর সার্জিইঙ্কো

3
যদি আপনার শাখা স্থানীয় হয় তবে There is no tracking information for the current branchরিবেস করার সময় আপনি ত্রুটি পাবেন । এই ক্ষেত্রে আপনি করে আপনি ভালো সঙ্গে কাজ করতে চান তার সংখ্যা উল্লেখ করা প্রয়োজন: git rebase -i HEAD~4এই উত্তর দেখুন ।
জোহানোদো

1
আমি বছরের পর বছর ধরে ইন্টারেক্টিভ মোড (গিট রিবেস -i) ব্যবহার করি, আমি কেবল বুঝতে পেরেছি এটি পুনঃক্রম হতে পারে । ধন্যবাদ 🤟🏻
ক্যালভিনে

43

দ্রষ্টব্য: আপনার পরিণতিগুলি না জেনে আপনি যে কোনও প্রতিশ্রুতি অন্য রেপোতে ঠেলেছেন সেগুলি পরিবর্তন করা উচিত নয়

git log --oneline -4

D commit_message_for_D
C commit_message_for_C
B commit_message_for_B
A commit_message_for_A

git rebase --interactive

pick D commit_message_for_D
pick C commit_message_for_C
pick B commit_message_for_B
pick A commit_message_for_A

প্রকার i(সন্নিবেশ মোডে ভিআইএম রাখুন)

এই দেখতে দেখতে তালিকাটি পরিবর্তন করুন (আপনাকে প্রতিশ্রুতি বার্তা সরাতে বা অন্তর্ভুক্ত করতে হবে না)। ভুল বানান না squash! :

pick C commit_message_for_C
pick B commit_message_for_B
pick A commit_message_for_A
squash D

Escতারপরে টাইপ ZZকরুন (ভিআইএম সংরক্ষণ করুন এবং প্রস্থান করুন)

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

commit_message_for_D

# This is the 2nd commit message:

commit_message_for_A

আদর্শ i

নতুন প্রতিশ্রুতি বার্তাটি দেখতে আপনি কী চান তে পাঠ্যটি পরিবর্তন করুন। আমি এটি প্রতিশ্রুতিবদ্ধকরণের পরিবর্তনের বর্ণনা হিসাবে সুপারিশ করব Aএবং D:

new_commit_message_for_A_and_D

টাইপ করুন EscতারপরZZ

git log --oneline -4

E new_commit_message_for_A_and_D
C commit_message_for_C
B commit_message_for_B

git show E

(You should see a diff showing a combination of changes from A and D)

আপনি এখন একটি নতুন প্রতিশ্রুতি তৈরি করেছেন E। কমিট করে Aএবং Dআপনার ইতিহাসে আর নেই তবে চলে যায় না। আপনি এখনও এই মুহুর্তে এবং কিছু সময়ের জন্য তাদের পুনরুদ্ধার করতে পারেন git rebase --hard D( git rebase --hardকোনও স্থানীয় পরিবর্তন ধ্বংস করে দেবে! )।


3

সোর্সট্রি ব্যবহারকারীদের জন্য :

নিশ্চিত হয়ে নিন যে আপনি ইতিমধ্যে কমিটগুলি ঠেলেছেন না।

  1. সংগ্রহস্থল> ইন্টারেক্টিভ রিবেস ...
  2. সরাসরি এ (পুরানো প্রতিশ্রুতি) এর উপরে থাকতে ডি (নতুন প্রতিশ্রুতি) টেনে আনুন
  3. কমিট ডি হাইলাইট হয়েছে তা নিশ্চিত করুন
  4. ক্লিক Squash with previous

1

ইন্টারেক্টিভ রিবেস ভাল কাজ করে আপনার 20-30 টি কমিট এবং / অথবা মাস্টার বা / এবং আপনি যখন আপনার শাখায় যাত্রা করার সময় সংঘাত সংশোধন করার মাধ্যমে একত্রীকরণের সাথে একটি বড় বৈশিষ্ট্য শাখা না পেয়ে থাকেন। এমনকি ইতিহাস মাধ্যমে আমার করে খুঁজে পেতে এবং প্রতিস্থাপন সঙ্গে pickসঙ্গে squashএখানে কাজ করে না। সুতরাং আমি অন্য উপায় খুঁজছিলাম এবং এই নিবন্ধটি খুঁজে পেয়েছি । আমি পৃথক শাখায় এটির জন্য আমার পরিবর্তনগুলি করেছি:

git checkout master
git fetch
git pull
git merge branch-name
git reset origin/master
git branch -D branch-name
git checkout -b branch-name
git add --all
#Do some commit
git push -f --set-upstream origin branch-name

এর আগে আমি প্রায় ~ 30 দিয়ে আমার টানার অনুরোধ পেয়েছি মাস্টার + ফিক্সিং কোন্দল থেকে 2-3 মার্জ করে comm এবং এর পরে আমি একটি প্রতিশ্রুতি দিয়ে স্পষ্ট PR পেয়েছি।

পিএস এখানে অটোমোডে এই পদক্ষেপগুলি করতে বাশ স্ক্রিপ্ট


এই নিবন্ধটির প্রথম সমাধানটি সত্যিই দুর্দান্ত, লিঙ্কটির জন্য ধন্যবাদ
হুডি

-1

it গিট চেকআউট মাস্টার

it গিট লগ - অনলাইন

D
C
B
A

it গিট রিবেস - হেড on হেড to থেকে ^

it গিট লগ - অনলাইন

D
A

আমার মনে হয় তুমি বোঝাতে চাচ্ছো --oneline? এবং দেখে মনে হচ্ছে আপনি বাদ পড়েছেন Cএবং Bওপি যা চান তা নয়।
bstpierre

আমার পক্ষে কাজ করেনি। এটি আমার হেড এবং মাস্টার উভয়কেই এ-তে স্থানান্তরিত করেছে, কিন্তু ডি কে এ ( git show A) এর সাথে মার্জ করে না এবং ডি, সি এবং বি আমার রেফ-লগতে হারিয়ে যায়। ছিল git rebase Dফিরে পেতে।
নেট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.