গিটের অন্য একটি শাখায় 'মার্জ' না করে আমি কীভাবে 'ওভাররাইট' করব?


257

আমার দুটি শাখা আছে, emailএবং stagingstagingসর্বশেষতমটি এবং আমার আর emailশাখায় পুরানো পরিবর্তনগুলির প্রয়োজন নেই , তবুও আমি সেগুলি মুছতে চাই না।

তাই আমি ঠিক সব বিষয়বস্তু ডাম্প করতে চান stagingমধ্যে email, যাতে তারা একই উভয় বিন্দু কমিট পারে। এটা কি সম্ভব?


উত্তর:


196

আপনি 'আমাদের' মার্জ কৌশলটি ব্যবহার করতে পারেন:

$ git checkout staging
$ git merge -s ours email # Merge branches, but use our branch head

26
আমি এটি চেষ্টা করেছিলাম, এবং এটি আমার কাছে পিছনে বলে মনে হচ্ছে? এটি কি ইমেলের বিষয়বস্তুগুলিকে মঞ্চায়িত করে না এবং অন্যভাবে করে না?
সর্বাধিক

27
@ ম্যাক্সে আমারও একই বিভ্রান্তি ছিল এবং এটি আমাকে অনেক ঝামেলার কারণ করেছিল। আপনার এই কমান্ডটি নতুন শাখা (মঞ্চায়ন) থেকে করা দরকার এবং তারপরে আপনার পুরানো শাখায় (ইমেল) একটি সাধারণ মার্জ / পিআর করুন।
মিঃগ্লাস

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

4
git rebase -s theirs <oldbranc> <newbranch> পাশাপাশি কাজ করে (আপনি কোন শাখারই হন না)। মনে রাখবেন যে রিবেসে 'ওদের' আসলে নতুন ব্র্যাঞ্চ কারণ 'আমাদের' প্রধান হ'ল আমরা বর্তমানে চুক্তিগুলি প্রয়োগ করছি।
রল্ফ

4
@ রোল্ফ: তবে রিবাজে একত্রিত হওয়ার তথ্য থেকে মুক্তি পাওয়া যাবে এবং ইতিহাসকে সমতল করবে। অগত্যা আপনি পরে যা করছেন। আপনি যদি ইতিমধ্যে প্রকাশিত ইতিহাস নিয়ে কাজ করছেন তবে এটিও ভাল ধারণা নয়।
নিটল

99

আপনি যদি কেবল দুটি শাখা 'ইমেল' এবং 'স্টেজিং' একই হতে চান তবে আপনি 'ইমেল' শাখা ট্যাগ করতে পারেন, তারপরে 'ইমেল' শাখাকে 'স্টেজেজিং'তে পুনরায় সেট করুন:

$ git checkout email
$ git tag old-email-branch
$ git reset --hard staging

আপনি 'ইমেল' শাখায় 'স্টেজিং' শাখাটিও পুনরায় চালু করতে পারেন। তবে ফলাফলটিতে দুটি শাখার সংশোধন থাকবে।


1
আপনি সম্ভবত বলতে চাইছেন git checkout, git checkআমার জ্ঞানের অস্তিত্ব নেই
নিটল

4
আপনি ঠিক বলেছেন, গিট কমান্ডটি সম্পূর্ণ করার জন্য আমি এতটাই অভ্যস্ত হয়েছি যে আমি "গিট চেকআউট" লিখতে সর্বদা "গিট চেক <ট্যাব>" লিখি! সংশোধন।
সিলভাইন ডিফ্রেসনে

16
গিট রিসেট আপনার রেপো ক্লোন করে রেখেছে এমন অন্যান্য ব্যক্তির রেপো ভেঙে দেয়
জিওফ্রে ডি স্মেট

আমি বিশ্বাস করি এটিই সঠিক উত্তর। emailশাখার মাথাটি কেবল একই মাথাটির দিকে নির্দেশ করা উচিত stagingএবং তাদের উভয়ের একই কমিট, একই ইতিহাস থাকবে।
সিসেরোক্যামারগো

