git - গিট বাংলা



একটি পূর্ববর্তী কমিট একটি গিট রিপোজিটরি ফিরে কিভাবে (20)

আমি কিভাবে আমার বর্তমান অবস্থা থেকে একটি নির্দিষ্ট কমিটিতে একটি স্ন্যাপশট থেকে ফিরে পেতে পারি?

আমি git log , তাহলে আমি নিম্নলিখিত আউটপুট পেতে পারি:

$ git log
commit a867b4af366350be2e7c21b8de9cc6504678a61b`
Author: Me <[email protected]>
Date:   Thu Nov 4 18:59:41 2010 -0400

blah blah blah...

commit 25eee4caef46ae64aa08e8ab3f988bc917ee1ce4
Author: Me <[email protected]>
Date:   Thu Nov 4 05:13:39 2010 -0400

more blah blah blah...

commit 0766c053c0ea2035e90f504928f8df3c9363b8bd
Author: Me <[email protected]>
Date:   Thu Nov 4 00:55:06 2010 -0400

And yet more blah blah...

commit 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
Author: Me <[email protected]>
Date:   Wed Nov 3 23:56:08 2010 -0400

Yep, more blah blah.

কিভাবে 3 নভেম্বর থেকে কমিট ফেরত করবেন, অর্থাত 0d1d7fc কমিট?


Answer #1

সাবধান! এই কমান্ডটি ভুলের ভুল ভুল করে রাখলে, প্রতারণার ইতিহাস হারাতে পারে। সর্বদা আপনার গিট অতিরিক্ত অতিরিক্ত ব্যাকআপ আছে যেখানে অন্য কিছু যদি আপনি ভুল করেন তবে আপনি আরও নিরাপদ। :)

আমারও অনুরূপ সমস্যা ছিল এবং আমি আগের কমিটিতে ফিরে যেতে চেয়েছিলাম। আমার ক্ষেত্রে আমি তাই ব্যবহৃত আমি নতুন কমিটি রাখা intetessered ছিল না Hard

এইভাবে আমি এটা করেছি:

git reset --hard CommitId && git clean -f

এটি git push -fরিমোট রিপোজিটরি আপডেট করার পরে এখানে স্থানীয় রিপোজিটরিতে ফিরে আসবে ।

git push -f

Answer #2

জেফমি এর সমাধানগুলির অতিরিক্ত বিকল্প

Jefromi এর সমাধান অবশ্যই সেরাতম , এবং আপনি অবশ্যই তাদের ব্যবহার করা উচিত। যাইহোক, সম্পূর্ণতার জন্য, আমি এই বিকল্প বিকল্পগুলিও দেখাতে চেয়েছিলাম যা একটি কমিট ফিরিয়ে আনতে ব্যবহার করা যেতে পারে (এই অর্থে যে আপনি একটি নতুন কমিটি তৈরি করেছেন যা পূর্ববর্তী কমিটিতে পরিবর্তনগুলিকে অদলবদল করে , ঠিক যেমনটি git revert করে) ।

স্পষ্ট হতে, এই বিকল্পগুলি প্রত্যাবর্তন করার সেরা উপায় নয় , জেরফমি এর সমাধানগুলি আছে , তবে আমি কেবল বলতে চাই যে আপনি একই পদ্ধতিটি git revert প্রত্যাহারের জন্য একই পদ্ধতিগুলি ব্যবহার করতে পারেন।

বিকল্প 1: হার্ড এবং নরম রিসেট

গিটের এসএএইচএ হ্যাশের একটি কমিটিতে ফিরে যাওয়ার জন্য চার্লস বেইলিয়ের সমাধানটি খুব সামান্য সংশোধিত সংস্করণ ? :

# Reset the index to the desired commit
git reset --hard <commit>

# Move the branch pointer back to the previous HEAD
git reset --soft [email protected]{1}

# Commit the changes
git commit -m "Revert to <commit>"

এটি মূলত এটি ব্যবহার করে কাজ করে যা নরম রিসেট সূচী / স্টেজিং-এরিয়াতে পূর্ববর্তী কমিটির অবস্থান ছেড়ে দেবে, যা আপনি পরে করতে পারেন।

বিকল্প 2: বর্তমান গাছটি মুছে দিন এবং নতুন একটিকে প্রতিস্থাপন করুন

এই সমাধানটি সুইচ এর সমাধান থেকে চেকআউট পুরানো কমিট থেকে আসে এবং এটি একটি নতুন কমিটি তৈরি করে :

git rm -r .
git checkout <commit> .
git commit

একইভাবে বিকল্প # 1 থেকে, এটি <commit> বর্তমান কাজ কপি অবস্থায় পুনঃপ্রবর্তন করে। প্রথমে git rm করতে হবে কারণ git checkout <commit> থেকে যে ফাইলগুলি যুক্ত করা হয়েছে তা সরিয়ে দেবে না।


Answer #3

সর্বাধিক সাম্প্রতিক Commit থেকে কাজ কপি ফিরে

পূর্ববর্তী কমিটিতে ফিরে যেতে, কোনও পরিবর্তন উপেক্ষা করা হচ্ছে:

git reset --hard HEAD

যেখানে মাথা আপনার বর্তমান শাখায় শেষ কমিট

একটি পুরানো কমিট ওয়ার্কিং অনুলিপি ফিরে

সবচেয়ে সাম্প্রতিক কমিটির চেয়ে পুরানো একটি কমিটিতে ফিরে যেতে:

# Resets index to former commit; replace '56e05fced' with your commit code
git reset 56e05fced 

# Moves pointer back to previous HEAD
git reset --soft [email protected]{1}

git commit -m "Revert to 56e05fced"

# Updates working copy to reflect the new commit
git reset --hard

ক্রেডিট একটি অনুরূপ স্ট্যাক ওভারফ্লো প্রশ্ন যেতে, গিট একটি এসএএইচ হ্যাশ একটি কমিট ফিরে?


Answer #4

আপনি নিম্নলিখিত দুটি আদেশ দ্বারা এটি করতে পারেন:

git reset --hard [previous Commit SHA id here]
git push origin [branch Name] -f

এটা আপনার আগের গিট কমিট মুছে ফেলা হবে।

আপনি যদি আপনার পরিবর্তনগুলি রাখতে চান তবে আপনি এটি ব্যবহার করতে পারেন:

git reset --soft [previous Commit SHA id here]

তারপর এটি আপনার পরিবর্তন সংরক্ষণ করা হবে।


Answer #5

আপনি যদি "অসম্মতি" করতে চান, সর্বশেষ প্রতিশ্রুতি বার্তাটি মুছে ফেলুন এবং সংশোধিত ফাইলগুলিকে স্টেজিংয়ে ফিরিয়ে দিন, আপনি কমান্ডটি ব্যবহার করবেন:

git reset --soft HEAD~1
  • --soft নির্দেশ করে যে --soft ফাইলগুলিকে অবশ্যই --soft বিপরীত ফাইল হিসাবে রাখা উচিত যা তাদের বাতিল করে দেবে।
  • HEAD~1 শেষ কমিট। আপনি যদি রোলব্যাক 3 করতে চান তবে আপনি HEAD~3 ব্যবহার করতে পারেন। আপনি যদি নির্দিষ্ট সংশোধন নম্বরটিতে রোলব্যাক করতে চান তবে আপনি এটির SHA হ্যাশ ব্যবহার করেও এটি করতে পারেন।

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

উত্স: http://nakkaya.com/2009/09/24/git-delete-last-commit/


Answer #6

আমার এবং সম্ভবত অন্যদের জন্য সেরা বিকল্পটি জিট রিসেট বিকল্প:

git reset --hard <commidId> && git clean -f

এই আমার জন্য সবচেয়ে ভাল বিকল্প হয়েছে! এটা সহজ, দ্রুত এবং কার্যকর!

দ্রষ্টব্য: মন্তব্য অনুযায়ী উল্লেখ করা হয় না যদি আপনি আপনার শাখাটি অন্য লোকেদের সাথে ভাগ করে নেবেন যারা পুরানো কাজগুলির কপি আছে

এছাড়াও মন্তব্য থেকে, যদি আপনি কম 'ballzy' পদ্ধতিটি ব্যবহার করতে চান তবে আপনি এটি ব্যবহার করতে পারেন

git clean -i


Answer #7

উত্তর দেওয়ার আগে কিছুটা ব্যাকগ্রাউন্ড যুক্ত করুন, এই HEAD কী ব্যাখ্যা করছে।

First of all what is HEAD?

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

HEAD সামগ্রীটি .git/HEAD ভিতরে সংরক্ষণ করা হয় এবং এটি বর্তমান .git/HEAD 40 বাইট SHA-1 ধারণ করে।

detached HEAD

যদি আপনি সর্বশেষ HEAD না হন - অর্থাত HEAD ইতিহাসে পূর্ববর্তী HEAD ইঙ্গিত দিচ্ছে, এটি হ'ল detached HEAD নামে পরিচিত।

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

একটি পৃথক 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 আবার সেট করবে।

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

git reflog
git checkout [email protected]{...}

এই আপনি আপনার পছন্দসই কমিটি ফিরে পাবেন

git reset HEAD --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.
  • দ্রষ্টব্য: ( গিট 2.7 থেকে ) এছাড়াও আপনি git rebase --no-autostash হিসাবেও ব্যবহার করতে পারেন।

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


Answer #8

এই সঠিক সংমিশ্রণ থেকে আমার জন্য এখানে কিছুই এখানে কাজ করে নি:

git reset --hard <commit_hash>
git push origin <branch_name> --force

এখানে চাপ ধাক্কা, কোন অতিরিক্ত commits / বার্তা প্রেরণ ইত্যাদি।


Answer #9

এটি আপনি "প্রত্যাবর্তন" দ্বারা অর্থ কি অনেক উপর নির্ভর করে।

সাময়িকভাবে একটি ভিন্ন কমিটিতে স্যুইচ করুন

যদি আপনি সাময়িকভাবে এটিতে ফিরে যান, চারপাশে বোকা বজায় রাখুন, তবে আপনি যেখানেই ফিরে আসেন, আপনাকে যা করতে হবে তা সবই পছন্দসই কমিটির চেক আউট করুন:

# This will detach your HEAD, that is, leave you with no branch checked out:
git checkout 0d1d7fc32

অথবা যদি আপনি সেখানে থাকাকালীন কাজ করতে চান তবে এগিয়ে যান এবং এটিতে থাকা অবস্থায় একটি নতুন শাখা তৈরি করুন:

git checkout -b old-state 0d1d7fc32

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

হার্ড মুছে ফেলা অপ্রকাশিত commits

অন্যদিকে, আপনি যেহেতু তার থেকে যা কিছু করেছেন তা পরিত্রাণ পেতে চান তবে দুটি সম্ভাবনা রয়েছে। এক, আপনি যদি এই কোনও কাজ প্রকাশ না করে থাকেন তবে কেবল পুনরায় সেট করুন:

# 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.

আপনি যদি জগাখিচুড়ি হয়ে যান, তবে আপনি ইতিমধ্যে আপনার স্থানীয় পরিবর্তনগুলি সরিয়ে ফেলেছেন, তবে আপনি অন্তত পুনরায় সেট করে আগে যেখানে ছিলেন সেখানে ফিরে যেতে পারেন।

নতুন commits সঙ্গে প্রকাশিত commits পূর্বাবস্থায় ফেরানো

অন্যদিকে, যদি আপনি কাজটি প্রকাশ করেছেন তবে আপনি সম্ভবত শাখাটি পুনরায় সেট করতে চান না, কারণ এটি কার্যকরভাবে ইতিহাস পুনর্বিবেচনা করা। যে ক্ষেত্রে, আপনি সত্যিই commits প্রত্যাবর্তন করতে পারে। গিটের সাথে, প্রত্যাবর্তনের একটি খুব নির্দিষ্ট অর্থ রয়েছে: এটি বাতিল করতে বিপরীত প্যাচ দিয়ে একটি কমিটি তৈরি করুন। এই ভাবে আপনি কোন ইতিহাস পুনর্লিখন করবেন না।

# This will create three separate revert commits:
git revert a867b4af 25eee4ca 0766c053

# It also takes ranges. This will revert the last two commits:
git revert HEAD~2..HEAD

#Similarly, you can revert a range of commits using commit hashes:
git revert a867b4af..0766c053 

# Reverting a merge commit
git revert -m 1 <merge_commit_sha>

# To get just one, you could use `rebase -i` to squash them afterwards
# Or, you could do it manually (be sure to do this at top level of the repo)
# get your index and work tree into the desired state, without changing HEAD:
git checkout 0d1d7fc32 .

# Then commit. Be sure and write a good message describing what you just did
git commit

git-revert ম্যানপ্যাজ আসলে তার বিবরণে এই অনেক কভার। আরেকটি দরকারী লিঙ্ক এই git-scm.com অধ্যায় git-revert আলোচনা

আপনি যদি সব পরে ফিরে যেতে না চান তবে আপনি প্রত্যাবর্তন (এখানে বর্ণিত হিসাবে) প্রত্যাবর্তন করতে পারেন বা ফিরতি (পূর্ববর্তী বিভাগটি দেখুন) এর আগে পুনরায় সেট করতে পারেন।

আপনি এই ক্ষেত্রে এই উত্তর সহায়ক খুঁজে পেতে পারেন:
কিভাবে একটি পূর্ববর্তী অবস্থান ফিরে শিরোনাম সরানো? (বিচ্ছিন্ন মাথা)


Answer #10

পূর্ববর্তী কমিটিতে ফিরে যাওয়ার জন্য এখানে একটি সরল উপায় (এবং এটি একটি অসামঞ্জস্যপূর্ণ অবস্থায় রয়েছে, যা আপনি চান তা করতে):

git reset HEAD~1

তাই, commit আইডস এবং তাই করার কোন প্রয়োজন :)


Answer #11

ঠিক আছে, গিট পূর্ববর্তী কমিট ফিরে যাওয়া বেশ সহজ ...

পরিবর্তনগুলি রেখে আবার ফিরে আসুন:

git reset --hard <commit>

পরিবর্তনগুলি রেখে আবার ফিরে যান:

git reset --soft <commit>

ব্যাখ্যা করুন: গিট রিসেট ব্যবহার করে, আপনি একটি নির্দিষ্ট অবস্থানে পুনরায় সেট করতে পারেন, এটি উপরের হিসাবে আপনি একটি কমিটি হ্যাশ সঙ্গে এটি ব্যবহার সাধারণ।

কিন্তু আপনি পার্থক্যটি দেখছেন দুটি ফ্ল্যাগ ব্যবহার করে - --soft এবং --soft , --soft পতাকা ব্যবহার করে ডিফল্ট git reset দ্বারা, কিন্তু পতাকাটি ব্যবহার করে এটি সর্বদা ভাল অনুশীলন, আমি প্রতিটি পতাকা ব্যাখ্যা করি:

--soft

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

--hard

এই পতাকা দিয়ে সাবধান হোন, এটি কাজ করে গাছ এবং ট্র্যাক করা ফাইলগুলিতে সমস্ত পরিবর্তন রিসেট করে এবং সব চলে যাবে!

আমি নীচের ছবিটি তৈরি করেছি যা জিট দিয়ে কাজ করে এমন একটি বাস্তব জীবনে ঘটতে পারে:


Answer #12

আপনার প্রয়োজনীয় কমিটি নির্বাচন করুন, এবং এটি দ্বারা চেক

git show HEAD
git show HEAD~1
git show HEAD~2 

আপনি প্রয়োজনীয় কমিটি পেতে পর্যন্ত। যে HEAD বিন্দু করতে, করতে

git reset --hard HEAD~1

বা git reset --hard HEAD~2যাই হোক না কেন।


Answer #13

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

git reset --hard origin/master

https://superuser.com/questions/273172/how-to-reset-master-to-origin-master


Answer #14

কিছু দুর্ঘটনাজনিত পরিবর্তন থেকে কোনও কোডারের ডিরেক্টরিটি সম্পূর্ণরূপে পরিষ্কার করতে আমরা ব্যবহার করেছি:

git add -A .
git reset --hard HEAD

শুধু git reset --hard HEADপরিবর্তন পরিত্রাণ পেতে হবে, কিন্তু এটি "নতুন" ফাইল পরিত্রাণ পাবেন না। তাদের ক্ষেত্রে তারা ঘটনাক্রমে কোথাও এলোমেলোভাবে একটি গুরুত্বপূর্ণ ফোল্ডার টেনে আনেন এবং সমস্ত ফাইলগুলি Git দ্বারা নতুন হিসাবে বিবেচিত হচ্ছিল, সুতরাং reset --hardএটি ঠিক করা হয়নি। git add -A .পূর্বে চলমান দ্বারা , এটা স্পষ্টভাবে রিট দ্বারা নিশ্চিহ্ন করা, git সঙ্গে তাদের সব ট্র্যাক।


Answer #15

পূর্ববর্তী প্রতিশ্রুতি থেকে HEAD এ পরিবর্তনগুলি রাখা এবং পূর্ববর্তী কমিটিতে যাওয়ার জন্য, তা করুন:

git reset <SHA>

যদি পূর্ববর্তী কমিটি থেকে HEAD এ পরিবর্তনগুলি প্রয়োজন হয় না এবং কেবলমাত্র সমস্ত পরিবর্তন বাতিল করা হয় তবে তা করুন:

git reset --hard <SHA>

Answer #16

প্রত্যাবর্তন কমান্ড রোলব্যাক কমান্ড।

git revert <commit1> <commit2> 

নমুনা:

git revert 2h3h23233

এটা নীচের মত মাথা থেকে পরিসীমা নিতে সক্ষম। এখানে 1 বলেছেন "শেষ কমিট ফিরে।"

git revert HEAD~1..HEAD

এবং তারপর করবেন git push


Answer #17

সমস্ত পরিবর্তন করার পরে, যখন আপনি এই সমস্ত কমান্ডগুলি ধাক্কা দিবেন, তখন আপনাকে ব্যবহার করতে হবে:

git push -f ...

এবং শুধুমাত্র না git push


Answer #18

সাম্প্রতিক কমিটিতে ফিরে যান এবং সমস্ত স্থানীয় পরিবর্তনগুলি উপেক্ষা করুন:

git reset --hard HEAD

Answer #19

একটি কমান্ড (কোর গিটের অংশ নয়, তবে এটি git-extras প্যাকেজগুলির মধ্যে রয়েছে) বিশেষ করে পুরানো কাজগুলি ফিরিয়ে দেওয়ার এবং স্টেজ করার জন্য:

git back

প্রতি man পৃষ্ঠা , এটি যেমন ব্যবহার করা যেতে পারে:

# Remove the latest three commits
git back 3

Answer #20

যদি আপনি শেষ কমিটিতে কিছু ত্রুটি সংশোধন করতে চান তবে একটি ভাল বিকল্প git commit --amend কমান্ড ব্যবহার করবে । যদি কোনও রেফারেন্সের দ্বারা সর্বশেষ কমিটির নির্দেশ দেওয়া হয় না, তবে এটিই কৌশলটি করবে, কারণ এটি একই পিতামাতার সাথে শেষ চুক্তি হিসাবে অঙ্গীকার করে। যদি শেষ কমিটির কোন রেফারেন্স না থাকে তবে এটি কেবল বাতিল করা হবে এবং এই কমিটিটি শেষ কমিট হবে। এই commits প্রত্যাবর্তন ছাড়া commits সংশোধন করার একটি ভাল উপায়। তবে এটি নিজস্ব সীমাবদ্ধতা আছে।






git-revert