কেউ পুনর্বাসনা বা প্রকাশিত শাখায় পুনরায় সেট করার পরে কীভাবে পুনরুদ্ধার করব?


88

আমরা সব ইত্যাদি শুনেছি এক রি-বেসের ফলে কখনো প্রকাশিত উচিত কাজ, এটি বিপদজনক, যাইহোক, আমি কোন রেসিপি পরিস্থিতি মামলার রি-বেসের ফলে মোকাবেলা করার জন্য পোস্ট দেখা যায় না হয় প্রকাশ করেন।

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

একটি স্পষ্ট সমাধান যা আমি দেখেছি কাজ করে যদি আপনার কোনও স্থানীয় প্রতিশ্রুতি না থাকে fooএবং এটি পুনরায় সাজানো হয়:

git fetch
git checkout foo
git reset --hard origin/foo

এটি কেবল fooদূরবর্তী সংগ্রহস্থল অনুযায়ী স্থানীয় ইতিহাসের ইতিহাসের পক্ষে রাখবে।

কিন্তু কেউ যদি সেই শাখায় উল্লেখযোগ্য স্থানীয় পরিবর্তন সাধন করে থাকে তবে কীভাবে পরিস্থিতি মোকাবেলা করা যায়?


সাধারণ কেস রেসিপি জন্য +1। এটি মেশিনগুলির মধ্যে ব্যক্তিগত সিঙ্ক্রোনাইজেশনের জন্য আদর্শ, বিশেষত যদি তাদের আলাদা ওএস থাকে। এটি ম্যানুয়ালটিতে উল্লেখ করা উচিত এমন কিছু।
ফিলিপ ওকলি

ব্যক্তিগত সিঙ্ক্রোনাইজেশন জন্য আদর্শ রেসিপি হয় git pull --rebase && git push। আপনি যদি masterকেবলমাত্র কাজ করে থাকেন, তবে আপনি অন্যদিকে প্রান্তিক হয়েছেন এবং ঠেলাঠেলি করে থাকলেও এটি খুব অবিশ্বাস্যরূপে আপনার পক্ষে সঠিক কাজ করবে।
অ্যারিস্টটল পাগাল্টজিস

কারণ আমি একটি পিসি এবং লিনাক্স মেশিনের মধ্যে সিঙ্ক্রোনাইজ করছি এবং বিকাশ করছি আমি দেখতে পাচ্ছি যে প্রতিটি রিবাজে / আপডেটের জন্য একটি নতুন শাখা ব্যবহার করা ভাল কাজ করে। আমিও বৈকল্পিক ব্যবহার git reset --hard @{upstream}এখন আমি যে জাদু refspec জাদুমন্ত্রোচ্চারণ জানি যে "ভুলে আমি কি আছে / ছিল, ব্যবহার আমি থেকে আমরা কী সংগৃহীত দূরবর্তী" আমার চূড়ান্ত মন্তব্য দেখুন stackoverflow.com/a/15284176/717355
ফিলিপ Oakley,

আপনি গিট ২.০ এর সাহায্যে আপনার শাখার পুরাতন উত্স জানতে পারবেন (উজানের শাখাটি একটি দিয়ে পুনরায় লেখার আগে push -f): আমার উত্তর নীচে দেখুন
ভোনসি

উত্তর:


75

পুশ রিবেসের পরে সিঙ্কে ফিরে আসা সত্যিই বেশিরভাগ ক্ষেত্রে জটিল নয়।

git checkout foo
git branch old-foo origin/foo # BEFORE fetching!!
git fetch
git rebase --onto origin/foo old-foo foo
git branch -D old-foo

অর্থাৎ। প্রথমে আপনি যেখানে রিমোট শাখাটি ছিল সেখানে মূলত একটি বুকমার্ক সেট আপ করুন, তারপরে আপনি সেটিকে আপনার স্থানীয় কমিটগুলি সেই স্থান থেকে রিবেসড রিমোট শাখায় পুনরায় খেলতে ব্যবহার করুন।

ছাড় দেওয়া হিংসার মতো: এটি যদি আপনার সমস্যার সমাধান না করে তবে আপনার আরও কিছু দরকার। ☺

আপনি অবশ্যই প্রাক-রিবেস origin/fooকমিট আইডিটি সন্ধান করেন এবং এটি ব্যবহার করে অবশ্যই বুকমার্ক ছাড়াই এটি করতে পারেন ।

আপনি যে পরিস্থিতিটি আনার আগে বুকমার্ক তৈরি করতে ভুলে গিয়েছিলেন সেই পরিস্থিতি নিয়ে এটিই আপনি কীভাবে व्यवहार করেন। কিছুই হারিয়ে যায় না - আপনাকে কেবল দূরবর্তী শাখার জন্য রিফ্লগটি পরীক্ষা করতে হবে:

