git - একটি গিট রিবেস undoing




rebase git-rebase (10)

@ অ্যালান এবং @ জারিনিনের সমাধান অনুসরণ করে, আমি ইচ্ছা করি যদিও আমি কেবল একটি মন্তব্য করতে পারি তবে আমার যথেষ্ট খ্যাতি নেই, তাই আমি নিম্নলিখিত কমান্ডটি ব্যবহার করেছি:

পরিবর্তে git rebase -i --abort ( git rebase -i --abort নোটটি নোট) করার পরিবর্তে আমাকে কেবল git rebase --abort ( i -i ছাড়া )।

একই সময়ে -i এবং --abort উভয় ব্যবহার করে গিট আমাকে ব্যবহার / বিকল্পগুলির একটি তালিকা প্রদর্শন করে।

তাই এই সমাধান সঙ্গে আমার আগের এবং বর্তমান শাখা অবস্থা হল:

[email protected] /my/project/environment (branch-123|REBASE-i)
$ git rebase --abort

[email protected] /my/project/environment (branch-123)
$

যে কেউ সহজে একটি গিট রিবেস পূর্বাবস্থায় ফেরার কিভাবে জানেন?

মনে আসে যে একমাত্র উপায় নিজে এটি যেতে হয়:

  • উভয় শাখা কমিট অভিভাবক চেক আউট
  • তারপর সেখানে থেকে একটি temp শাখা তৈরি করুন
  • চেরি-সব হাত দ্বারা কমিট
  • শাখাটি প্রতিস্থাপন করুন যেখানে আমি নিজে তৈরি শাখার দ্বারা রিবেডেড

আমার বর্তমান অবস্থায় এটি কাজ করবে কারণ আমি সহজেই উভয় শাখার (সাধারণত আমার স্টাফ ছিল, অন্য আমার সহকর্মী এর স্টাফ ছিল) commits স্পট করতে পারেন।

তবে আমার দৃষ্টিভঙ্গিটি আমাকে সর্বোপরি এবং ত্রুটি-বিচ্যুতি হিসাবে আঘাত করে (আমি বলি আমি কেবল আমার নিজের শাখার ২ টি দিয়ে রিবেড করেছি)।

কোন ধারনা?

ব্যাখ্যা: আমি একটি রিবেস সম্পর্কে কথা বলছি যা সময় একটি গুচ্ছ replayed হয়। শুধু এক নয়।


আপনি যদি সফলভাবে রিমোট শাখার বিরুদ্ধে git rebase --abort এবং git rebase --abort না করতে পারেন - git rebase --abort আপনি এখনও আপনার কাজ সংরক্ষণ করতে এবং কিছু বাধ্য করার জন্য কিছু কৌশল করতে পারেন না। অনুমান করুন যে আপনার বর্তমান শাখাকে ভুল করে রিবেড করা হয়েছে your-branch বলা হয় এবং origin/your-branch ট্র্যাক করছে

  • git branch -m your-branch-rebased # git branch -m your-branch-rebased বর্তমান শাখার নামকরণ করুন
  • git checkout origin/your-branch # চেকআউটটি যে সর্বশেষ রাষ্ট্রের কাছে পরিচিত তা জানাতে
  • git checkout -b your-branch
  • git log your-branch-rebased চেক করুন, git log your-branch তুলনা করুন এবং git log your-branch অনুপস্থিতিগুলি সংজ্ঞায়িত করুন
  • your-branch-rebased git cherry-pick COMMIT_HASH প্রতিটি git cherry-pick COMMIT_HASH জন্য git cherry-pick COMMIT_HASH
  • আপনার পরিবর্তন ধাক্কা। দয়া করে সচেতন থাকুন যে দুটি স্থানীয় শাখাগুলি remote/your-branch এবং আপনাকে কেবল your-branch ধাক্কা দিতে হবে

আমি কোনও অননুমোদিত অপারেশন না করার আগে আমি আসলে শাখাটিতে একটি ব্যাকআপ ট্যাগ রাখি (বেশিরভাগ রিবেস ছোট, তবে আমি যে কোন জায়গায় জটিল দেখতে চাই)।

তারপরে, পুনঃস্থাপনটি git reset --hard BACKUP হিসাবে সহজ - git reset --hard BACKUP


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


প্রকৃতপক্ষে, ORIG_HEAD আপনার শুরু বিন্দুকে ORIG_HEAD এ সংরক্ষণ করে যাতে এটি সাধারণত হিসাবে সহজ হয়:

git reset --hard ORIG_HEAD

যাইহোক, reset , rebase এবং সকলকে আপনার মূল HEAD পয়েন্টারকে ORIG_HEAD এ সংরক্ষণ করুন যাতে আপনি যে কমান্ডগুলি পুনরায় পূর্বাবস্থায় ফিরিয়ে আনতে চান সেটি থেকে যদি আপনি কোনও কমান্ড সম্পন্ন করেন তবে আপনাকে রিফ্লগটি ব্যবহার করতে হবে।


বলুন আমি আমার ফিচার শাখার মাস্টারকে রিবেস করি এবং 30 টি নতুন কাজ করি যা কিছু ভেঙে দেয়। আমি প্রায়ই খারাপ commits মুছে ফেলার জন্য এটি সহজতর পাওয়া যায় নি।

git rebase -i HEAD~31

গত 31 টি কৃতিত্বের জন্য ইন্টারেক্টিভ রিবেস (আপনি অনেকগুলি উপায় চয়ন করলে এটি আঘাতপ্রাপ্ত হয় না)।

