git - গিট সহ একটি নতুন শাখায় সবচেয়ে সাম্প্রতিক কমিটি(গুলি) সরান




git-branch branching-and-merging (8)

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

আমি কিভাবে এই থেকে যেতে পারেন

master A - B - C - D - E

এটা কি?

newbranch     C - D - E
             /
master A - B 

গিট স্ট্যাশ ব্যবহার করে অনেক সহজ সমাধান

এমন:

  • আপনার প্রাথমিক উদ্দেশ্য master ফিরে রোল, এবং
  • আপনি পরিবর্তনগুলি রাখতে চান তবে বিশেষ করে ব্যক্তিগত ব্যক্তিদের যত্ন নেবেন না এবং
  • আপনি এখনো ধাক্কা না, এবং
  • আপনি এই সহজ এবং temp শাখা এবং অন্যান্য মাথাব্যাথা সঙ্গে জটিল হতে চান না

তারপরে নিম্নলিখিতগুলি অনেক সরল (শাখা master শুরুতে তিন ভুল ভুল রয়েছে):

git reset HEAD~3
git stash
git checkout newbranch
git stash pop

এই লাইন নম্বর দ্বারা কি করে

  1. শেষ তিনটি কমিটি (এবং তাদের বার্তা) master করতে পূর্বাবস্থায় ফিরিয়ে আনে, কিন্তু সব কাজ ফাইল অক্ষত রাখে
  2. সমস্ত কাজের ফাইল পরিবর্তনগুলি বন্ধ করে দেয়, master ট্রি HEAD ~ 3 রাষ্ট্র সমান করে তোলে
  3. একটি বিদ্যমান শাখা newbranch সুইচ
  4. আপনার কাজের নির্দেশিকাতে স্ট্যাশেড পরিবর্তনগুলি প্রয়োগ করে এবং স্ট্যাশটি সাফ করে

আপনি সাধারণত আপনি চান হিসাবে git add এবং git commit ব্যবহার করতে পারেন। সমস্ত নতুন কমিটি newbranch যোগ করা হবে।

এই কি না

  • এটা আপনার গাছ cluttering র্যান্ডম অস্থায়ী শাখা ছেড়ে না
  • এটি ভুল কাজগুলি সংরক্ষণ করে এবং বার্তা প্রেরণ করে না, তাই আপনাকে এই নতুন কমিটিতে একটি নতুন কমিটি বার্তা যোগ করতে হবে

গোল

ওপি বলেন, লক্ষ্যগুলি হারাতে না পেরে "যেসব জিনিসগুলি তৈরি করা হয়েছিল তার আগে মাস্টারকে ফিরিয়ে আনতে" লক্ষ্য করা হয়েছিল এবং এই সমাধানটি তা করে।

আমি অন্তত সপ্তাহে একবার এটি করি যখন আমি দুর্ঘটনাক্রমে develop পরিবর্তে master নতুন কমিটি করি। সাধারণত আমার কাছে রিটব্যাকের একমাত্র প্রতিলিপি রয়েছে যা git reset HEAD^ ব্যবহার করে git reset HEAD^ লাইন 1 তে কেবল একটি কমিট রোলব্যাক করার সহজ উপায়।

আপনি মাস্টারের পরিবর্তন আপস্ট্রীম ধাক্কা দিলে এটি করবেন না

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


জেনারেল ইন ...

সিকোরা দ্বারা উদ্ভূত পদ্ধতিটি এই ক্ষেত্রে সর্বোত্তম বিকল্প। কিন্তু কখনও কখনও সহজ নয় এবং এটি একটি সাধারণ পদ্ধতি নয়। সাধারণ পদ্ধতির জন্য জিট চেরি-পিক ব্যবহার করুন:

OP কী চায় তা অর্জন করতে, এটি একটি 2-পদক্ষেপ প্রক্রিয়া:

পদক্ষেপ 1 - নোট যা আপনি একটি নতুন newbranch চান মাস্টার থেকে newbranch

এক্সিকিউট

git checkout master
git log

মনে রাখবেন হ্যাশের (3 বলুন) নতুন newbranch আপনি চান। এখানে আমি ব্যবহার করব
সি 9aa1233 : 9 9aa1233
ডি 453ac3d : 453ac3d
ই কমিট: 612ecb3

দ্রষ্টব্য: আপনি প্রথম সাত অক্ষর বা সমগ্র কমিটি হ্যাশ ব্যবহার করতে পারেন

পদক্ষেপ 2 - নতুন newbranch তাদের রাখুন

git checkout newbranch
git cherry-pick 612ecb3
git cherry-pick 453ac3d
git cherry-pick 9aa1233

অথবা (গিট 1.7.2+, ব্যাপ্তি ব্যবহার করুন)

