সফল "গিট চেরি-পিক" কীভাবে পূর্বাবস্থাপন করবেন?


104

একটি স্থানীয় রেপোতে, আমি কেবল git cherry-pick SHAকোনও দ্বন্দ্ব বা সমস্যা ছাড়াই মৃত্যুদন্ড কার্যকর করেছি । আমি তখন বুঝতে পেরেছিলাম যে আমি সবে যা করেছি তা করতে চাই না। আমি এই কোথাও ধাক্কা না।

আমি কীভাবে এই চেরি বাছাই করতে পারি?

এটি করার কোনও উপায় আছে কিনা তা আমি জানতে চাই:

  • যখন আমার অন্যান্য স্থানীয় পরিবর্তন হয়
  • যখন আমার অন্য কোনও স্থানীয় পরিবর্তন নেই

সম্ভব হলে উভয় ক্ষেত্রেই একটি কমান্ড দিয়ে।

উত্তর:


142

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

যখন আমার অন্যান্য স্থানীয় পরিবর্তন হয়

আপনার বর্তমান পরিবর্তনগুলি সংযুক্ত করুন যাতে আপনি প্রতিশ্রুতি পুনরায় সেট করার পরে সেগুলি আবার প্রয়োগ করতে পারেন।

$ git stash
$ git reset --hard HEAD^
$ git stash pop  # or `git stash apply`, if you want to keep the changeset in the stash

যখন আমার অন্য কোনও স্থানীয় পরিবর্তন নেই

$ git reset --hard HEAD^

6
কেবলমাত্র প্রশ্ন এবং উত্তর ছাড়াও যদি আপনি নিশ্চিত হন না যে আপনি চেরি-পিক-ইন করছেন আপনি সর্বদা 'চেরি-পিক্স এসএইচএ - নন-কমিট' করতে পারবেন এবং কেবলমাত্র কোনও প্রতিশ্রুতি থাকবে না যা সহজেই পরীক্ষা করা যায় out , এটি আংশিক চেরি-বাছাইয়ের জন্য দরকারী
কুস্কেম

4
উইন্ডোজ: গিট রিসেট
পাতলা

25

আপনার শেষ প্রতিশ্রুতিটি পূর্বাবস্থায় ফেলার জন্য, সহজভাবে করুন git reset --hard HEAD~

সম্পাদনা : এই উত্তরটি স্থানীয় পরিবর্তনের সংরক্ষণের উল্লেখ না করে এমন প্রশ্নের পূর্ববর্তী সংস্করণে প্রয়োগ হয়েছিল; টিমের গৃহীত উত্তর সত্যই সঠিক indeed মাথা আপ জন্য qwertzguy ধন্যবাদ।


4
এটি হেড ^ বা হেড ~ 1 হওয়া উচিত
অ্যান্ড্রিয়াস বিদারব্রান্ড

তারা উভয়ই হেড equivalent (এবং এই বিষয়ে হেড ^ 1) এর সমতুল্য
ডেভিড ডয়েচ

4
@ ডেভিডডিউচ এটি সত্য (যদিও কেবল গিটের আরও সাম্প্রতিক সংস্করণগুলিতে) তবে বড় হাতের ( HEAD) আরও দৃ more় : দুর্ভাগ্যজনক ক্ষেত্রে বিবেচনা করুন যেখানে headকোনও বিদ্যমান রেফারেন্সের নাম is
jub0bs

4
@ জুবস - ভাল পয়েন্ট; আমি আমার উত্তরে আবরণ পরিবর্তন করেছি।
ডেভিড ডয়েচ

4
@ কিওয়ার্টজগুয়ে, ভাল ক্যাচ; টাইমস্ট্যাম্পগুলি দেখে, স্থানীয় উত্তরগুলি সম্পর্কে বিটটি আমি উত্তরটি পোস্ট করার এক মিনিটের পরে প্রশ্নটিতে যুক্ত করা হয়েছিল :)
ডেভিড ডয়েশ

9

সম্ভব হলে হার্ড রিসেট এড়িয়ে চলুন। হার্ড রিসেটগুলি গিটের খুব কম ধ্বংসাত্মক ক্রিয়াকলাপগুলির মধ্যে একটি। ভাগ্যক্রমে, আপনি পুনরায় সেট না করে চেরি-পিকটি পূর্বাবস্থায় ফেরাতে পারেন এবং ধ্বংসাত্মক কিছু এড়াতে পারেন।