76

আমি বেশ কয়েকটি উত্তর দেখেছি এবং এটাই একমাত্র প্রক্রিয়া যা আমাকে কোনও দ্বন্দ্ব ছাড়াই এটি ঠিক করতে দেয়।

আপনি যদি শাখা_লোক থেকে নতুন_আর সমস্ত পরিবর্তন চান, তবে:

git checkout branch_new
git merge -s ours branch_old
git checkout branch_old
git merge branch_new

একবারে এই চারটি কমান্ড প্রয়োগ করে আপনি কোনও সমস্যা ছাড়াই ব্রাঞ্চ_ল্ডকে চাপ দিতে পারেন can


5
আপনার উত্তরটি আমার ইস্যুটি সর্বোত্তমভাবে ফিট করে কারণ আমি হেডটি পুনরায় সেট করতে চাইনি, কেবল পুরানোটির মধ্যে জিনিসগুলি মার্জ করার সময় নতুন শাখায় নতুন ফাইলগুলির জন্য একটি অগ্রাধিকার উল্লেখ করুন এবং ইস্যু ছাড়াই কাজ করেছেন! +1
চুলা 21

"আমাদের একীভূত হওয়ার" পরে আমি আমার শাখা_কে নতুনকে রিমোটে ঠেকিয়েছি এবং এই পদ্ধতিটি আমার পক্ষে কাজ করেছে। আমার কি ধাক্কা দেওয়া দরকার ছিল? বা এটি ছাড়া কাজ করতে হবে? (এটি স্থানীয় শাখা বা রিমোট ব্যবহার করবে কিনা তা নিশ্চিত ছিল না)। ধন্যবাদ!
aspergillusOryzae 11'16

আপনি কেবল নীচেরটি করতে পারবেন না কেন? Git চেকআউট branch_old Git একত্রীকরণ -s তাহাদেরই branch_new সুরুক থেকে নেওয়া stackoverflow.com/questions/14275856/...
Ripu দমন

এটি বলে, মার্জ কৌশল 'তাদের' খুঁজে পেল না।
arango_86

আমার জন্য নিখুঁতভাবে কাজ করে, কিছু পুনর্বিবেচনা না করার সুবিধা রয়েছে
রোমেন

68

অন্যান্য উত্তরগুলি আমাকে সঠিক সংকেত দিয়েছে, কিন্তু তারা সম্পূর্ণরূপে সহায়তা করে নি।

আমার জন্য যা কাজ করেছে তা এখানে:

$ git checkout email
$ git tag old-email-branch # This is optional
$ git reset --hard staging
$
$ # Using a custom commit message for the merge below
$ git merge -m 'Merge -s our where _ours_ is the branch staging' -s ours origin/email
$ git push origin email

আমাদের কৌশলটির সাথে একত্রিত হওয়ার চতুর্থ পদক্ষেপ ব্যতীত, পুশটিকে একটি দ্রুত-অগ্রগতির আপডেট হিসাবে বিবেচনা করা হয় এবং এটি (গিটহাব দ্বারা) প্রত্যাখ্যাত হবে।


এটি মার্জ-কমিট বার্তাটিকে ভুল করে তোলে, তবে হ্যাঁ, এটি দুর্দান্ত কাজ করে।
cdunn2001

cdunn2001, আমি কৌতূহলী। আপনি যে মার্জ-কমিট বার্তাটি প্রত্যাশা করেছিলেন তা কী ছিল এবং কীভাবে এটি এতে গণ্ডগোল পেয়েছে?
শ্যাম হাবারকদা

এটিতে "রিমোট-ট্র্যাকিং শাখা 'উত্স / ইমেল' ইমেলের মধ্যে মার্জ করুন" বলে says এটি মঞ্চের কথা উল্লেখ করে না। যদিও কোন বড় ব্যাপার। কেবল প্রতিশ্রুতি সংশোধন করুন, বা ব্যবহার করুন merge -m 'This is not my beautiful house.' -s ours origin/email
cdunn2001

