গিট ফর্ম্যাট-প্যাচ সহ আপনি কীভাবে স্কোয়াশকে এক প্যাচে প্রতিশ্রুত করেন?


163

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

git format-patch master HEAD # yields zillions of patches, even though there's 
                             # only one commit since master

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

4
রব ডি মার্কোর পরামর্শ অনুসারে আমি গিট ডিফ ব্যবহার করব। তবে আমি গত সপ্তাহে সবেমাত্র আমার দ্বিতীয় বাচ্চা মেয়েটির জন্মের সাক্ষী হয়ে দুই সপ্তাহের জন্য কাজ করছি, সুতরাং আমি এটি ব্যবহার করার আগে কিছুক্ষণ হয়ে যাবে! :)
skiphoppy

2
আমি গিট ফর্ম্যাট-প্যাচ দেখতে চাই - স্কোয়াশ মাস্টার হেড
স্কোয়েটবি

1
একটি রেভ-রেঞ্জ নির্দিষ্ট করার জন্য মাস্টার..হাদ চেষ্টা করুন Try
Konrad Kleine

উত্তর:


186

আমি নীচে একটি নিক্ষিপ্ত শাখায় এটি করার পরামর্শ দিচ্ছি। যদি আপনার কমিটগুলি "নিউলাইনস" শাখায় থাকে এবং আপনি ইতিমধ্যে আপনার "মাস্টার" শাখায় ফিরে এসেছেন তবে এই কৌশলটি করা উচিত:

[adam@mbp2600 example (master)]$ git checkout -b tmpsquash
Switched to a new branch "tmpsquash"

[adam@mbp2600 example (tmpsquash)]$ git merge --squash newlines
Updating 4d2de39..b6768b2
Fast forward
Squash commit -- not updating HEAD
 test.txt |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

[adam@mbp2600 example (tmpsquash)]$ git commit -a -m "My squashed commits"
[tmpsquash]: created 75b0a89: "My squashed commits"
 1 files changed, 2 insertions(+), 0 deletions(-)

[adam@mbp2600 example (tmpsquash)]$ git format-patch master
0001-My-squashed-commits.patch

আশাকরি এটা সাহায্য করবে!


2
আমি স্থানীয়ভাবে ইতিহাস রাখতে চাইলে আমি এটি ব্যবহার করি (যদি প্যাচটি সম্পাদনা করতে হয় তবে)। অন্যথায় আমি কেবল রিবাজে -i ব্যবহার করি এবং কমিটগুলি স্কোয়াশ করি।
সেবুউ

5
আমার জন্য, এটি আরও নির্ভরযোগ্যতার সাথে কাজ করেছে git comit -m "My squashed commits"অন্যথায় এটি অন্য তালিকৃত ফাইল যুক্ত করতে পারে
সেবাস্তিয়ান

যোগসূত্র হিসাবে, আপনি মাস্টারের পরিবর্তে একটি নির্দিষ্ট প্রতিশ্রুতিতে স্যুইচ করতে পারেন এবং প্রতিশ্রুতিবদ্ধ থেকে একটি প্যাচ তৈরি করতে এটি করতে পারেন:git checkout 775ec2a && git checkout -b patch && git merge --squash branchname
বেরি এম।

131

পাত্রটিতে আরও একটি সমাধান যুক্ত করতে: আপনি যদি এটির পরিবর্তে এটি ব্যবহার করেন:

git format-patch master --stdout > my_new_patch.diff

তারপরে এটি 8 টি প্যাচ হবে ... তবে তারা সকলেই একক প্যাচফাইলে থাকবেন এবং এটি হিসাবে এক হিসাবে প্রয়োগ হবে:

git am < my_new_patch.diff

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

1
আপনি সংযুক্তি এড়াতে চাইলে এই বিকল্পটি দুর্দান্ত! (যেমন আপনি কিছু কমিট এড়িয়ে যেতে চান)। আপনি এখনও git rebase -i ...এবং এগুলি একের মধ্যে স্কোয়াশ করতে পারেন ।
জর্জি অরপিনেল

21

আমি সর্বদা আপনার উদাহরণে গিট ডিফ ব্যবহার করি, এরকম কিছু

git diff master > patch.txt

15
আপনি বাদে সমস্ত প্রতিশ্রুতি বার্তা এবং মেটাডেটা আলগা করুন। গিট ফর্ম্যাট-প্যাচের সৌন্দর্য হ'ল প্যাচগুলির সেট থেকে পুরো শাখাটি পুনর্গঠন করা সম্ভব।
এমসপিএল

তৈরি করা শাখা এবং স্কোয়াশ পদ্ধতিতে সমস্ত প্রতিশ্রুতিবদ্ধ বার্তাগুলিকে এক সাথে সংযুক্ত করার সুবিধা রয়েছে তবে আপনি যদি নিজস্ব প্রতিশ্রুতি বার্তা লিখতে চান তবে এই পদ্ধতিটি আরও দ্রুত
woojoo666

আসলে, একটি সম্মিলিত বার্তা ব্যবহার করে করা যেতে পারে git log, উদাহরণ হিসাবে আমার উত্তর দেখুন
woojoo666

2
দুর্দান্ত বিকল্প, তবে বিবেচনা করুন যে 'গিট ডিফ' বাইনারি পার্থক্য অন্তর্ভুক্ত করতে পারে না (সম্ভবত এটি করার কোনও বিকল্প আছে)।
সান্তিয়াগো ভিলাফুয়ের্তে