আপনি যে চেরি-পিকটি পূর্বাবস্থায় করতে চান তা নোট করুন, বলুন এটি ${bad_cherrypick}। কgit revert ${bad_cherrypick} । এখন আপনার কার্যক্ষম গাছের বিষয়বস্তুগুলি আপনার খারাপ চেরি-বাছাইয়ের আগে যেমন ছিল।

আপনার পুনরাবৃত্তি করুন git cherry-pick ${wanted_commit}এবং আপনি যখন নতুন চেরি-পিক নিয়ে খুশি হন তখন একটি করুন git rebase -i ${bad_cherrypick}~1। রিবেস চলাকালীন উভয় মুছুন${bad_cherrypick} এবং এর সাথে সম্পর্কিত ফেরত ।

আপনি যে শাখায় কাজ করছেন সেটিতে কেবল ভাল চেরি-পিক থাকবে। কোন রিসেট প্রয়োজন!


7

git reflog আপনার উদ্ধারে আসতে পারে

এটিকে আপনার কনসোলে টাইপ করুন এবং SHA-1 এর সাথে আপনার গিট ইতিহাসের একটি তালিকা পাবেন যা সেগুলি উপস্থাপন করে।

আপনি ফিরে যেতে চান এমন কোনও SHA-1 কেবল চেকআউট করুন


উত্তর দেওয়ার আগে আসুন এটি কী তা ব্যাখ্যা করে কিছু পটভূমি যুক্ত করুন HEAD

First of all what is HEAD?

HEADকেবলমাত্র বর্তমান শাখায় বর্তমান প্রতিশ্রুতি (সর্বশেষ) এর একটি উল্লেখ। যে কোনও সময়
কেবলমাত্র একা HEADথাকতে পারে । (বাদে git worktree)

এর সামগ্রীটি HEADভিতরে সঞ্চিত .git/HEADরয়েছে এবং এতে বর্তমান প্রতিশ্রুতিতে 40 বাইট এসএইএ -1 রয়েছে।


detached HEAD

অর্থ যে - আপনি সর্বশেষ কমিট উপর না হন, তাহলে HEADতার নামে একটি পূর্বে নির্দেশ করা হয় ইতিহাসে কমিট detached HEAD

এখানে চিত্র বর্ণনা লিখুন

কমান্ড লাইনে এটি দেখতে শাখা -1 এর পরিবর্তে SHA-1 দেখতে পাবেন যেহেতু HEADবর্তমান শাখার অগ্রভাগের দিকে ইশারা করা হচ্ছে না

এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন

বিচ্ছিন্ন হেড থেকে কীভাবে পুনরুদ্ধার করবেন সে সম্পর্কে কয়েকটি বিকল্প:


git checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back

এটি পছন্দসই প্রতিশ্রুতি নির্দেশ করে নতুন শাখাটি চেকআউট করবে।
এই আদেশটি প্রদত্ত প্রতিশ্রুতিতে চেকআউট করবে।
এই মুহুর্তে, আপনি একটি শাখা তৈরি করতে পারেন এবং এই বিন্দু থেকে কাজ শুরু করতে পারেন।

# Checkout a given commit. 
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>

# create a new branch forked to the given commit
git checkout -b <branch name>

git reflog

আপনি সর্বদা reflogপাশাপাশি ব্যবহার করতে পারেন ।
git reflogআপডেট হওয়া কোনও পরিবর্তন প্রদর্শন করবে HEADএবং কাঙ্ক্ষিত রিফ্লগ এন্ট্রি চেক HEADকরা এই প্রতিশ্রুতিতে ফিরে আসবে।

যতবারই হেডের সংশোধন করা হয় সেখানে একটি নতুন প্রবেশ থাকবে reflog

git reflog
git checkout HEAD@{...}

এটি আপনাকে আপনার কাঙ্ক্ষিত প্রতিশ্রুতিতে ফিরিয়ে আনবে

এখানে চিত্র বর্ণনা লিখুন


git reset --hard <commit_id>

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

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts if you've modified things which were
# changed since the commit you reset to.
  • দ্রষ্টব্য: ( গিট ২.7 থেকে )
    আপনি এটিও ব্যবহার করতে পারেন git rebase --no-autostash

git revert <sha-1>