git checkout newbranch
git cherry-pick 612ecb3~1..9aa1233

গিট চেরি-পিক নতুন ব্র্যাঞ্চ যারা তিনটি প্রযোজ্য প্রযোজ্য।


সর্বাধিক পূর্ববর্তী উত্তর বিপজ্জনক ভুল!

এটা করো না:

git branch -t newbranch
git reset --hard HEAD~3
git checkout newbranch

পরের বার যখন আপনি git rebase git pull --rebase চালান (বা git pull --rebase ) তখন সেই 3 টি newbranch থেকে বাতিল করা newbranch ! (নীচের ব্যাখ্যা দেখুন)

পরিবর্তে এটি করুন:

git reset --keep HEAD~3
git checkout -t -b newbranch
git cherry-pick [email protected]{2}
  • প্রথমত এটি 3 টি সাম্প্রতিক কাজগুলিকে বাতিল করে দেয় (- --keep যেমন - --hard , তবে নিরাপদ, অস্বাভাবিক পরিবর্তনগুলি নিক্ষেপ করার পরিবর্তে ব্যর্থ হয়)।
  • তারপর এটি newbranch বন্ধ newbranch
  • তারপর এটি চেরি- newbranch 3 টি ফিরিয়ে দেয়। যেহেতু তাদের আর একটি শাখার উল্লেখ করা হয় না, তাই এটি reflog ব্যবহার করে: [email protected]{2} reflog 2 অপারেশনের পূর্বে উল্লেখ করা হয়, newbranch আমরা আগে 1. 1. নতুন newbranch চেক আউট এবং ২। 3 commits বাতিল করতে git reset

সতর্কতা: রিফ্লগটি ডিফল্টরূপে সক্ষম করা আছে, তবে আপনি যদি এটি ম্যানুয়ালি অক্ষম করেছেন (উদাহরণস্বরূপ একটি "বেয়ার" গিট রিপোজিটরি ব্যবহার করে), আপনি git reset --keep HEAD~3 চালানোর পরে 3 টি ফিরে পেতে সক্ষম হবেন না - git reset --keep HEAD~3

রিফ্লগ উপর নির্ভর করে না যে একটি বিকল্প:

# newbranch will omit the 3 most recent commits.
git checkout -b newbranch HEAD~3
git branch --set-upstream-to=oldbranch
# Cherry-picks the extra commits from oldbranch.
git cherry-pick ..oldbranch
# Discards the 3 most recent commits from oldbranch.
git branch --force oldbranch oldbranch~3

(যদি আপনি পছন্দ করেন তবে আপনি @{-1} লিখতে পারেন - পূর্বে oldbranch শাখা - oldbranch পরিবর্তে)।

প্রযুক্তিগত ব্যাখ্যা

কেন git rebase প্রথম উদাহরণ পরে 3 commits বাতিল করা হবে? কারণ কোনও আর্গুমেন্ট ছাড়াই git rebase --fork-point বিকল্পটি সক্ষম করে, যা আপল্রীম শাখার বিরুদ্ধে জোরালোভাবে ধাক্কা দেওয়ার জন্য স্থানীয় রিফ্লগ ব্যবহার করে।

ধরুন যখন আপনি M1, M2, M3 টি এমআই, এম 3, এমআই, এমআই, এমআই, এমআই, এমআই, এমআই,

M1--M2--M3  <-- origin/master
         \
          T1--T2--T3  <-- topic

কিন্তু তারপর কেউ M2 মুছে ফেলার জন্য বলপূর্বক মূল / মাস্টার দ্বারা ইতিহাস পুনর্বিবেচনা করে:

M1--M3'  <-- origin/master
 \
  M2--M3--T1--T2--T3  <-- topic

আপনার স্থানীয় রিফ্লগ ব্যবহার করে, git rebase রিবেসটি আপনি দেখতে পারেন যে আপনি মূল / মাস্টার শাখার পূর্ববর্তী অবতার থেকে ফর্ক করেছেন, এবং এম 2 এবং এম 3 টি সত্যিই আপনার বিষয় শাখার অংশ নয়। তাই এটি যুক্তিসংগতভাবে অনুমান করে যে এম 2টি আপস্ট্রিম শাখা থেকে সরানো হয়েছে, তাই এটি আপনার শাখার শাখায় একবারের বিষয়বস্তুর শাখা পুনঃস্থাপিত হওয়ার পরে আর চাইবে না:

M1--M3'  <-- origin/master
     \
      T1'--T2'--T3'  <-- topic (rebased)

এই আচরণ ইন্দ্রিয় তোলে, এবং সাধারণত rebitting যখন কি সঠিক জিনিস।

তাই নিম্নলিখিত কমান্ড ব্যর্থ হয়েছে:

git branch -t newbranch
git reset --hard HEAD~3
git checkout newbranch

