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


1207

আমার কাছে রিমোট গিট সার্ভার রয়েছে, আমি যে দৃশ্যটি সম্পাদন করতে চাই তা এখানে:

  • প্রতিটি বাগ / বৈশিষ্ট্যের জন্য আমি আলাদা গিট শাখা তৈরি করি

  • আমি আন-অফিশিয়াল গিট ম্যাসেজ সহ সেই গিট শাখায় আমার কোড করাতে থাকি

  • শীর্ষ সংগ্রহস্থলগুলিতে আমাদের অফিসিয়াল গিট ম্যাসেজ সহ একটি বাগের জন্য একটি কমিট করতে হবে

তাহলে আমি কীভাবে আমার শাখাটিকে দূরবর্তী শাখায় একীভূত করতে পারি যাতে তারা আমার সমস্ত চেক-ইনগুলির জন্য কেবল একটি প্রতিশ্রুতি পায় (আমি এমনকি এটির জন্য প্রতিশ্রুতি বার্তা সরবরাহ করতে চাই)?


1
আমি আপনাকে পুরোপুরি বুঝতে পেরেছি কিনা তা নিশ্চিত নই তবে আপনি একটি "অক্টোপাস মার্জ" করতে পারেন।
ম্যাট্রিক্সফ্রোগ

26
আমি সাধারণত আমার সমস্ত প্রতিশ্রুতিগুলি একটি প্রতিশ্রুতিতে ভেঙে ফেলার জন্য প্রতিশ্রুতি বার্তাটি পুনরায় লেখার জন্য গিট রিবেস -i ব্যবহার করি । তারপরে আমি এটিকে প্রবাহিত করি।
এডওয়ার্ড ফ্যাল্ক

17
git merge --squashএটি সমস্ত কমান্ড লাইনে একটি শটে করে এবং আপনি কেবল আশা করি এটি কার্যকর হয়েছে। git rebase -iএকটি সম্পাদক এনেছে এবং আপনাকে রিবাজে সূক্ষ্ম-টিউন করতে দেয়। এটি ধীর, তবে আপনি কী করছেন তা দেখতে পারেন। এছাড়াও, রিবেস এবং মার্জ মধ্যে পার্থক্য রয়েছে যা একটি মন্তব্যে সম্বোধনের জন্য সামান্য পরিমাণে জড়িত।
এডওয়ার্ড ফালক

4
এই সমস্ত উত্তরগুলির সাথে সমস্যাটি হ'ল আপনাকে স্থানীয়ভাবে মাস্টার শাখায় থাকতে হবে এবং মার্জ - - স্কোয়াশ কমান্ড চালান ... আমি মাস্টার শাখা নয় বৈশিষ্ট্য শাখা থেকে মার্জ - স্কোয়াশ চালাতে চাই ... তাই যখন আমার কাজ শেষ হয়ে যায়, আমি বৈশিষ্ট্য শাখাটিকে দূরবর্তী স্থানে ঠেকাতে এবং একটি PR জমা দিতে পারি, এটি কি সম্ভব?
আলেকজান্ডার মিলস

2
@ আলেকজান্ডারমিলস, আমি মনে করি আপনার কেবল একটি দ্বিতীয় বৈশিষ্ট্য শাখা (মাস্টার শাখা থেকে ক্লোন করা) প্রয়োজন। কি merge --squashনতুন এক পুরানো থেকে, এবং তারপর মাস্টার নতুন শাখা একত্রিত করে। পুরানো শাখা অচল হয়ে যায়।
জিরোমাইট

উত্তর:


1997

বলুন আপনার বাগ ফিক্স শাখাটি ডাকা হয়েছে bugfixএবং আপনি এটিতে একত্রীকরণ করতে চান master:

git checkout master
git merge --squash bugfix
git commit

এটি bugfixশাখা থেকে সমস্ত কমিট গ্রহণ করবে , তাদের 1 টি কমিটে স্কোয়াশ করবে এবং এটি আপনার masterশাখার সাথে একীভূত করবে ।


ব্যাখ্যা :

