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




git-branch branching-and-merging (10)

একটি নতুন শাখা সরানো

সতর্কতা: এই পদ্ধতিটি কাজ করে কারণ আপনি প্রথম কমান্ডটি দিয়ে একটি নতুন শাখা তৈরি করছেন: git branch newbranch । যদি আপনি একটি বিদ্যমান শাখাতে কমিট সরাতে চান তবে আপনাকে git reset --hard HEAD~3 কার্যকর করার আগে আপনার পরিবর্তনগুলি বিদ্যমান শাখাতে মার্জ করতে হবে - git reset --hard HEAD~3 (নীচে একটি বিদ্যমান শাখাটিতে স্থানান্তর দেখুন)। যদি আপনি প্রথমে আপনার পরিবর্তনগুলি একত্রিত না করেন তবে তারা হারিয়ে যাবে।

অন্যান্য পরিস্থিতিতে জড়িত না হওয়া পর্যন্ত, এটি সহজে শাখা এবং ফিরে ঘূর্ণায়মান দ্বারা সম্পন্ন করা যাবে।

# Note: Any changes not committed will be lost.
git branch newbranch      # Create a new branch, saving the desired commits
git reset --hard HEAD~3   # Move master back by 3 commits (GONE from master)
git checkout newbranch    # Go to the new branch that still has the desired commits

কিন্তু কতটা ফিরে যেতে হবে তা নিশ্চিত করুন। অন্যথায়, আপনি HEAD~3 পরিবর্তে, কেবলমাত্র (/ বর্তমান) শাখায় "ফিরে ফিরতে" চান এমন কমিটির হ্যাশ (অথবা মূল / মাস্টারের মত রেফারেন্স) প্রদান করতে পারেন, উদাহরণস্বরূপ:

git reset --hard a1b2c3d4

* 1 আপনি শুধুমাত্র প্রধান শাখার কাছ থেকে "হারানো" হবেন, তবে চিন্তা করবেন না, যারা নতুন ব্র্যাঞ্চে আছেন তাদের আপনি পাবেন!

সতর্কতা: গিট সংস্করণ 2.0 এবং পরবর্তীতে, যদি আপনি পরে মূল ( master ) শাখায় নতুন শাখাটি git rebase তবে git rebase হারাতে আপনাকে রিবাজের সময় একটি স্পষ্ট --no-fork-point বিকল্পের প্রয়োজন হতে পারে। branch.autosetuprebase always থাকার থাকার এই আরো সম্ভাবনা করে তোলে। বিস্তারিত জানার জন্য জন মেলারের উত্তর দেখুন।

একটি বিদ্যমান শাখা সরানো

আপনি যদি আপনার মতামত একটি বিদ্যমান শাখায় স্থানান্তরিত করতে চান তবে এটি দেখতে পাবেন:

git checkout existingbranch
git merge master
git checkout master
git reset --hard HEAD~3 # Go back 3 commits. You *will* lose uncommitted work.
git checkout existingbranch

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

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

master A - B - C - D - E

এটা কি?

newbranch     C - D - E
             /
master A - B 

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

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

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

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


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 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 সংজ্ঞা দেখুন।


এটি প্রযুক্তিগত অর্থে তাদের "সরানো" না কিন্তু এটি একই প্রভাব রয়েছে:

A--B--C  (branch-foo)
 \    ^-- I wanted them here!
  \
   D--E--F--G  (branch-bar)
      ^--^--^-- Opps wrong branch!

While on branch-bar:
$ git reset --hard D # remember the SHAs for E, F, G (or E and G for a range)

A--B--C  (branch-foo)
 \
  \
   D-(E--F--G) detached
   ^-- (branch-bar)

Switch to branch-foo
$ git cherry-pick E..G

A--B--C--E'--F'--G' (branch-foo)
 \   E--F--G detached (This can be ignored)
  \ /
   D--H--I (branch-bar)

Now you won't need to worry about the detached branch because it is basically
like they are in the trash can waiting for the day it gets garbage collected.
Eventually some time in the far future it will look like:

A--B--C--E'--F'--G'--L--M--N--... (branch-foo)
 \
  \
   D--H--I--J--K--.... (branch-bar)

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

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 করতে সক্ষম হচ্ছে . জানতে একটি চমৎকার কৌশল।


আপনি এটি ব্যবহার করতে পারেন মাত্র 3 সহজ ধাপ।

1) নতুন শাখা তৈরি করুন যেখানে আপনি সাম্প্রতিক আপডেটটি করতে চান।

git branch <branch name>

2) নতুন শাখা কমিটির জন্য সাম্প্রতিক Commit আইডি খুঁজুন।

git log

3) অনুলিপি যে আইডি নোট যে সর্বাধিক সাম্প্রতিক কমিটি তালিকা শীর্ষে সঞ্চালিত। তাই আপনি আপনার কমিট খুঁজে পেতে পারেন। আপনি বার্তা মাধ্যমে এই খুঁজে।

git cherry-pick d34bcef232f6c...

আপনি কিছু আইডি প্রদান করতে পারেন আইডি।

git cherry-pick d34bcef...86d2aec

এখন আপনার কাজ সম্পন্ন। আপনি সঠিক আইডি এবং সঠিক শাখা বাছাই তারপর আপনি সফল হবে। তাই আগে এই সতর্ক হতে হবে। অন্য একটি সমস্যা ঘটতে পারে।

এখন আপনি আপনার কোড ধাক্কা দিতে পারেন

git push


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

এমন:

  • আপনার প্রাথমিক উদ্দেশ্য 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 তে কেবল একটি কমিট রোলব্যাক করার সহজ উপায়।

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

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


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

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

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


SourceTree (GitHub এর জন্য GUI) এ, আপনি SourceTree ডান-ক্লিক করতে পারেন এবং একটি 'বিপরীত Commit' করতে পারেন। এই আপনার পরিবর্তন পূর্বাবস্থায় ফেরানো উচিত।

টার্মিনালে:

আপনি বিকল্পভাবে ব্যবহার করতে পারেন:

git revert

বা:

git reset --soft HEAD^ # Use --soft if you want to keep your changes.
git reset --hard HEAD^ # Use --hard if you don't care about keeping your changes.




git git-branch branching-and-merging