git reflog show origin/foo | awk '
    PRINT_NEXT==1 { print $1; exit }
    /fetch: forced-update/ { PRINT_NEXT=1 }'

এটি সেই প্রতিশ্রুতিবদ্ধ আইডি মুদ্রণ করবে origin/fooযা তার ইতিহাস পরিবর্তন করে এমন সাম্প্রতিকতম আনার আগে নির্দেশ করেছিল।

আপনি তারপর সহজভাবে করতে পারেন

git rebase --onto origin/foo $commit foo

11
তাত্ক্ষণিক দ্রষ্টব্য: আমি মনে করি এটি বেশ স্বজ্ঞাত, তবে আপনি যদি জঘন্যভাবে ভাল জানেন না ... যে ওয়ান-লাইনারটি git reflog show origin/foo"আনতে হবে: জোর করে আপডেট" বলে প্রথম লাইনের সন্ধানের জন্য কেবল সন্ধান করছে ; এটাই গিট রেকর্ড করে যখন কোনও আনার ফলে দূরবর্তী শাখাকে দ্রুত-অগ্রিম ব্যতীত অন্য কিছু করতে দেয়। (আপনি এটি হাতে হাতেও করতে পেরেছিলেন - জোর করে আপডেট সম্ভবত সাম্প্রতিকতম জিনিস))
ক্যাসাবেল

4
এটি হিংসার মতো কিছুই নয়। সহিংসতা মাঝেমধ্যে মজাদার
আইলো

4
@ আইওলো সত্য, মুক্তি দেওয়া সবসময় মজাদার।
ড্যান বেচার্ড

4
সহিংসতার মতো, প্রায় সর্বদা মুক্তি দেওয়া এড়ানো। তবে কীভাবে হয় তার একটি সূত্র আছে।
বব স্টেইন

4
ঠিক আছে, কোনও রিবেস ঠেলে এড়িয়ে চলুন যেখানে অন্যরা ক্ষতিগ্রস্থ হবে।
অ্যারিস্টটল পাগাল্টজিস

11

আমি বলব গিট-রিবেস ম্যান পৃষ্ঠার উজানের রিবাইজ বিভাগটি থেকে পুনরুদ্ধার এই সমস্ত কিছুই কভার করে।

এটি আপনার নিজের রিবেস থেকে পুনরুদ্ধার থেকে আসলেই আলাদা নয় - আপনি একটি শাখা সরিয়ে নিয়েছেন এবং তাদের ইতিহাসে থাকা সমস্ত শাখাটিকে তার নতুন অবস্থানে ফিরিয়ে দিন।


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

4
@ অ্যারিস্টটল: আপনি ঠিক বলেছেন যে এটি খুব পরিচালনাযোগ্য, সমস্ত বিকাশকারী কীভাবে গিট ব্যবহার করতে জানেন এবং আপনি কার্যকরভাবে সমস্ত বিকাশকারীদের সাথে যোগাযোগ করতে পারেন তা প্রদত্ত। নিখুঁত বিশ্বে, গল্পটির এটিই শেষ হবে। তবে অনেকগুলি প্রকল্প রয়েছে যে একটি প্রবাহের রিবেস সত্যিই একটি ভীতিজনক বিষয়। (এবং তারপরে আমার কর্মক্ষেত্রের মতো জায়গাগুলি রয়েছে, যেখানে বেশিরভাগ বিকাশকারী এমনকি কোনও পুনর্বাসনের কথাও শোনেনি )) আমি মনে করি "কুসংস্কার" নিরাপদ, সর্বাধিক জেনেরিক পরামর্শ দেওয়া কেবলমাত্র একটি উপায়। যে কারও রেপোতে বিপর্যয় ঘটায় সে কেউ হতে চায় না।
ক্যাসাবেল

4
হ্যাঁ, আমি উদ্দেশ্যটি বুঝতে পারি। এবং আমি এটির সাথে পুরোপুরি একমত তবে এর মধ্যে একটি পার্থক্য রয়েছে যে "আপনি যদি পরিণতি বুঝতে না পারেন তবে এটি চেষ্টা করবেন না" এবং "আপনারা কখনই এটি করা উচিত নয় কারণ এটি মন্দ", এবং এটিই আমি একা ইস্যু করি। ভয় জাগানোর চেয়ে নির্দেশ দেওয়া সর্বদা ভাল better
অ্যারিস্টটল পাগাল্টজিস