প্রদত্ত প্রতিশ্রুতি বা প্রতিশ্রুতি ব্যাপ্তি "পূর্বাবস্থায় ফিরিয়ে আনুন"।
রিসেট কমান্ড প্রদত্ত প্রতিশ্রুতিতে যে কোনও পরিবর্তন "পূর্বাবস্থায়" ফেলবে।
পূর্বাবস্থার প্যাচ নিয়ে একটি নতুন প্রতিশ্রুতিবদ্ধ প্রতিশ্রুতিবদ্ধ হবে যখন মূল প্রতিশ্রুতি ইতিহাসেও থাকবে।

# add new commit with the undo of the original one.
# the <sha-1> can be any commit(s) or commit range
git revert <sha-1>

এই স্কিমাটি বোঝায় যে কোন আদেশটি কী করে।
আপনি দেখতে পারেন সেখানে reset && checkoutপরিবর্তন HEAD

এখানে চিত্র বর্ণনা লিখুন


সম্ভবত যোগgit reset --hard
wyx

4

এই একই সমস্যার মুখোমুখি হয়ে, আমি আবিষ্কার করেছি যে আপনি যদি সফল চেরি-বাছাইয়ের পরে থেকে প্রতিশ্রুতিবদ্ধ এবং / অথবা দূরবর্তী স্থানে চলে এসেছেন এবং আপনি এটি সরাতে চান, আপনি চেরি-পিকের এসএএচএ চালিয়ে খুঁজে পেতে পারেন:

git log --graph --decorate --oneline

তারপরে, ( :wqলগ থেকে বেরিয়ে আসার ব্যবহার করার পরে ) আপনি চেরি-পিকটি ব্যবহার করে মুছে ফেলতে পারেন

git rebase -p --onto YOUR_SHA_HERE^ YOUR_SHA_HERE

যেখানে YOUR_SHA_HEREচেরি-বাছাই করা কমিটের 40- বা সংক্ষিপ্ত 7-বর্ণের SHA এর সমান।

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

git push --force origin YOUR_REPO_NAME

(আমি এই সমাধানটি শেঠ রবার্টসনের কাছ থেকে গ্রহণ করেছি : "সম্পূর্ণ প্রতিশ্রুতি অপসারণ" দেখুন See)


1

একটি আদেশ এবং ধ্বংসাত্মক আদেশ ব্যবহার করে নাgit reset :

GIT_SEQUENCE_EDITOR="sed -i 's/pick/d/'" git rebase -i HEAD~ --autostash

এটি কেবল কমিটিকে বাদ দেয়, চেরি-পিকের আগে আপনার স্থানীয় পরিবর্তন থাকলেও আপনাকে ঠিক রাজ্যে ফিরিয়ে দেয়।


এটা কেবল কমিট ড্রপ। আপনি কি মনে git reset HEAD^করেন?
টিম

@ টিমকাস্টেলিজনস git resetকোনও পরিবর্তন বাদ না দিয়ে প্রতিশ্রুতিবদ্ধ পদক্ষেপটি বাতিল করে দেয়। আমি আপনাকে git-scm.com/docs/git-reset পড়ার পরামর্শ দিচ্ছি । ওপি থেকে প্রশ্নটি একটি চেরি-পিকটি পূর্বাবস্থায় ফেরানো। উভয় কমান্ড ব্যবহার করে দেখুন, আমার চেরি-বাছাইয়ের আগে আপনি ঠিক সেই স্থানে ফিরে আসবেন। git resetচেরি-বাছাই করা পরিবর্তনগুলি ছেড়ে যাওয়ার সাথে সাথে আপনার কার্যক্ষম গাছটি গোলমেলে যাবে এবং তারা আপনার প্রাক-বিদ্যমান স্থানীয় পরিবর্তনগুলি থেকে পৃথক হয়ে উঠবে।
কিওয়ার্টজগুয়ে

হ্যাঁ, দুঃখিত, আমি বলতে চাইছিলাম reset --hard। এটি কোনও পরিবর্তন
টিম

4
@ টিমকাস্টেলিজনস git reset --hardএকটি ধ্বংসাত্মক কমান্ড যা অপরিকল্পিত স্থানীয় পরিবর্তনগুলিও সরিয়ে দেবে এবং এটি অপ্রত্যাশিত উপায়ে করবে! সুতরাং ওপি যা চেয়েছিল তা নয়।
কিওয়ার্টজগুয়ে

4
এই উত্তরটি আরও কার্যকর হবে যদি আপনি ব্যাখ্যা করেন যে এই sedআদেশটি কী করছে, কীভাবে এটি ম্যানুয়ালি করা থেকে আলাদা এবং কী --autostashকরে।
ক্রিস পৃষ্ঠা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.