একক প্রতিশ্রুতি হিসাবে অন্য শাখা থেকে সমস্ত পরিবর্তন মার্জ (স্কোয়াশ সহ)


479

গিট-এ, সমস্ত পরিবর্তনগুলি একটি শাখা থেকে অন্য শাখায় মার্জ করার কোনও উপায় আছে, তবে একই সময়ে স্কোয়াশ একটি একক প্রতিশ্রুতিতে?

আমি প্রায়শই একটি পৃথক শাখায় একটি নতুন বৈশিষ্ট্য নিয়ে কাজ করি এবং নিয়মিত প্রতিশ্রুতিবদ্ধ / ধাক্কা দেব - প্রধানত ব্যাকআপের জন্য বা আমি অন্য যন্ত্রে যা কাজ করছি তা স্থানান্তর করার জন্য। বেশিরভাগই এই কমিটিগুলি "ফিচার এক্সএক্সএক্সএক্স ডাব্লুআইপি" বা অপ্রয়োজনীয় কিছু বলে।

এই কাজটি শেষ হয়ে গেলে এবং আমি ডাব্লুআইপি শাখাকে আবার মাস্টার হিসাবে একীভূত করতে চাই, আমি এই সমস্ত মধ্যবর্তী কমিটগুলি বাতিল করতে চাই এবং কেবল একটির একটি পরিষ্কার প্রতিশ্রুতি আছে।

এটি করার কোনও সহজ উপায় আছে?

বিকল্পভাবে, যে কমান্ডটি যে শাখাগুলি যেখানে শাখা করা হয়েছিল সেখান থেকে সমস্ত শাখা-প্রশাখা কমিট করে কীভাবে?

উত্তর:


600

অন্য বিকল্পটি হ'ল git merge --squash <feature branch>অবশেষে একটি করুন git commit

গিট মার্জ থেকে

--squash

--no-squash

কার্যকারী বৃক্ষ এবং সূচকের অবস্থা উত্পন্ন করুন যেমন একটি আসল সংশ্লেষ ঘটে (একীভূত তথ্য ব্যতীত) তবে বাস্তবে কোন প্রতিশ্রুতিবদ্ধ বা সরিয়ে না নেওয়া বা পরবর্তী কমান্ডটি সংযুক্তির প্রতিশ্রুতি তৈরির কারণ হিসাবে HEADরেকর্ড $GIT_DIR/MERGE_HEADকরে git commitনা। এটি আপনাকে বর্তমান শাখার উপরে একটি একক প্রতিশ্রুতি তৈরি করতে দেয় যার প্রভাব অন্য শাখাটি মার্জ করার মতো (বা অক্টোপাসের ক্ষেত্রে আরও বেশি)।


1
দুর্দান্ত বৈশিষ্ট্য! আমি গিট ভালবাসি। ভবিষ্যতে আমি এখন অবশ্যই এটি ব্যবহার করব, আমি এখনও রিবেস -i এর আপনার উপায় সম্পর্কে জানতে পরামর্শ দেব। এটি যদি আপনি সত্যিই কেবল একটি প্রতিশ্রুতিবদ্ধতার চেয়ে আরও বেশি কিছু তৈরি করতে চান না তবে এটি দক্ষ দক্ষতা।
উইল বক

4
সাবধানতার একটি শব্দ: এটি কাজ করে তবে ডিফল্ট প্রতিশ্রুতি বার্তায় শাখার লগটি মার্জ হয়ে থাকে includes সমস্যাটি হ'ল এটি সাধারণভাবে দেখা যায় এমন ফর্ম্যাটটির সাথে একই রকম দেখায় যেখানে দেখানো পুরো পাঠ্যটি আসলে প্রতিশ্রুতি বার্তার অংশ হয় না, তবে এই ক্ষেত্রে এটি হয় does সুতরাং আপনি যদি সেগুলি না চান তবে আপনাকে নিজের প্রতিশ্রুতি বার্তা থেকে ম্যানুয়ালি এগুলি সরাতে হবে। এটি ব্যবহার করার আগে আমার এটি পরীক্ষা করা উচিত ছিল ...
এখনও_ড্রিমিং_1

23
এটি এবং, সতর্ক করে দেওয়া হবে যে শাখাটি মার্জ হওয়া হিসাবে দেখা যাবে না। stackoverflow.com/questions/19308790/…
রায়ান

3
আইএমএইচও এটি বলা উচিত ছিলrebase --squash
অ্যান্ডি