git checkout master

আপনার masterশাখায় স্যুইচ করে ।

git merge --squash bugfix

bugfixশাখা থেকে সমস্ত কমিট নেয় এবং এটিকে আপনার বর্তমান শাখায় একীভূত করে।

git commit

মার্জ হওয়া পরিবর্তনগুলি থেকে একটি একক প্রতিশ্রুতি তৈরি করে।

-mপ্যারামিটারটি ছাড়াই আপনাকে প্রতিশ্রুতি চূড়ান্ত করার আগে আপনার স্কোয়াশেড কমিটের প্রতিটি বার্তা সম্বলিত একটি খসড়া কমিট বার্তাটি সংশোধন করতে দেয়।


222
আপনি যদি পুরানো প্রতিশ্রুতি বার্তাগুলির রেফারেন্স রাখতে চান তবে আপনি লিখতে পারেন git commit( -mপ্যারাম ছাড়াই ) এবং আপনাকে স্কোয়াশ করা সমস্ত কমিট বার্তা সম্বলিত একটি খসড়া প্রতিশ্রুতি বার্তাটি পরিবর্তন করতে হবে।
অ্যালেক্স

12
আপনি git commit --amend -m '...'পরে কাজ করে এটি অর্জন করতে পারেন ।
জানুস লেনার

19
যদি মার্জ সংঘাত ঘটে এবং আপনি এই দ্বন্দ্বগুলি সমাধান করেন তবে git commitআপনাকে স্কোয়াশ করা সমস্ত প্রতিশ্রুতি বার্তা সম্বলিত দরকারী প্রতিশ্রুতি আর দেখাবে না। সেক্ষেত্রেgit commit --file .git/SQUASH_MSG ( স্ট্যাকওভারফ্লো . com/a/11230783/923560 এর মাধ্যমে ) চেষ্টা করুন ।
আব্দুল

23
মনে রাখবেন যে স্কোয়াশিং ডিফল্টরূপে স্কোয়াশারের প্রতিশ্রুতিগুলি সরবরাহ করে । মূল লেখককে রাখতে, আপনাকে স্পষ্টভাবে এটি নির্দিষ্ট করতে হবে:git commit -a --author="Author" --message="Issue title #id"
গর্বজনক

5
git merge --squashআপনাকে বর্তমান শাখার শীর্ষে একটি একক প্রতিশ্রুতি তৈরি করতে দেয় যার প্রভাব অন্য শাখাটি মার্জ করার মতো। তবে এটি একীভূত রেকর্ড তৈরি করবে না যার অর্থ আপনার পুল-অনুরোধের ফলে কোনও পরিবর্তন হবে না, তবুও মার্জ হিসাবে চিহ্নিত করা হবে না! সুতরাং, কাজটি করার জন্য আপনাকে কেবল সেই শাখাটি মুছতে হবে।
am0wa

129

যা পরিশেষে আমার পক্ষে এটি পরিষ্কার হয়েছিল তা এমন মন্তব্য ছিল যা দেখায়:

git checkout main
git merge --squash feature

সমান সমান:

git checkout feature
git diff main > feature.patch
git checkout main
patch -p1 < feature.patch
git add .

যখন আমি 105 (!!) কমিটের সাথে একটি বৈশিষ্ট্য শাখাটি মার্জ করতে চাই এবং সেগুলি সমস্তগুলিকে একটিতে বিভক্ত করতে চাই, তখন আমি চাই না git rebase -i origin/masterকারণ মধ্যবর্তী কমিটগুলির প্রত্যেকের জন্য (বা কমপক্ষে একটির জন্য সংহত বিবাদগুলি আলাদাভাবে সমাধান করতে হবে ) গিট নিজেই বের করতে পারে না)। ব্যবহার git merge --squashআমাকে ফলাফলের আমি চাই পায়, একটি একক একটি সম্পূর্ণ বৈশিষ্ট্য শাখা মার্জ জন্য কমিট। এবং, আমাকে কেবলমাত্র একটি ম্যানুয়াল দ্বন্দ্বের সমাধান করতে হবে।