@ শ্যামহবরকদা, আপনি যেমনটি বলছেন তেমনই করি, এবং দ্রুত-অগ্রসর না হওয়া আপডেট সম্পর্কে আমার সমস্যা হয়। কারণ আমি যখন চতুর্থ ধাপটি করি তখন কিছুই হয় না।
kommradHomer

চতুর্থ পদক্ষেপের জন্য আপনার উত্স / ইমেল ব্যবহার করা দরকার, এটি কেবল স্থানীয় ইমেলের সাথে কাজ করে না।
ট্র্যাভিস রেডার

45

আপনি যদি আমার মতো হন এবং আপনি মার্জিংয়ের বিষয়ে ডিল করতে না চান, আপনি মার্জ করার পরিবর্তে বল প্রয়োগ ছাড়া উপরের পদক্ষেপগুলি করতে পারেন, কারণ এটি একটি বিভ্রান্তিকর লগ পেপার ট্রেইল তৈরি করবে:

git checkout email
git reset --hard staging
git push origin email --force

দ্রষ্টব্য: এটি কেবলমাত্র যদি আপনি সত্যিই আর কোনও ইমেইলে জিনিসটি দেখতে না চান is


1
পদক্ষেপ 2 বাম শাখাটি সরানোর সাথে সাথে গিট পুশ অরিজিন ইমেল - আমার পক্ষে কাজ করেনি।
পদক্ষেপ

2
এটি ঠিক একই প্রশ্নে জিজ্ঞাসা করা হয়েছিল - "মার্জ করার পরিবর্তে কীভাবে ওভাররাইট করা যায়"। উত্তর গ্রহণ করা উচিত।
জোজলগুলি

17

আমি দুটি শাখা মার্জ করতে চেয়েছিলাম যাতে সমস্ত old_branchবিষয়বস্তু থেকে সামগ্রীর সাথে আপডেট হওয়া যায়new_branch

আমার জন্য এটি একটি কবজির মতো কাজ করেছে:

$ git checkout new_branch
$ git merge -m 'merge message' -s ours origin/old_branch
$ git checkout old_branch
$ git merge new_branch
$ git push origin old_branch

10

কেমন:

git branch -D email
git checkout staging
git checkout -b email
git push origin email --force-with-lease

@ এমপটিওয়ালস কারণ এটি ব্যবহারকারীকে সতর্ক না করে একটি জোর চাপায় যে এটি সার্ভার দ্বারা প্রত্যাখ্যাত হতে পারে, বা এটি কেন প্রয়োজন তাও ব্যাখ্যা করে না। এটি বলেছিল, এটি ওয়ান-ডেভেলপার-প্রকল্পের জন্য একটি কার্যকর বিকল্প
ডেভিড কোস্টা

@ ডেভিডকোস্টা সার্ভারের দ্বারা কেন এই প্রত্যাখাত হবে? এটি একটি সাধারণ মুছুন ইমেল শাখা এবং ইমেলটিতে স্টেজিংয়ের অনুলিপি করুন ... সুতরাং আমি কেবল 'স্টেজিং' এর সমস্ত বিষয়বস্তুকে 'ইমেল' এ ফেলে দিতে চাই যাতে তারা উভয়ই একই প্রতিশ্রুতিতে নির্দেশ করে '- ঠিক এটিই ঘটছে - এখানে.
আরেক এস

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

1
আমি মূলটি সম্পাদনা করেছি - ফোর্স থেকে --ফোর্স-সহ - ইজারা, এটি কৌশলটি অ-ধ্বংসাত্মক উপায়ে করে।
ফ্রেন্ড্রয়েড

1
আপনি যদি কেবল একটি শাখা ফেলে দিতে চান এবং উত্স শাখা থেকে পরিষ্কার শুরু করতে চান তবে এটি সেরা উপায়।
শেন

6