কেবলমাত্র যেগুলি আপনি পরিত্রাণ পেতে চান তা গ্রহণ করুন এবং "পিক" এর পরিবর্তে "d" দিয়ে চিহ্নিত করুন। এখন বিলোপ কার্যকরভাবে কার্যকরভাবে বিনিময় পূর্বাবস্থায় ফিরিয়ে আনা হয় (যদি আপনি শুধুমাত্র rebitting যখন আপনি পেয়েছিলাম commits মুছে ফেলা)।


যদি আপনি আপনার শাখাটিকে রিমোট রিপোজিটরিতে (সাধারণত এটির মূল) দিকে ধাক্কা দেন এবং তারপরে আপনি একটি সফল git rebase --abort (মার্জ ব্যতীত) করেছেন ( git rebase --abort "অগ্রগতিতে কোন git rebase --abort দেয় না") আপনি কমান্ড ব্যবহার করে সহজে শাখা পুনরায় সেট করতে পারেন:

গিট রিসেট - মূল উৎপত্তি / {branchName}

উদাহরণ:

$ ~/work/projects/{ProjectName} $ git status
On branch {branchName}
Your branch is ahead of 'origin/{branchName}' by 135 commits.
  (use "git push" to publish your local commits)

nothing to commit, working directory clean

$ ~/work/projects/{ProjectName} $ git reset --hard origin/{branchName}
HEAD is now at 6df5719 "Commit message".

$ ~/work/projects/{ProjectName} $ git status
On branch {branchName}
Your branch is up-to-date with 'origin/{branchName}.

nothing to commit, working directory clean

যদি আপনি git rebase --abort কিছু জগাখিচুড়ি করেন, উদাহরণস্বরূপ git rebase --abort , যখন আপনার কাছে git rebase --abort ফাইল থাকে, তখন এটি হারিয়ে যাবে এবং git reflog সাহায্য করবে না। এই আমার ঘটেছে এবং আপনি এখানে বক্স বাইরে চিন্তা করতে হবে। আপনি যদি আমার মত ভাগ্যবান হন এবং IntelliJ ওয়েবস্টর্ম ব্যবহার করেন তবে আপনি right-click->local history করতে পারেন- right-click->local history এবং আপনার ফাইল / ফোল্ডারগুলির পূর্ববর্তী অবস্থায় ফিরে যেতে পারেন সংস্করণ সফ্টওয়্যারের সাথে আপনি কী ভুল করেছেন। এটি অন্য ব্যর্থতা চলমান সবসময় ভাল।


শাখাটিকে তার পুরাতন টিপের ঝুঁকিপূর্ণ বস্তুতে পুনঃস্থাপন করা অবশ্যই সর্বোত্তম সমাধান, কারণ এটি পূর্ববর্তী রাষ্ট্রটিকে কোনও প্রচেষ্টা ব্যয় ছাড়াই পুনরুদ্ধার করে। কিন্তু আপনি যদি সেগুলি হারাতে ব্যর্থ হন (f.ex। কারণ আপনি ইতিমধ্যে আপনার সংগ্রহস্থলটি আবর্জনা সংগ্রহ করেছেন, অথবা এটি একটি নতুন ক্লোন), আপনি সর্বদা শাখাটি আবার ফিরিয়ে আনতে পারেন। এই কি - --onto সুইচ।

ধরুন আপনি একটি বিষয় শাখা কল্পনাপ্রসূত বলা topic , master টিপ 0deadbeef কমিট যখন আপনি master বন্ধ branched ছিল। কিছু সময়ে যখন শাখা শাখায় আপনি git rebase master । এখন আপনি এটি পূর্বাবস্থায় ফেরাতে চান। এখানে কিভাবে:

git rebase --onto 0deadbeef master topic

এই সব master উপর না যে topic এবং 0deadbeef শীর্ষে তাদের পুনরায় 0deadbeef

সঙ্গে - আপনি, আপনি যে কোন আকারে অনেক সুন্দর আপনার ইতিহাস পুনর্বিন্যাস করতে পারেন।

আনন্দ কর. :-)


সবচেয়ে সহজ উপায় শাখা প্রধান মাথা খুঁজে পেতে হবে যেহেতু এটি reflog ইন reflog শুরু করার আগে অবিলম্বে ছিল ...

git reflog

এবং বর্তমান শাখাটিকে পুনরায় সেট করতে (সাধারণ হ্যাভ্যাটগুলির সাথে - হরদ বিকল্পের সাথে পুনরায় সেট করার আগে একেবারে নিশ্চিত হওয়ার বিষয়ে)।

অনুমান করুন পুরানো [email protected]{5} রেফার লগে [email protected]{5}

git reset --hard [email protected]{5}

উইন্ডোজ, আপনি রেফারেন্স উদ্ধৃত করতে হতে পারে:

git reset --hard "[email protected]{5}"

আপনি git log [email protected]{5} ( উইন্ডোজ: git log "[email protected]{5}" ) একটি git log [email protected]{5} করে প্রার্থী পুরানো মাথার ইতিহাসটি পরীক্ষা করতে পারেন।

যদি আপনি প্রতি শাখা রিফ্লগ নিষ্ক্রিয় না করে থাকেন তবে আপনি কেবল git reflog [email protected]{1} যেহেতু একটি git reflog [email protected]{1} চূড়ান্ত মাথায় git reflog [email protected]{1} আগে শাখা git reflog [email protected]{1} । আমি এই চেক ডবল হবে, যদিও আমি সম্প্রতি এই যাচাই না।

ডিফল্ট প্রতি, সমস্ত রিফ্লগ অ-ন্যূনতম সংগ্রহস্থলের জন্য সক্রিয় হয়:

[core]
    logAllRefUpdates = true




undo