কারণ তারা ভুল অবস্থায় রিফ্লগ ছেড়ে চলে যায়। গিট নতুন newbranch দেখায় যে এটি 3 টি newbranch সাথে আপস্ট্রিম শাখা থেকে ফর্ক তৈরি করেছে, তারপরে reset --hard আপস্ট্রিমের ইতিহাসটি পুনর্বিবেচনার জন্য পুনর্বিবেচনা করে এবং তাই পরবর্তী সময় আপনি যখন git rebase চালান তখন এটি অন্য যে কোনও মতামতের মতো বাতিল করে দেয় আপস্ট্রিম থেকে মুছে ফেলা হয়েছে।

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

আরো বিস্তারিত জানার জন্য, গিট --fork-point এবং গিট মার্জ বেস --fork-point সংজ্ঞা দেখুন।


1) একটি নতুন শাখা তৈরি করুন, যা আপনার সমস্ত পরিবর্তন new_branch এ চলে আসে।

git checkout -b new_branch

2) তারপর পুরানো শাখায় ফিরে যান।

git checkout master

3) গিট রিবেস না

git rebase -i <short-hash-of-B-commit>

4) তারপর খোলা সম্পাদক শেষ 3 কমিট তথ্য রয়েছে।

...
pick <C's hash> C
pick <D's hash> D
pick <E's hash> E
...

5) সবগুলো 3 টি drop pick পরিবর্তন করুন। তারপর সম্পাদক সংরক্ষণ করুন এবং বন্ধ।

...
drop <C's hash> C
drop <D's hash> D
drop <E's hash> E
...

6) এখন শেষ 3 টি কমিটি বর্তমান শাখা ( master ) থেকে সরানো হয়। এখন শাখা নাম আগে সাইন + সঙ্গে শাখা ধাক্কা।

git push origin +master

ইতিহাস পুনর্বিবেচনা ছাড়া এটি করার জন্য (অর্থাত্ আপনি যদি ইতিমধ্যে ধাপগুলি ধাক্কা দিচ্ছেন):

git checkout master
git revert <commitID(s)>
git checkout -b new-branch
git cherry-pick <commitID(s)>

উভয় শাখা তারপর বল ছাড়া push করা যাবে!


এখনও অন্য কমান্ড ব্যবহার করে, এই দুটি উপায়। এছাড়াও অক্ষত আপনার বর্তমান কাজ গাছ রাখে।

git checkout -b newbranch # switch to a new branch
git branch -f master HEAD~3 # make master point to some older commit

পুরাতন সংস্করণ - আমি git branch -f সম্পর্কে শিখেছি আগে

git checkout -b newbranch # switch to a new branch
git push . +HEAD~3:master # make master point to some older commit 

push করতে সক্ষম হচ্ছে . জানতে একটি চমৎকার কৌশল।


যারা এটা কাজ করে কেন বিস্ময়ের জন্য (যেমন আমি প্রথমে ছিলাম):

আপনি সি ফিরে যেতে চান, এবং নতুন শাখায় ডি এবং ই সরান। এখানে প্রথম মত দেখাচ্ছে:

A-B-C-D-E (HEAD)
        ↑
      master

git branch newBranch পরে:

    newBranch
        ↓
A-B-C-D-E (HEAD)
        ↑
      master

git reset --hard HEAD~2 পরে - git reset --hard HEAD~2 :

    newBranch
        ↓
A-B-C-D-E (HEAD)
    ↑
  master

যেহেতু একটি শাখা শুধুমাত্র একটি পয়েন্টার, মাস্টার শেষ কমিটির দিকে নির্দেশিত। যখন আপনি নতুন ব্র্যাঞ্চ তৈরি করেন , তখন আপনি কেবল সর্বশেষ কমিটিতে একটি নতুন পয়েন্টার তৈরি করেছেন। তারপর git reset ব্যবহার করে আপনি মাস্টার পয়েন্টার ফিরে দুই commits সরানো। কিন্তু যেহেতু আপনি নতুন ব্র্যাঞ্চকে সরিয়ে নেননি , এটি এখনও এটি মূলত কৃত অঙ্গীকারকে নির্দেশ করে।


শুধু এই অবস্থা ছিল:

Branch one: A B C D E F     J   L M  
                       \ (Merge)
Branch two:             G I   K     N

আমি সঞ্চালিত:

git branch newbranch 
git reset --hard HEAD~8 
git checkout newbranch

আমি আশা করি যে আমি শিরোনাম হব, কিন্তু এখনই এটি এল ...

ইতিহাসে সঠিক স্থানে অবতরণ করা নিশ্চিত হবার পক্ষে হ্যাশের সাথে কাজ করা সহজ

git branch newbranch 
git reset --hard #########
git checkout newbranch





branching-and-merging