অন্যান্য উত্তরগুলি অসম্পূর্ণ দেখাচ্ছে।
আমি নীচে সম্পূর্ণ চেষ্টা করেছি, এবং এটি দুর্দান্ত কাজ করেছে।

দ্রষ্টব্য:
1. নিরাপদ দিকে থাকতে নীচে চেষ্টা করার আগে আপনার ভাণ্ডারটির একটি অনুলিপি তৈরি করুন।

বিবরণ:
১. সমস্ত বিকাশ দেব শাখায় ঘটে
q.কিউ শাখাটি দেবের একই কপি
৩ Time সময়ে সময়ে, দেব কোডটি QA শাখায় সরানো / ওভাররাইট করা দরকার

সুতরাং আমাদের ডিএ শাখা থেকে কিউ শাখাটি ওভাররাইট করা দরকার

পর্ব 1:
নীচের কমান্ডগুলির সাথে, পুরানো qa নতুন দেবকে আপডেট করা হয়েছে:

git checkout dev
git merge -s ours qa
git checkout qa
git merge dev
git push

শেষ ধাক্কার জন্য স্বয়ংক্রিয় মন্তব্য নীচে দেয়:

// Output:
//  *<MYNAME> Merge branch 'qa' into dev,*  

এই মন্তব্যটি বিপরীত দেখাচ্ছে, কারণ উপরের ক্রমটিও বিপরীত দেখায়

অংশ ২:

নীচে অপ্রত্যাশিত, নতুন স্থানীয় প্রতিশ্রুতিবদ্ধ হয়, অপ্রয়োজনীয়গুলি
তাই, আমাদের ফেলে দেওয়া উচিত, এবং দেবকে ছোঁয়াতে হবে।

git checkout dev

// Output:
//  Switched to branch 'dev'  
//  Your branch is ahead of 'origin/dev' by 15 commits.  
//  (use "git push" to publish your local commits)


git reset --hard origin/dev  

//  Now we threw away the unexpected commits

পার্ট 3:
যা যা প্রত্যাশা করা হয়েছে তা যাচাই করুন:

git status  

// Output:
//  *On branch dev  
//  Your branch is up-to-date with 'origin/dev'.  
//  nothing to commit, working tree clean*  

এখানেই শেষ.
1. পুরানো কএএ এখন নতুন দেব শাখা কোড দ্বারা ওভাররাইট করা হয়েছে
2. স্থানীয় পরিষ্কার (দূরবর্তী উত্স / দেব অনুচ্ছন্ন)


6

এটি করার সহজতম উপায়:

//the branch you want to overwrite
git checkout email 

//reset to the new branch
git reset --hard origin/staging

// push to remote
git push -f

এখন ইমেল শাখা এবং মঞ্চটি একই রকম।


2
সতর্কতা: এটি emailশাখার সমস্ত কমান্ড মুছে ফেলে । এটি emailশাখাটি মুছে ফেলার এবং শাখার মাথায় নতুন করে তৈরি করার মতো staging
ক্যামেরন হাডসন

2
git checkout email
git merge -m "Making email same as staging disregarding any conflicts from email in the process" -s recursive -X theirs staging

1
কমান্ডটিতে মার্জ করা মন্তব্য থেকে মন্তব্যটি আলাদা করা হলে এই উত্তরটি আমার কাছে আরও পরিষ্কার হয়ে যেত। সংক্ষিপ্তভাবে ব্যাখ্যা করুন -X কী করে এবং কীভাবে এটি এই মার্জটিকে প্রভাবিত করে। ধন্যবাদ যদিও. আমাকে এটি সন্ধান
করিয়েছে

@ নেলিকাস মন্তব্যটির জন্য ধন্যবাদ এবং আপনি ঠিক বলেছেন। আমি ভবিষ্যতে উত্তরটি সম্পাদনা করতে পারি।
উইলা

0

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

git checkout new -b tmp
git merge -s ours old -m 'irrelevant'
git checkout old
git merge --squash tmp
git branch -D tmp
#do any other stuff you want
git add -A; git commit -m 'foo' #commit (or however you like)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.