74
আমি প্রথমে বৈশিষ্ট্য শাখায় মার্জটি সম্পাদন করার পরামর্শ দিই git merge masterএবং তারপরে কেবল git merge --squash featureমাস্টার শাখায়।
dotancohen

8
@ ডটানকোহেন একটি পুরানো মন্তব্য ড্রেজ করার জন্য দুঃখিত: git merge --squash featureমাস্টার শাখা থেকে সম্পাদন করার আগে বৈশিষ্ট্য শাখায় মার্জ করে কী লাভ ?
বিটসম্যাক

56
আপনি প্রথমে বৈশিষ্ট্য শাখায় মাস্টারকে মার্জ করতে এবং আপনার বৈশিষ্ট্য শাখার যেকোন ম্যানুয়াল ফিক্সগুলি মোকাবেলা করতে চান। এটি আপনাকে পরীক্ষা চালাতে এবং আপনার বৈশিষ্ট্য শাখাটি সঠিকভাবে কাজ করে তা নিশ্চিত করতে দেয়। তারপরে, আপনি গ্যারান্টিযুক্ত যে আপনি নিজের বৈশিষ্ট্য শাখাকে মাস্টার হিসাবে একটি স্বয়ংক্রিয়ভাবে মার্জ করতে পারেন।
ড্যান কোহন

4
@ ডানকোহন আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি উপরের মন্তব্যে ব্যাখ্যাটি আপনার উত্তরে যুক্ত করুন।
গুনবার্ট

3
@ বিটসম্যাক: আপনি প্রথমে মাস্টারকে ফিচারে মার্জ করবেন। এটি আপনাকে বৈশিষ্ট্যটিতে মাস্টার হিসাবে মার্জ করার আগে বৈশিষ্ট্যটিতে দ্বন্দ্ব সমাধানের সুযোগ দেয়
মাইক

97

আপনি স্কোয়াশ বিকল্পের সাথে একত্রীকরণ করতে চান। আপনি যদি এটি একবারে একটি শাখা করতে চান।

git merge --squash feature1

আপনি যদি একক প্রতিশ্রুতি হিসাবে একই সাথে সমস্ত শাখাকে একত্রীকরণ করতে চান তবে প্রথমে ইন্টারেক্টিভভাবে পুনরায় চালু করুন এবং প্রতিটি বৈশিষ্ট্য স্কোয়াশ করুন তারপরে অক্টোপাস মার্জ করুন:

git checkout feature1
git rebase -i master

একটি প্রতিশ্রুতি মধ্যে স্কোয়াশ তারপর অন্যান্য বৈশিষ্ট্য জন্য পুনরাবৃত্তি।

git checkout master
git merge feature1 feature2 feature3 ...

এটি শেষ মার্জটি "অক্টোপাস মার্জ" কারণ এটি একবারে প্রচুর শাখা মার্জ করে।

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


3
আপনি কেন অবকাশ করছেন?
উমায়ের এ।

12
@ উমাইআশরাফ এটি একটি ইন্টারেক্টিভ রিবেস যা আপনাকে আপনার শাখায় স্কোয়াশ করার বিকল্প দেয়।
andho

1
মুক্তি একটি খারাপ ধারণা। ইতোমধ্যে প্রকাশিত
কমিটগুলি

1
@ Sebi2020 গিট মার্জ - স্কোয়াশ আপনার ইতিমধ্যে প্রকাশিত কমিটগুলি এমনভাবে রিবেস করবে যা ইন্টারেক্টিভ রিবেসের চেয়ে খারাপ। একটি ইন্টারেক্টিভ রিবেস (কোনও বৈশিষ্ট্য শাখায়) কোনও প্রতিকূল প্রভাব ফেলেনি।
xiix