সুতরাং (যেহেতু এটি প্রকৃতপক্ষে বৈশিষ্ট্য শাখাকে একীভূত করে না) যদি আপনি প্রতিশ্রুতিবদ্ধ হওয়ার পরে বৈশিষ্ট্য শাখাটি মুছে ফেলতে যাচ্ছেন তবে এটি উপযুক্ত হবে। এটা কি ঠিক? (আমি গিটার বিশেষজ্ঞ নই)
অ্যান্ড্রু স্পেন্সার

214

খুঁজে পেয়েছি! মার্জ কমান্ডের একটি --squashবিকল্প রয়েছে

git checkout master
git merge --squash WIP

এই মুহুর্তে সবকিছু মার্জড, সম্ভবত দ্বন্দ্বযুক্ত, তবে প্রতিশ্রুতিবদ্ধ নয়। সুতরাং আমি এখন করতে পারেন:

git add .
git commit -m "Merged WIP"

2
কি করে git add .?
মাইকেল পটার

1
@ মিশেলপোটার এটি সমস্ত ফাইল এবং পরিবর্তন যুক্ত করে
দক্ষিণ শাহ

2
git add .বর্তমান ডিরেক্টরিতে সমস্ত অ-উপেক্ষা করা ফাইল যুক্ত করুন, আমি এইভাবে অযৌক্তিকর ফাইলগুলি বাছাই থেকে সতর্ক থাকব।
জেক কোব

7
git add .আপনার বিকল্প হিসাবে git add -uআপনি কেবলমাত্র গাছগুলিতে যুক্ত হওয়া ফাইল যুক্ত করতে ব্যবহার করতে পারেন ।
ব্র্যান্ডন ওগল

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

30

git rebase -i masterআপনার বৈশিষ্ট্য শাখায় চেষ্টা করুন। তারপরে কমিটগুলি একত্রিত করতে আপনি একটি 'বাছাই' ব্যতীত 'স্কোয়াশ' এ সমস্ত পরিবর্তন করতে পারেন। পুনর্বাসনের সাথে স্কোয়াশিং কমিটগুলি দেখুন

অবশেষে, আপনি তার পরে মাস্টার শাখা থেকে মার্জ করতে পারেন।


8
হ্যাঁ এটি কার্যকর, তবে আমি ইন্টারেক্টিভ রিবেসের ঝামেলা চাই না। আমি শাখা সমতল হওয়ার পর থেকে সবকিছুই চাই।
ব্র্যাড রবিনসন

2
+1 এটি একটি পরিষ্কার ইতিহাস তৈরি করে। স্বতন্ত্র প্যাচ, কার্ড, গল্প ইত্যাদি হিসাবে কমিটগুলি সনাক্ত করা এবং পরিচালনা করা অনেক সহজ
রায়ান

2

গৃহীত উত্তরের পরামর্শ git merge --squash <feature branch>হিসাবে ব্যবহার করা কৌশলটি কার্যকর করে তবে এটি মার্জ হওয়া শাখাকে বাস্তবে মার্জড হিসাবে দেখাবে না।

সুতরাং একটি আরও ভাল সমাধান হ'ল:

  • সর্বশেষ মাস্টার থেকে একটি নতুন শাখা তৈরি করুন
  • <feature branch>উপরের ব্যবহার করে মার্জ করুনgit merge --squash
  • সদ্য নির্মিত শাখাটি মাস্টারে মার্জ করুন

এই উইকি পদ্ধতি বিস্তারিতভাবে ব্যাখ্যা করে।


0

এটি করার জন্য আমি আমার নিজের গিট ওরফে তৈরি করেছি। আমি ফোন করছিgit freebase ! এটি আপনার বিদ্যমান অগোছালো, অপ্রতিরোধ্য বৈশিষ্ট্যযুক্ত শাখা গ্রহণ করবে এবং এটি পুনরায় তৈরি করবে যাতে এটি একই নামে একটি নতুন শাখা হয়ে যায় যার কমিটগুলি একটি কমিটের সাথে স্কোয়াশ করে আপনি যে শাখায় নির্দিষ্ট করে থাকেন (ডিফল্টরূপে মাস্টার) তা পুনরায় সেট করা হয়। একেবারে শেষের দিকে, এটি আপনাকে আপনার নতুন "ফ্রি বেসড" শাখার জন্য যা কিছু প্রতিশ্রুতি বার্তা পছন্দ করবে তা ব্যবহার করার অনুমতি দেবে।

