অতীতে দু'টি স্বেচ্ছাসেবক কমিটির মধ্যে কোন অঙ্গীকার কীভাবে ইনজেক্ট করবেন?


126

ধরুন আমার কেবল স্থানীয় স্থানীয় শাখায় নিম্নলিখিত প্রতিশ্রুতিবদ্ধ ইতিহাস রয়েছে:

A -- B -- C

আমি কিভাবে ঢোকাতে একটি নতুন মধ্যবর্তী কমিট না Aএবং B?


3
প্রতিশ্রুতিবদ্ধ Ą ? :)
আনতেক

অতীতে কীভাবে প্রতিশ্রুতির পরিবর্তে একটি নতুন সংস্করণ sert োকানো যায় সে সম্পর্কে আমার খুব অনুরূপ প্রশ্ন রয়েছে ।
পাভেল পি

উত্তর:


178

এটি ওপির উত্তরের চেয়ে আরও সহজ।

  1. git rebase -i <any earlier commit>। এটি আপনার কনফিগার করা পাঠ্য সম্পাদকটিতে কমিটের একটি তালিকা প্রদর্শন করে।
  2. আপনি যে প্রতিশ্রুতি সন্নিবেশ করতে চান তা সন্ধান করুন (আসুন এটি ধরে নিই a1b2c3d)। আপনার সম্পাদকটিতে, সেই লাইনের জন্য, এ পরিবর্তন pickকরুন edit
  3. আপনার পাঠ্য সম্পাদক বন্ধ করে রিবেস শুরু করুন (আপনার পরিবর্তনগুলি সংরক্ষণ করুন)। এটি আপনাকে কমান্ড প্রম্পটে ছেড়ে দেবে যা আপনি আগে ( a1b2c3d) নির্বাচন করেছেন এমন প্রতিশ্রুতি নিয়ে মনে হচ্ছে যেন সবেমাত্র প্রতিশ্রুতিবদ্ধ হয়েছে
  4. আপনার পরিবর্তনগুলি করুন এবং git commit( বেশিরভাগের চেয়ে পৃথক করে সংশোধন করছেন নাedit )। এটি আপনার চয়ন করা একটির পরে নতুন প্রতিশ্রুতি তৈরি করে ।
  5. git rebase --continue। এটি আপনার নতুন প্রতিশ্রুতি সঠিক জায়গায় leavingোকানো রেখে ক্রমাগত কমিটগুলি পুনরায় প্রদর্শন করে।

সাবধান থাকুন যে এটি ইতিহাস পুনর্লিখন করবে এবং যে কেউ টানতে চেষ্টা করবে তাকে ভাঙবে।


1
এটি কমিটমেন্টের পরে নতুন প্রতিশ্রুতি যুক্ত করেছে, যা আমি প্রত্যাবর্তন করছি তার পরে ডান পরিবর্তে (শেষ প্রতিশ্রুতি) দিয়ে প্রত্যাবর্তন করছি। ফলাফলটি একই রকম ছিল যে আমি কেবল পরিবর্তনগুলি সন্নিবেশ করতে চাইলে শেষে একটি নতুন প্রতিশ্রুতিবদ্ধ করেছি। আমার ইতিহাস A -- B -- C -- Dকাঙ্ক্ষিত পরিবর্তে হয়ে ওঠে A -- D -- B -- C
Xedin অজ্ঞাত

2
@ এক্সিডিনউন্নড: তারপরে আপনি রিবেস সঠিকভাবে ব্যবহার করেননি।
স্লাকস

3
এখন Dযে কোনও জায়গায় কমিট হতে পারে। মনে করুন আমাদের রয়েছে A - B - Cএবং আমাদের কিছু প্রতিশ্রুতিবদ্ধ রয়েছে Dযা এমনকি এই শাখায় নেই। আমরা এর এসএএ জানি তবে আমরা এটি করতে পারি git rebase -i HEAD~3। এখন Aএবং B pickরেখার মধ্যে, আমরা একটি নতুন pick লাইন সন্নিবেশ করলাম যা বলছে pick SHA, পছন্দসই হ্যাশ প্রদান করে D। এটি পূর্ণ হ্যাশ হওয়ার দরকার নেই, কেবল ছোট করা one বাফারে লাইন git rebase -iদ্বারা তালিকাভুক্ত যা যা করা হয় কেবল চেরি তা বেছে নেয় pick; এটি আপনার জন্য তালিকাভুক্ত মূল আসল হতে হবে না।
কাজ

1
@ কাজ এটিকে অন্যরকম, কার্যকর উত্তর বলে মনে হচ্ছে।
বার্তোসকেপিপি

3
আরও সহজ, আপনি breakসম্পাদকের কীওয়ার্ডটি তার নিজস্ব লাইনে দুটি কমিটের (অথবা প্রথম লাইনে, আপনার সুনির্দিষ্ট প্রতিশ্রুতি দেওয়ার আগে কমিট সন্নিবেশ করার জন্য) ব্যবহার করতে পারেন।
সাইমনটি

30

বেশ সহজ হতে দেখা যাচ্ছে, উত্তর এখানে পাওয়া যায় । আপনি যদি একটি শাখা আছি ধরুন 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

এটি অবশ্যই সম্ভব যে রিবেস করার সময় কিছু বিবাদ উপস্থিত হবে।

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