1
@ এক্সিক্স এটি কেবল সত্য ধারণ করে যদি আপনি কেবলমাত্র বৈশিষ্ট্য শাখায় কাজ করছেন। এটি আপনি করতে পারেন এমন অনুমান নয়। আমি গিট-এসসিএম-এ রিবিসিং সম্পর্কিত পৃষ্ঠাগুলি পড়ার পরামর্শ দিচ্ছি । এটিতে লেখা আছে " আপনার ভাণ্ডারের বাইরে থাকা প্রতিশ্রুতিগুলি পুনঃস্থাপন করবেন না এবং লোকেরা তাদের উপর ভিত্তি করে কাজ করতে পারে " "এবং যদি আপনি নিশ্চিতভাবে জানেন না যে লোকেরা ইতিমধ্যে প্রকাশিত কমিটির উপর ভিত্তি করে কাজ করেছে (যা আপনি বিকেন্দ্রের কারণে জানতে পারবেন না) গিটার প্রকৃতি) আপনি এটি করতে হবে না।
Sebi2020

23

আপনার যদি ইতিমধ্যে git merge bugfixচালু থাকে তবে আপনি mainনিজের মার্জ কমিটিকে এর সাথে স্কোয়াশ করতে পারেন:

git reset --soft HEAD^1
git commit

git reset --soft HEAD^1অন্তর্নির্মিত হওয়ার আগে অন্তত মার্জটি দ্রুত এগিয়ে যাওয়ার ক্ষেত্রে করা শেষ প্রতিশ্রুতিটি পূর্বাবস্থায় ফিরে আসে বলে মনে হচ্ছে।
জেস্পার ম্যাথিজেন

@ জেস্পার ম্যাথিসিইন দ্রুতগতির ক্ষেত্রে আপনি যদি মার্জ কমিট না পান, তবে আপনি তা করবেন git reset --soft HEAD^<number-of-commits-to-squash>
কিওয়ার্টজগুয়ে

এটি আমাকে স্ট্রিম স্ট্রিজের পরে একক প্রতিশ্রুতিতে সমস্ত কিছু স্কোয়াশ করতে সহায়তা করেছিল।
মূর্তিমান নিরানন্দ

18

একটি কাস্টম কমিটের সাথে newFeatureশাখাটি মার্জ করুন master:

git merge --squash newFeature && git commit -m 'Your custom commit message';

পরিবর্তে যদি, আপনি না

git merge --squash newFeature && git commit

আপনি একটি প্রতিশ্রুতিবদ্ধ বার্তা পাবেন যা এতে সমস্ত newFeatureশাখার কমিটগুলি অন্তর্ভুক্ত থাকবে , যা আপনি কাস্টমাইজ করতে পারেন।

আমি এখানে এটি পুরোপুরি ব্যাখ্যা করেছি: https://youtu.be/FQNAIacelT4


10

আমি জানি এই প্রশ্নটি গিথুব সম্পর্কে বিশেষভাবে নয়, তবে যেহেতু গিতুব এত ব্যাপকভাবে ব্যবহৃত হয়েছে এবং এটিই আমি উত্তর খুঁজছিলাম, তাই আমি এটি এখানে ভাগ করব।

গিথুব স্কোভা মার্জগুলি সম্পাদন করার ক্ষমতা রাখে, সংগ্রহস্থলের জন্য সক্ষম হওয়া মার্জ বিকল্পগুলির উপর নির্ভর করে।

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

"স্কোয়াশ এবং মার্জ" গিথুব বৈশিষ্ট্যের স্ক্রিনশট


গিটহাব আপনার অ্যাকাউন্টের সাথে সম্পর্কিত ডিফল্ট ইমেল ব্যবহার করে। আপনার যদি একাধিক ইমেল ঠিকানা থাকে এবং আপনার একটি মাধ্যমিক ব্যবহার করা দরকার, আপনি GH UI ব্যবহার করতে পারবেন না।
লুকা গুইদি

4