18

আপনার পরিবর্তনগুলি যদি মাস্টার ব্রাঞ্চে থাকে তবে এটি অ্যাডাম আলেকজান্ডার উত্তরের একটি রূপান্তর। এটি নিম্নলিখিত করুন:

  • আমরা যে পয়েন্টটি চাই তা থেকে একটি নতুন নিক্ষেপ শাখা "tmpsquash" তৈরি করে (SHA কী "গিট - লগ" বা গিটগ সহ চলমান সন্ধান করুন t আপনি tmpsquash মাথা হতে চান এমন প্রতিশ্রুতি নির্বাচন করুন, মাস্টার পরে যে কমিটগুলি হবে তা হবে স্কোয়াশেড কমিট করে)।
  • মাস্টার থেকে tmpsquash এ পরিবর্তনগুলি মার্জ করে।
  • স্কোয়াশেড পরিবর্তনগুলি tmpsquash এ সঞ্চার করে।
  • স্কোয়াশেড কমিটস দিয়ে প্যাচ তৈরি করে।
  • মাস্টার শাখায় ফিরে যায়

laura@rune:~/example (master)$ git branch tmpsquash ba3c498878054e25afc5e22e207d62eb40ff1f38
laura@rune:~/example (master)$ git checkout tmpsquash
Switched to branch 'tmpsquash'
laura@rune:~/example (tmpsquash)$ git merge --squash master
Updating ba3c498..40386b8
Fast-forward
Squash commit -- not updating HEAD

[snip, changed files]

11 files changed, 212 insertions(+), 59 deletions(-)
laura@rune:~/example  (tmpsquash)$ git commit -a -m "My squashed commits"
[test2 6127e5c] My squashed commits
11 files changed, 212 insertions(+), 59 deletions(-)
laura@rune:~/example  (tmpsquash)$ git format-patch master
0001-My-squashed-commits.patch
laura@rune:~/example  (tmpsquash)$ git checkout master
Switched to branch 'master'
laura@rune:~/example  (master)$

মাস্টার পরিবর্তন করা একটি বিরোধী প্যাটার্ন, যদি আপনি এগুলিকে নিজের থেকে দূরে সরিয়ে না রাখেন। এবং যদি আপনি চান, আপনার সম্ভবত তাদের জন্য প্যাচ ফাইলগুলি তৈরি করার দরকার নেই।
ivan_pozdeev

18

আপনি ইতিমধ্যে জানেন যে একটি git format-patch -8 HEADআপনাকে আটটি প্যাচ দেবে।

আপনি যদি চান যে আপনার 8 টি কমিটগুলি একটি হিসাবে উপস্থিত হয় এবং আপনার শাখার ( o-o-X-A-B-C-D-E-F-G-H) এর ইতিহাস পুনর্লিখন করতে আপত্তি না করে তবে আপনি এটি করতে পারেন:

git rebase -i
// squash A, B, C, D, E ,F, G into H

বা, এবং এটি আরও ভাল সমাধান হতে পারে, আপনার 8 টি কমিটকে Xনতুন শাখায় (আপনার 8 কমিটের পূর্বে করা কমিট) পুনরায় খেলুন

git branch delivery X
git checkout delivery
git merge --squash master
git format-patch HEAD

এইভাবে, আপনার কেবল "ডেলিভারি" শাখায় একটি অঙ্গীকার রয়েছে এবং এটি আপনার শেষ 8 টি কমিটকে উপস্থাপন করে


git merge masterনিছক একটি দ্রুত ফরোয়ার্ড করে এবং স্কোয়াশ কোনওটিতেই কমিট করে না। git merge --squash masterপর্যায়ের স্থানে সমস্ত কমিট স্কোয়াশড এবং দৃশ্যমান পেতে পরিবর্তন করুন । আপনার প্রবাহ এই পরিবর্তনের সাথে কাজ করবে। (আমি গিট সংস্করণ 2.1.0 ব্যবহার করছি))
স্টানার

5

দুটি ট্যাগের মধ্যে ফর্ম্যাট-প্যাচ:

git checkout <source-tag>
git checkout -b <tmpsquash>
git merge --squash <target-tag>
git commit -a -m "<message>"
git format-patch <source-tag>

5

সবচেয়ে সহজ উপায় হ'ল ব্যবহার করা git diffএবং আপনি git logযদি সম্মিলিত প্রতিশ্রুতি বার্তা চান যে স্কোয়াশ পদ্ধতিটি আউটপুট দেয় তবে যুক্ত করা। উদাহরণস্বরূপ, কমিট abcdএবং এর মধ্যে প্যাচ তৈরি করতে 1234:

git diff abcd..1234 > patch.diff
git log abcd..1234 > patchmsg.txt

তারপরে প্যাচ প্রয়োগ করার সময়:

git apply patch.diff
git add -A
git reset patch.diff patchmsg.txt
git commit -F patchmsg.txt

অ-পাঠ্য ফাইলগুলি, উদাহরণস্বরূপ চিত্র বা ভিডিওগুলির সাথে ডিল --binaryকরার git diffসময় যুক্তিটি ভুলে যাবেন না ।


0

অ্যাডাম আলেকজান্ডারের উত্তরের ভিত্তিতে:

git checkout newlines
## must be rebased to master
git checkout -b temporary
# squash the commits
git rebase -i master
git format-patch master
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.