@ অ্যারিস্টটল: একমত আমি "আপনি কী করছেন তা নিশ্চিত হয়েই" শেষের দিকে ঝুঁকতে চেষ্টা করি, তবে বিশেষত অনলাইনে, আমি এটিকে পর্যাপ্ত পরিমাণে ওজন দেওয়ার চেষ্টা করি যাতে গুগলের কোনও নৈমিত্তিক দর্শক নোট নিতে পারে। আপনি ঠিক বলেছেন, এর অনেকটাই সম্ভবত নিচে নামানো উচিত।
ক্যাস্যাবেল

11

Git থেকে শুরু করে 1.9 / 2.0 চতুর্থাংশ 1 2014, আপনি পুনর্লিখিত মূল প্রজেক্টের শাখা তে এটি rebasing আগে আপনার পূর্ববর্তী শাখা মূল চিহ্নিত করতে, বর্ণনা অনুযায়ী থাকবে না অ্যারিস্টট্ল Pagaltzis এর উত্তর :
দেখুন কমিট 07d406b এবং d96855f কমিট :

এর topicসাথে তৈরি শাখায় কাজ করার পরে git checkout -b topic origin/master, রিমোট-ট্র্যাকিং শাখার origin/masterইতিহাসটি পুনর্নির্মাণ এবং পুনর্নির্মাণ করা হতে পারে যা এই আকারের ইতিহাসের দিকে পরিচালিত করে:

                   o---B1
                  /
  ---o---o---B2--o---o---o---B (origin/master)
          \
           B3
            \
             Derived (topic)

যেখানে origin/masterকরে এ বিন্দু ব্যবহৃত B3, B2, B1এবং এখন এটা পয়েন্ট B, এবং আপনারtopic তা ব্যাক যখন শাখা উপরে শুরু হয়েছিল origin/masterছিল B3

এই মোডটি কাঁটাচামড়া পয়েন্ট হিসাবে সন্ধান origin/masterকরতে রিফ্লগ ব্যবহার করে B3, যাতে topicআপডেটের উপরে পুনরায় স্থাপন করা যায়origin/master :

$ fork_point=$(git merge-base --fork-point origin/master topic)
$ git rebase --onto origin/master $fork_point topic

এজন্য git merge-baseকমান্ডের একটি নতুন বিকল্প রয়েছে:

--fork-point::

<commit>অন্য একটি শাখা (বা কোনও রেফারেন্স) থেকে কোন শাখা (বা কোনও ইতিহাস যা নেতৃত্ব দেয় ) বিন্দুটি সন্ধান করুন <ref>
এটি কেবল দুটি প্রতিশ্রুতিগুলির সাধারণ পূর্বপুরুষের সন্ধান করে না, বরং ইতিহাসটি শাখার পূর্বের অবতার থেকে চিহ্নিত হয়েছিল কিনা তা দেখার জন্য পুনর্বিবেচনার বিষয়টিও বিবেচনা করে<ref><commit><ref>


দ্য "git pull --rebase "কমান্ডটি base" বেস "যে মামলায় মোকাবেলা করার জন্য শাখার কাজ ভিত্তিক ছিল " "শাখার (সাধারণত একটি দূরবর্তী ট্র্যাকিং শাখা) এর রিলগ এন্ট্রি ব্যবহার করে শাখার কাঁটাচামচটি পুনরায় প্রত্যাখ্যান করা হয় শাখাটি পুনর্নির্মাণ এবং পুনর্নির্মাণ করা হয়েছে।

উদাহরণস্বরূপ, যদি ইতিহাসটি এমন দেখায় যেখানে:

  • " base" শাখার বর্তমান টিপটি এখানে রয়েছে Bতবে পূর্বে আনতে হবে যে এর টিপটি ব্যবহৃত হতB3 এবং তারপর B2এবং তারপর B1 , বর্তমান চাওয়ার কমিট আগে ও
  • শাখাটি সর্বশেষ "বেস" এর শীর্ষে পুনর্বাসিত হচ্ছে প্রতিশ্রুতি ভিত্তিতে B3 ,

এটা খোঁজ করে B3এর "আউটপুট চোখ বুলিয়ে git rev-list --reflog base" (অর্থাত B, B1,B2 , B3) পর্যন্ত এটি খুঁজে বের করে একটি কমিট যা বর্তমান অগ্রভাগের একটি পূর্বপুরুষ হল " Derived (topic)"।

অভ্যন্তরীণভাবে, আমাদের কাছে get_merge_bases_many()এটি একসাথে গুনতে পারে।
আমরা এর মধ্যে একটি মার্জ-বেস Derivedএবং একটি কল্পিত মার্জ কমিট চাই যা " base (origin/master)" এর সমস্ত tipsতিহাসিক টিপসকে মার্জ করার ফলে তৈরি হবে ।
যখন এই ধরনের প্রতিশ্রুতি উপস্থিত থাকে, আমাদের একটি একক ফলাফল পাওয়া উচিত, যা " base" এর একটি রিফ্লগ এন্ট্রিগুলির সাথে ঠিক মেলে ।