ধরুন আপনি একাধিক কমিটি সহ বৈশিষ্ট্য / টাস্ক 1 এ কাজ করেছেন।

  1. আপনার প্রকল্প শাখায় যান (প্রকল্প / আমার_প্রজেক্ট)

    git checkout project/my_project
    
  2. একটি নতুন শাখা তৈরি করুন (বৈশিষ্ট্য / টাস্ক 1_বাগফিক্স)

    git checkout -b feature/task1_bugfix
    
  3. --squashবিকল্পের সাথে চিহ্নিত করুন

    git merge --squash feature/task1
    
  4. একটি একক প্রতিশ্রুতি তৈরি করুন

    git commit -am "add single comments"
    
  5. আপনার শাখা ঠেলা

    git push --set-upstream origin feature/task1_bugfix
    

1

গিটের জন্য

একটি নতুন বৈশিষ্ট্য তৈরি করুন

টার্মিনাল / শেল মাধ্যমে:

git checkout origin/feature/<featurename>
git merge --squash origin/feature/<featurename>

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

তারপরে প্রতিশ্রুতিবদ্ধ করুন এবং এই নতুন শাখা থেকে বৈশিষ্ট্যটি সমাপ্ত করুন এবং পুরানোটিকে (আপনি যার উপর দিয়েছিলেন) মুছে ফেলুন / উপেক্ষা করুন।


@ মেলিবিয়াস "সোর্স ট্রি" এর একমাত্র রেফারেন্সটি আপনার বাক্যে রয়েছে, যদি এটি কোনও ট্যাগ বা পূর্ববর্তী প্রশ্ন ছিল: এটির আর অস্তিত্ব নেই।
জর্দান স্টেফেনেলি

1
@ জর্ডানস্টেফেনেলি সোর্স ট্রি এই উত্তরের মূল সংস্করণে ব্যবহৃত হয়েছিল । এটি ঠিক করার জন্য ধন্যবাদ!
মেলবিয়াস

1

যদি আপনি ত্রুটি পান: প্রতিশ্রুতিবদ্ধ হওয়া সম্ভব নয় কারণ আপনার ফাইলগুলিকে সজ্জিত করা হয়নি।

git checkout master
git merge --squash bugfix
git add .
git commit -m "Message"

সমস্ত দ্বন্দ্ব ফাইলগুলি স্থির করে

git add . 

আপনি ব্যবহার করতে পারে

git add [filename]

0

আপনার স্থানীয় শাখাটিকে চাপ দেওয়ার আগে স্কোয়াশ করতে:

  1. যদি ইতিমধ্যে চেক আউট না হয় তবে কাজ করার জন্য প্রশ্নে থাকা শাখাটি চেকআউট করুন।

  2. আপনি যে পুরনো প্রতিশ্রুতি রাখতে চান তা সন্ধান করুন।

  3. সেই প্রতিশ্রুতি থেকে একটি নতুন শাখা (tmp1) তৈরি / চেকআউট করুন।

    git checkout -b tmp1 <sha1-of-commit>

  4. নতুন একটি স্কোয়াশিংয়ে আসল শাখাটি মার্জ করুন।

    git merge --squash <original branch>

  5. সংক্ষিপ্ত প্রতিশ্রুতি বার্তা সহ মার্জ দ্বারা তৈরি করা পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ।

    git commit -m <msg>

  6. আপনি স্কোয়াশ করতে চান এমন মূল শাখাটি পরীক্ষা করুন।

    git checkout <branch>

  7. আপনি রাখতে চান মূল প্রতিশ্রুতি পুনরায় সেট করুন।

    git reset --soft <sha1>

  8. নতুন টিএমপি 1 শাখার উপর ভিত্তি করে এই শাখাটি রিবেস করুন।

    git rebase tmp1

  9. এটি হ'ল - আপনি সমস্ত কিছু ঠিকঠাক নিশ্চিত হওয়ার পরে অস্থায়ী tmp1 শাখাটি মুছুন।


0

এই প্রক্রিয়াটিকে আরও সহজ করতে আপনি তৈরি করা সরঞ্জামটি ব্যবহার করতে পারেন: গিট-স্কোয়াশ । উদাহরণস্বরূপ, মাস্টার শাখা থেকে ব্রাঞ্চ করা বৈশিষ্ট্য শাখায় সমস্ত কমান্ড স্কোয়াশের জন্য লিখুন:

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