ধরুন আমার কেবল স্থানীয় স্থানীয় শাখায় নিম্নলিখিত প্রতিশ্রুতিবদ্ধ ইতিহাস রয়েছে:
A -- B -- C
আমি কিভাবে ঢোকাতে একটি নতুন মধ্যবর্তী কমিট না Aএবং B?
ধরুন আমার কেবল স্থানীয় স্থানীয় শাখায় নিম্নলিখিত প্রতিশ্রুতিবদ্ধ ইতিহাস রয়েছে:
A -- B -- C
আমি কিভাবে ঢোকাতে একটি নতুন মধ্যবর্তী কমিট না Aএবং B?
উত্তর:
এটি ওপির উত্তরের চেয়ে আরও সহজ।
git rebase -i <any earlier commit>। এটি আপনার কনফিগার করা পাঠ্য সম্পাদকটিতে কমিটের একটি তালিকা প্রদর্শন করে।a1b2c3d)। আপনার সম্পাদকটিতে, সেই লাইনের জন্য, এ পরিবর্তন pickকরুন edit।a1b2c3d) নির্বাচন করেছেন এমন প্রতিশ্রুতি নিয়ে মনে হচ্ছে যেন সবেমাত্র প্রতিশ্রুতিবদ্ধ হয়েছে ।git commit( বেশিরভাগের চেয়ে পৃথক করে সংশোধন করছেন নাedit )। এটি আপনার চয়ন করা একটির পরে নতুন প্রতিশ্রুতি তৈরি করে ।git rebase --continue। এটি আপনার নতুন প্রতিশ্রুতি সঠিক জায়গায় leavingোকানো রেখে ক্রমাগত কমিটগুলি পুনরায় প্রদর্শন করে।সাবধান থাকুন যে এটি ইতিহাস পুনর্লিখন করবে এবং যে কেউ টানতে চেষ্টা করবে তাকে ভাঙবে।
A -- B -- C -- Dকাঙ্ক্ষিত পরিবর্তে হয়ে ওঠে A -- D -- B -- C।
Dযে কোনও জায়গায় কমিট হতে পারে। মনে করুন আমাদের রয়েছে A - B - Cএবং আমাদের কিছু প্রতিশ্রুতিবদ্ধ রয়েছে Dযা এমনকি এই শাখায় নেই। আমরা এর এসএএ জানি তবে আমরা এটি করতে পারি git rebase -i HEAD~3। এখন Aএবং B pickরেখার মধ্যে, আমরা একটি নতুন pick লাইন সন্নিবেশ করলাম যা বলছে pick SHA, পছন্দসই হ্যাশ প্রদান করে D। এটি পূর্ণ হ্যাশ হওয়ার দরকার নেই, কেবল ছোট করা one বাফারে লাইন git rebase -iদ্বারা তালিকাভুক্ত যা যা করা হয় কেবল চেরি তা বেছে নেয় pick; এটি আপনার জন্য তালিকাভুক্ত মূল আসল হতে হবে না।
breakসম্পাদকের কীওয়ার্ডটি তার নিজস্ব লাইনে দুটি কমিটের (অথবা প্রথম লাইনে, আপনার সুনির্দিষ্ট প্রতিশ্রুতি দেওয়ার আগে কমিট সন্নিবেশ করার জন্য) ব্যবহার করতে পারেন।
বেশ সহজ হতে দেখা যাচ্ছে, উত্তর এখানে পাওয়া যায় । আপনি যদি একটি শাখা আছি ধরুন branch। এই পদক্ষেপগুলি সম্পাদন করুন:
আপনি নতুন কমিট সন্নিবেশ করতে চাইলে কমিট থেকে একটি অস্থায়ী শাখা তৈরি করুন (এই ক্ষেত্রে কমিট করুন A):
git checkout -b temp A
পরিবর্তনগুলি সম্পাদন করুন এবং তাদের প্রতিশ্রুতিবদ্ধ করুন, একটি প্রতিশ্রুতি তৈরি করুন, আসুন এটি কল করুন N:
git commit -a -m "Message"
(বা git addতারপরে অনুসরণ করা git commit)
নতুন প্রতিশ্রুতিবদ্ধ হওয়ার পরে আপনি যে কমিটগুলি করতে চান তা পুনরায় চালু করুন (এক্ষেত্রে কমিট করে Bএবং C) নতুন প্রতিশ্রুতিতে:
git rebase temp branch
(সম্ভবত আপনি ব্যবহার করতে হবে -p- ধন্যবাদ মার্জ সংরক্ষণ, যদি কোনো ছিল একটি আর বিদ্যমান মন্তব্য দ্বারা ciekawy )
অস্থায়ী শাখা মুছুন:
git branch -d temp
এর পরে ইতিহাসটি নিম্নরূপ দেখায়:
A -- N -- B -- C
এটি অবশ্যই সম্ভব যে রিবেস করার সময় কিছু বিবাদ উপস্থিত হবে।
যদি আপনার শাখা স্থানীয় না হয় কেবল এটি পুনর্লিখনের ইতিহাস প্রবর্তন করবে, তাই গুরুতর সমস্যা দেখা দিতে পারে।
git push --forceদূরবর্তী রেপো পরিবর্তন করতে হবে।
git rebase temp branch -Xtheirs। স্ক্রিপ্টে ইনজেকশন দেওয়ার জন্য সহায়ক উত্তর!
git rebase temp branchতবে তার আগে git branch -d tempআপনাকে যা করতে হবে তা হল সংঘাতগুলি জারির সমাধান করা এবং মঞ্চস্থ করা git rebase --continue, অর্থাত্ কোনও কিছু করার দরকার নেই, ইত্যাদি
এমনকি সহজ সমাধান:
শেষে আপনার নতুন প্রতিশ্রুতি তৈরি করুন, ডি। এখন আপনার কাছে:
A -- B -- C -- D
তারপরে চালান:
$ git rebase -i hash-of-A
গিট আপনার সম্পাদকটি খুলবে এবং এটি এর মতো দেখাবে:
pick 8668d21 B
pick 650f1fc C
pick 74096b9 D
এইভাবে ডিটিকে উপরের দিকে সরান, তারপরে সংরক্ষণ করুন এবং প্রস্থান করুন
pick 74096b9 D
pick 8668d21 B
pick 650f1fc C
এখন আপনার হবে:
A -- D -- B -- C
ধরে নিন যে প্রতিশ্রুতিবদ্ধ ইতিহাসটি preA -- A -- B -- C, যদি আপনি এর মধ্যে একটি প্রতিশ্রুতি সন্নিবেশ করতে চান Aএবং B, পদক্ষেপগুলি নিম্নরূপ:
git rebase -i hash-of-preA
গিট আপনার সম্পাদক খুলবে। সামগ্রীটি এটি পছন্দ করতে পারে:
pick 8668d21 A
pick 650f1fc B
pick 74096b9 C
প্রথম পরিবর্তন pickকরতে edit:
edit 8668d21 A
pick 650f1fc B
pick 74096b9 C
সংরক্ষণ এবং ত্যাগ.
আপনার কোডটি পরিবর্তন করুন এবং তারপরে git add . && git commit -m "I"
git rebase --continue
এখন আপনার গিট কমিটের ইতিহাস preA -- A -- I -- B -- C
আপনি যদি কোনও বিরোধের মুখোমুখি হন, গিট এই প্রতিশ্রুতিতে থামবে। আপনি git diffদ্বন্দ্ব চিহ্নিতকারীগুলি সনাক্ত করতে এবং সেগুলি সমাধান করতে ব্যবহার করতে পারেন । সমস্ত দ্বন্দ্ব সমাধানের পরে, আপনাকে git add <filename>গিটকে বলতে হবে যে দ্বন্দ্বের সমাধান হয়েছে এবং তারপরে পুনরায় কাজ করতে হবে git rebase --continue।
আপনি যদি রিবেসটি পূর্বাবস্থায় ফেরাতে চান তবে ব্যবহার করুন git rebase --abort।
এখানে এমন একটি কৌশল যা আমি পড়েছি এমন অন্যান্য জবাবগুলিতে রিবেসের সময় "সম্পাদনা হ্যাক" করা এড়ানো যায়।
ব্যবহার করে git rebase -iআপনি সেই প্রতিশ্রুতি থেকে কমিটের একটি তালিকা পান। কেবলমাত্র ফাইলের শীর্ষে একটি "বিরতি" যুক্ত করুন, এটি সেই সময়ে রিবেসটি ভেঙে দেবে।
break
pick <B's hash> <B's commit message>
pick <C's hash> <C's commit message>
একবার চালু হয়ে গেলে git rebaseএখন "বিরতি" এর পয়েন্টে থামবে। আপনি এখন আপনার ফাইলগুলি সম্পাদনা করতে পারেন এবং আপনার প্রতিশ্রুতিটি স্বাভাবিকভাবে তৈরি করতে পারেন। তারপরে আপনি রিবেসটি চালিয়ে যেতে পারেন git rebase --continue। এটি দ্বন্দ্বের কারণ হতে পারে যা আপনাকে সমাধান করতে হবে। আপনি যদি হারিয়ে যান তবে ভুলে যাবেন না যে আপনি সর্বদা ব্যবহার বাতিল করতে পারেন git rebase --abort।
এই কৌশলটি যে কোনও জায়গায় প্রতিশ্রুতি সন্নিবেশ করানোর জন্য সাধারণীকরণ করা যেতে পারে, যেখানে আপনি একটি অঙ্গীকার সন্নিবেশ করতে চান সেই জায়গায় "ব্রেক" রাখুন।
ইতিহাস পুনর্লিখনের পরে, ভুলবেন না git push -f। আপনার শাখাটি আনার বিষয়ে অন্যান্য ব্যক্তিদের সম্পর্কে সাধারণ সতর্কতা প্রযোজ্য।
rebase। আপনি রিবেস চলাকালীন সময়ে বা পূর্বে প্রতিশ্রুতি তৈরি করবেন কিনা তা খুব বেশি পার্থক্য নয়।
ইতিমধ্যে এখানে অনেক ভাল উত্তর। আমি মাত্র 4 সহজ ধাপে একটি "নো রেবেস" সমাধান যুক্ত করতে চেয়েছিলাম।
সারসংক্ষেপ
git checkout A
git commit -am "Message for commit D"
git cherry-pick A..C
git branch -f master HEAD
ব্যাখ্যা
(দ্রষ্টব্য: এই সমাধানটির একটি সুবিধা হ'ল চূড়ান্ত পদক্ষেপ না হওয়া পর্যন্ত আপনি আপনার শাখাকে স্পর্শ করবেন না, যখন আপনি 100% নিশ্চিত হন যে আপনি শেষ ফলাফলের সাথে ঠিক আছেন, সুতরাং আপনার খুব কার্যকর "প্রাক-নিশ্চিতকরণ" পদক্ষেপ রয়েছে) এবি পরীক্ষার অনুমতি দিচ্ছে ))
প্রাথমিক অবস্থা (আমি masterআপনার শাখার নাম ধরে নিয়েছি )
A -- B -- C <<< master <<< HEAD
1) সঠিক জায়গায় হেড নির্দেশ করে শুরু করুন
git checkout A
B -- C <<< master
/
A <<< detached HEAD
(অপশনগতভাবে এখানে হেডকে আলাদা করার পরিবর্তে আমরা একটি অস্থায়ী শাখা তৈরি করতে পারতাম git checkout -b temp A, যা প্রক্রিয়া শেষে আমাদের মুছতে হবে need উভয় রূপই কাজ করে, আপনি যেমন পছন্দ করেন তেমন সমস্ত কিছু একই থাকে)
2) commitোকাতে নতুন কমিট ডি তৈরি করুন
# at this point, make the changes you wanted to insert between A and B, then
git commit -am "Message for commit D"
B -- C <<< master
/
A -- D <<< detached HEAD (or <<< temp <<< HEAD)
3) তারপরে সর্বশেষ নিখোঁজ কমিট বি এবং সি'র অনুলিপি আনুন (আরও কমিট থাকলে একই লাইনে থাকত)
git cherry-pick A..C
# (if any, resolve any potential conflicts between D and these last commits)
B -- C <<< master
/
A -- D -- B' -- C' <<< detached HEAD (or <<< temp <<< HEAD)
(প্রয়োজনে এখানে আরামদায়ক এবি টেস্টিং)
আপনার কোডটি পরিদর্শন করার, এখন যা পরীক্ষা করা দরকার তা যাচাই করার মুহূর্ত and এবং আপনার কী ছিল এবং অপারেশনের পরে আপনি কী পাবেন তাও আপনি আলাদা / তুলনা / পরীক্ষা করতে পারেন ।
4)C এবং এর মধ্যে আপনার পরীক্ষার উপর নির্ভর করে C'হয় তা ঠিক আছে বা এটি কেও।
(EITHER) 4-ঠিক আছে) অবশেষে, এর রেফটি সরানmaster
git branch -f master HEAD
B -- C <<< (B and C are candidates for garbage collection)
/
A -- D -- B' -- C' <<< master
(বা) 4-কো) কেবল masterঅপরিবর্তিত রেখে দিন
যদি আপনি একটি অস্থায়ী শাখা তৈরি করেন তবে কেবল এটি দিয়ে মুছুন git branch -d <name>, তবে আপনি যদি বিচ্ছিন্ন হেড রুটের পক্ষে যান তবে এই মুহুর্তে কোনও পদক্ষেপের প্রয়োজন নেই, নতুন প্রতিশ্রুতিগুলি আবর্জনা সংগ্রহের জন্য উপযুক্ত হবে আপনি ঠিক কোনভাবে পুনরায় যোগাযোগ HEADকরার পরে agit checkout master
এই উভয় ক্ষেত্রে (ঠিক আছে বা কেও), এই সময়ে masterপুনরায় যোগাযোগ করতে আবার চেকআউট করুন HEAD।