গিট 2.1 (Q3 2014) এই বৈশিষ্ট্যটিকে আরও শক্তিশালী করে তুলবে : জন কিপিং দ্বারা প্রতিশ্রুতিবদ্ধ 1e0 ড্যাকড দেখুন ( johnkeeping)

আমাদের নিম্নোক্ত টোপোলজি রয়েছে এমন দৃশ্যটি সঠিকভাবে পরিচালনা করুন:

    C --- D --- E  <- dev
   /
  B  <- master@{1}
 /
o --- B' --- C* --- D*  <- master

কোথায়:

  • B'এটির একটি নির্দিষ্ট সংস্করণ Bহ'ল প্যাচ-অভিন্ন নয়B ;
  • C*এবং D*প্যাচ-অভিন্ন CএবংD যথাযথভাবে এবং যথাক্রমে যদি ভুল ক্রমে প্রয়োগ করা হয় তবে টেক্সটিকভাবে সংঘাত হয়;
  • E পাঠ্য উপর নির্ভর করে D

সঠিক ফলাফলের git rebase master devঅর্থাৎ Bএর কাঁটাচামচ দফা হিসাবে চিহ্নিত করা হয় devএবং master, তাই C, D, Eকরে যে সম্মুখের দিকে গুলোতে করা প্রয়োজন হয় master; কিন্তু CDপ্যাচ-অভিন্ন সঙ্গে আছে C*এবং D*এবং তাই বাদ করা যেতে পারে, যাতে শেষ ফলাফল হল:

o --- B' --- C* --- D* --- E  <- dev

যদি কাঁটাচামড়া চিহ্নিত না করা হয়, তবে কোনও সংঘাতের Bফলাফলযুক্ত একটি শাখায় বাছাই করা B'এবং যদি প্যাচ-অভিন্ন কমিটিগুলি সঠিকভাবে সনাক্ত না করা হয় তবে (বা সমতুল্য ) সমেত Cএকটি শাখায় বাছাইয়ের ফলে সংঘাত হয় inDD*


২.২০ যুগে সি ব্যাক কমান্ডটি পুনরায় লেখার সময় " --fork-point" মোডের " git rebase" সঙ্কট ঘটেছিল, যা গিট 2.27 (কিউ 22020) দিয়ে সংশোধন করা হয়েছে।

দেখুন f08132f কমিট দ্বারা (09 ডিসেম্বর 2019) junio সি Hamano ( gitster)
(দ্বারা একীভূত junio সি Hamano - gitster- মধ্যে fb4175b কমিট , 27 মার্চ 2020)

rebase: --fork-pointরিগ্রেশন ফিক্স

সাইন-অফ-বাই: অ্যালেক্স টরোক
[জেসি: করেছে এবং অ্যালেক্সের টেস্ট ব্যবহার করেছে]
সাইন-অফ-জুন: জুনিও সি হামানো

" git rebase --fork-point master" ঠিকঠাক কাজ করত, যেমন এটি অভ্যন্তরীণভাবে "git merge-base --fork-point ঠিকঠাক " যে এটি সংক্ষিপ্ত পুনরায় নামকরণ কীভাবে পরিচালনা করতে পারে এবং অন্তর্নিহিত get_fork_point()ফাংশনটি কল করার আগে এটি সম্পূর্ণ পুনর্নবীকরণের দিকে ঝুলিয়ে রাখে ।

সিটিতে কমান্ডটি পুনরায় লেখার পরে এটি আর সত্য নয়, কারণ এর ইন্টারনাল কলটি সরাসরি করা হয়েছিল get_fork_point() লেখার সংক্ষিপ্ত রেফারাইজড না করে।

"গিট মার্জ-বেস" ব্যবহার করে "গিফ মার্জ-বেস" -র অন্তর্নিহিত get_fork_point()ফাংশনে "পুনর্নির্বাচিত যুক্তিটি দ্বি-দ্বীপকে সরান" , যাতে "গিট রিবেস" প্রয়োগের ক্ষেত্রে ফাংশনের অন্য কলার ঠিক একইরকম আচরণ করে এই প্রতিরোধ।


4
নোট করুন যে একটি গিট পুশ - ফোর্স এখন (গিট 1.8.5) আরও বিচক্ষণতার সাথে করা যেতে পারে: stackoverflow.com/a/18505634/6309
VonC
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.