আপনার .gitconfig এ নিম্নলিখিত নামটি রেখে এটি ইনস্টল করুন:

[alias]
  freebase = "!f() { \
    TOPIC="$(git branch | grep '\\*' | cut -d ' ' -f2)"; \
    NEWBASE="${1:-master}"; \
    PREVSHA1="$(git rev-parse HEAD)"; \
    echo "Freebaseing $TOPIC onto $NEWBASE, previous sha1 was $PREVSHA1"; \
    echo "---"; \
    git reset --hard "$NEWBASE"; \
    git merge --squash "$PREVSHA1"; \
    git commit; \
  }; f"

এটি চালিয়ে আপনার বৈশিষ্ট্য শাখা থেকে ব্যবহার করুন: git freebase <new-base>

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

আমি এটি আমার ডটফিলস রেপোতে গিথুবে বজায় রাখব: https://github.com/stevecrozz/dotfiles/blob/master/.gitconfig


আনন্দের মতো কাজ করেছেন! ভাল হিসাবে আপনি কটাক্ষপাত করা হতে পারে evernote.com/shard/s52/sh/7f8f4ff1-9a68-413f-9225-c49e3ee2fafd/...
ইলিয়া Sheershoff

-1

git merge --squash <feature branch> একটি ভাল বিকল্প। "গিট কমিট" আপনাকে সমস্ত বৈশিষ্ট্য শাখার প্রতিশ্রুতি বার্তা রাখার জন্য এটি আপনার পছন্দ হিসাবে জানিয়েছে।

কম কমিটের জন্য মার্জ করুন।

গিট একীভূত করতে x বার করুন - গিট পুনরায় সেট করুন হেড ^ - তবে গিট কমিট করুন।

ঝুঁকি - মোছা ফাইলগুলি আবার ফিরে আসতে পারে।


-5

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

git checkout feature
git rebase main

রিবাজ কমান্ড "বৈশিষ্ট্য" তে সমস্ত চুক্তি পুনরায় খেলবে "মেন" সমান পিতামাতার সাথে প্রতিশ্রুতিবদ্ধ হিসাবে।

"বৈশিষ্ট্য" তৈরি হওয়ার পরে (বা অতি সাম্প্রতিক একীকরণের পরে) "মূল" পরিবর্তিত হয়ে থাকলে আপনি git merge mainআগে চালনা করতে চাইতে পারেন git rebase main। এইভাবে, যদি আপনার একত্রীকরণের বিরোধ ঘটে তবে আপনার এখনও সম্পূর্ণ ইতিহাস রয়েছে।

পুনর্বাসনের পরে, আপনি আপনার শাখাকে প্রধানতে মার্জ করতে পারেন, যার ফলে দ্রুত-ফরওয়ার্ড একীভূত হতে হবে:

git checkout main
git merge feature

একটি ভাল ওভারভিউর জন্য ধারণাগতভাবে বোঝার গিটের রিবেস পৃষ্ঠাটি দেখুন


এটি আমার পক্ষে কাজ করে না। আমি কেবলমাত্র একটি ডাব্লুআইপি শাখার সাথে একটি সাধারণ পরীক্ষার রেপো তৈরি করেছি এবং উপরেরটি দিয়ে চেষ্টা করেছি এবং একত্রীকরণ সংঘাত পেয়েছি (যদিও আমি মাস্টারটিতে কোনও পরিবর্তন আনি নি)।
ব্র্যাড রবিনসন

যদি বৈশিষ্টটি প্রধান থেকে তৈরি করা হয় (গিট চেকআউট-বি বৈশিষ্ট্য প্রধান) এবং আপনি মেইন থেকে সাম্প্রতিক
একত্রী

ঠিক আছে, আবার চেষ্টা করে দেখুন। এবার দ্বন্দ্ব পাননি, তবে ইতিহাসটি স্কোয়াশ হয়নি।
ব্র্যাড রবিনসন

গিট-মার্জ ডকুমেন্টেশনের দিকে অন্য একবার নজর দেওয়া, আপনি ঠিক বলেছেন, কিছু কমিট থাকবে। যদি আপনি "মেন" থেকে "বৈশিষ্ট্য" তে পূর্ববর্তী সংহতগুলি করে থাকেন তবে পুনরায় রিবেসগুলি তাদের কয়েকটি সরিয়ে ফেলবে তবে সমস্ত কিছু নয়।
নামশুব রাইটার

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