2
আমি এসএলএক্স দ্বারা গৃহীত উত্তরটি অনুসরণ করতে পারি না, তবে এটি আমার পক্ষে কাজ করে। আমি যে প্রতিশ্রুতিবদ্ধ ইতিহাস চেয়েছিলাম তা পাওয়ার পরে, আমাকে git push --forceদূরবর্তী রেপো পরিবর্তন করতে হবে।
এসিডেচ্যাকার্টার

1
-বাজার বিকল্প ব্যবহার করে রিবেস ব্যবহার করার সময় অটো সঠিকভাবে বিবাদগুলি সমাধান করে git rebase temp branch -Xtheirs। স্ক্রিপ্টে ইনজেকশন দেওয়ার জন্য সহায়ক উত্তর!
ডেভিড সি

আমার মতো নুবুকদের জন্য আমি এটির পরে যুক্ত করতে চাই git rebase temp branchতবে তার আগে git branch -d tempআপনাকে যা করতে হবে তা হল সংঘাতগুলি জারির সমাধান করা এবং মঞ্চস্থ করা git rebase --continue, অর্থাত্ কোনও কিছু করার দরকার নেই, ইত্যাদি
পগসলে

19

এমনকি সহজ সমাধান:

  1. শেষে আপনার নতুন প্রতিশ্রুতি তৈরি করুন, ডি। এখন আপনার কাছে:

    A -- B -- C -- D
    
  2. তারপরে চালান:

    $ git rebase -i hash-of-A
    
  3. গিট আপনার সম্পাদকটি খুলবে এবং এটি এর মতো দেখাবে:

    pick 8668d21 B
    pick 650f1fc C
    pick 74096b9 D
    
  4. এইভাবে ডিটিকে উপরের দিকে সরান, তারপরে সংরক্ষণ করুন এবং প্রস্থান করুন

    pick 74096b9 D
    pick 8668d21 B
    pick 650f1fc C
    
  5. এখন আপনার হবে:

    A -- D -- B -- C
    

6
দুর্দান্ত ধারণা, তবে সি তে ডি প্রবর্তন করা কঠিন হতে পারে, যখন আপনি এই পরিবর্তনগুলি কব্জি করার পরিকল্পনা করছেন। এ।
বার্তোসজকেপি

আমার এমন একটি পরিস্থিতি রয়েছে যেখানে আমার 3 টি প্রতিশ্রুতি রয়েছে যে আমি একসাথে রিবেস করতে চাই এবং এর সাথে সম্পর্কযুক্ত নয় এমন একটি অঙ্গীকারবদ্ধ। কমিটস লাইনের আগে বা পরে যে প্রতিশ্রুতিবদ্ধ তা সরাতে সক্ষম হওয়ায় এটি দুর্দান্ত।
ফুল ফোটে

13

ধরে নিন যে প্রতিশ্রুতিবদ্ধ ইতিহাসটি preA -- A -- B -- C, যদি আপনি এর মধ্যে একটি প্রতিশ্রুতি সন্নিবেশ করতে চান Aএবং B, পদক্ষেপগুলি নিম্নরূপ:

  1. git rebase -i hash-of-preA

  2. গিট আপনার সম্পাদক খুলবে। সামগ্রীটি এটি পছন্দ করতে পারে:

    pick 8668d21 A
    pick 650f1fc B
    pick 74096b9 C
    

    প্রথম পরিবর্তন pickকরতে edit:

    edit 8668d21 A
    pick 650f1fc B
    pick 74096b9 C
    

    সংরক্ষণ এবং ত্যাগ.

  3. আপনার কোডটি পরিবর্তন করুন এবং তারপরে git add . && git commit -m "I"

  4. git rebase --continue

এখন আপনার গিট কমিটের ইতিহাস preA -- A -- I -- B -- C


আপনি যদি কোনও বিরোধের মুখোমুখি হন, গিট এই প্রতিশ্রুতিতে থামবে। আপনি git diffদ্বন্দ্ব চিহ্নিতকারীগুলি সনাক্ত করতে এবং সেগুলি সমাধান করতে ব্যবহার করতে পারেন । সমস্ত দ্বন্দ্ব সমাধানের পরে, আপনাকে git add <filename>গিটকে বলতে হবে যে দ্বন্দ্বের সমাধান হয়েছে এবং তারপরে পুনরায় কাজ করতে হবে git rebase --continue

আপনি যদি রিবেসটি পূর্বাবস্থায় ফেরাতে চান তবে ব্যবহার করুন git rebase --abort


10

এখানে এমন একটি কৌশল যা আমি পড়েছি এমন অন্যান্য জবাবগুলিতে রিবেসের সময় "সম্পাদনা হ্যাক" করা এড়ানো যায়।

ব্যবহার করে 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। আপনি রিবেস চলাকালীন সময়ে বা পূর্বে প্রতিশ্রুতি তৈরি করবেন কিনা তা খুব বেশি পার্থক্য নয়।
বার্তোসকেপিপি

ওফস, আমি রিবেস চলাকালীন "সম্পাদনা হ্যাক" এড়ানো বোঝাতাম, আমি অনুমান করি যে আমি এটি খারাপভাবে বলেছি।
axerologementy

ঠিক। আমার উত্তরটি রিবেসের "সম্পাদনা" বৈশিষ্ট্যটি ব্যবহার করে না। তবুও, এটি আরও একটি বৈধ পন্থা - ধন্যবাদ! :-)
বার্তোসজকেপি

6

ইতিমধ্যে এখানে অনেক ভাল উত্তর। আমি মাত্র 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

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