নির্দিষ্ট প্রতিশ্রুতি মুছে ফেলুন


287

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

সুতরাং এখানে প্রশ্নের সরলীকৃত সংস্করণ:

নিম্নলিখিত দৃশ্যের পরিপ্রেক্ষিতে, আমি কীভাবে প্রতিশ্রুতি 2 অপসারণ করব?

$ mkdir git_revert_test && cd git_revert_test

$ git init
Initialized empty Git repository in /Users/josh/deleteme/git_revert_test/.git/

$ echo "line 1" > myfile

$ git add -A

$ git commit -m "commit 1"
[master (root-commit) 8230fa3] commit 1
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 myfile

$ echo "line 2" >> myfile

$ git commit -am "commit 2"
[master 342f9bb] commit 2
 1 files changed, 1 insertions(+), 0 deletions(-)

$ echo "line 3" >> myfile

$ git commit -am "commit 3"
[master 1bcb872] commit 3
 1 files changed, 1 insertions(+), 0 deletions(-)

প্রত্যাশিত ফলাফল

$ cat myfile
line 1
line 3

আমি কীভাবে ফিরে যাওয়ার চেষ্টা করেছি তার একটি উদাহরণ এখানে

$ git revert 342f9bb
Automatic revert failed.  After resolving the conflicts,
mark the corrected paths with 'git add <paths>' or 'git rm <paths>'
and commit the result.

4
একই সমস্যাটি অনুসন্ধান করার সময় যদি কেউ এটির সন্ধান করে তবে আমি এখানে যা করতে শেষ করেছি তা অনুলিপি করুন: অনুলিপি করুন এবং আটকান। সিরিয়াসলি। কাজের জন্য প্রস্তাবিত সমাধানগুলি পাওয়ার জন্য 6+ ঘন্টা ব্যয় করে কোনও লাভ হয়নি। শেষ অবধি, আমি সময়ের বাইরে ছিলাম, মূলটি টানলাম এবং প্রায় 20 টি ফাইল অনুলিপি / আটকানো হয়েছি। ৫ মিনিটের মধ্যে সময় নিয়েছে এবং তখন থেকেই জিনিসগুলি ঠিক হয়ে গেছে (এই ফাইলগুলির আগে এই শাখাগুলি অন্য শাখাগুলির পরিবর্তনের সাথে মিশে গিয়েছিল)। আমি আপনাকে এই পদ্ধতিরও গ্রহণ করার পরামর্শ দিচ্ছি। এটি কেবল সবচেয়ে সহজ নয়, আমি সন্দেহ করি এটি কেবল কাজ করে।
জোশুয়া গাল

আমি একই ধরণের সমস্যার মুখোমুখি হয়েছি, তবে সম্ভবত আরও জটিল: আমি স্কোয়াশ করতে চেয়েছি এমন কয়েকশো কমিটের সাথে একটি শাখা ছিল। দুর্ভাগ্যক্রমে অন্য শাখা থেকে করা চুক্তিগুলি একটি মধ্যবর্তী পয়েন্টে আবার শাখায় একীভূত হয়েছিল, সুতরাং আমি স্কোয়াশ করার আগে একটি "আনারমিজ" দরকার ছিল। আমি নীচে টি কে (চেরি পিকিং + রেঞ্জ নোটেশনটি ব্যবহার করে) এর পরামর্শ অনুসারে অনুরূপ পথে চলেছি, তবে এটি অন্য কয়েকটি ফাইলে বিরোধ সৃষ্টি করেছে। শেষের অনুলিপি এবং পেস্ট করুন + কয়েক ম্যানুয়াল সম্পাদনাগুলি ছিল সহজতম এবং সবচেয়ে অনুমানযোগ্য পথ এগিয়ে। আপনি যদি নিজেকে এই বিষয়ে খুব বেশি সময় ব্যয় করে দেখতে পান তবে অবশ্যই তা বিবেচনার জন্য worth
ফেডারিকো

উত্তর:


73

ডিফের পরিবর্তনের জন্য গণনা করার সময় গিট যে অ্যালগরিদম ব্যবহার করে তা প্রয়োজন

  1. উল্টানো রেখাগুলি কোনও পরবর্তী কমিটি দ্বারা সংশোধিত হয় না।
  2. ইতিহাসের পরে আর কোনও "সংলগ্ন" কমিট না করে থাকে।

"সংলগ্ন" এর সংজ্ঞাটি একটি প্রসঙ্গের পার্থক্যের থেকে লাইনগুলির ডিফল্ট সংখ্যার উপর ভিত্তি করে তৈরি হয়, যা ৩ So তাই যদি 'মাইফাইল' এভাবে নির্মিত হয়:

$ cat >myfile <<EOF
line 1
junk
junk
junk
junk
line 2
junk
junk
junk
junk
line 3
EOF
$ git add myfile
$ git commit -m "initial check-in"
 1 files changed, 11 insertions(+), 0 deletions(-)
 create mode 100644 myfile

$ perl -p -i -e 's/line 2/this is the second line/;' myfile
$ git commit -am "changed line 2 to second line"
[master d6cbb19] changed line 2
 1 files changed, 1 insertions(+), 1 deletions(-)

$ perl -p -i -e 's/line 3/this is the third line/;' myfile
$ git commit -am "changed line 3 to third line"
[master dd054fe] changed line 3
 1 files changed, 1 insertions(+), 1 deletions(-)

$ git revert d6cbb19
Finished one revert.
[master 2db5c47] Revert "changed line 2"
 1 files changed, 1 insertions(+), 1 deletions(-)

তারপরে এটি সমস্ত প্রত্যাশার মতো কাজ করে।

দ্বিতীয় উত্তরটি খুব আকর্ষণীয় ছিল। একটি বৈশিষ্ট্য রয়েছে যা এখনও আনুষ্ঠানিকভাবে প্রকাশিত হয়নি (যদিও এটি গিট ভি 1.7.2-আরসি 2 এ উপলব্ধ) রিভার্ট কৌশল বলে। আপনি এইভাবে গিটকে ডাকতে পারেন:

গিট রিভার্ট - স্ট্রেটজি রেজোলিউশন <কমিট>

এবং আপনার অর্থ কী তা বোঝার জন্য এটি আরও ভাল কাজ করা উচিত। উপলব্ধ কৌশলগুলির তালিকা কী তা আমি জানি না এবং আমি কোনও কৌশলের সংজ্ঞাও জানি না।


1
perl -pখুব স্বল্প (এক লাইন) প্রোগ্রাম যা লুপ এবং লেখার জন্য দরকারী পাস আউটপুট, কিন্তু অনুরূপ মাধ্যমে তাদের ইনপুট। জায়গায়perl -i ফাইল সম্পাদনা করার জন্য ব্যবহৃত হয়perl -eকোডটি মূল্যায়ন করার জন্য কীভাবে জমা দিতে হয় ।
হাল আইসেন

281

এটি করার চারটি উপায় রয়েছে:

  • পরিষ্কার উপায়, পুনরায় ঘুরিয়ে ফিরুন তবে রিভার্টটি লগইন করুন:

    git revert --strategy resolve <commit>
    
  • কঠোর উপায়, সম্পূর্ণরূপে কেবলমাত্র শেষ প্রতিশ্রুতি সরিয়ে ফেলুন:

    git reset --soft "HEAD^"
    

দ্রষ্টব্য: এড়িয়ে চলুন git reset --hardকারণ এটি প্রতিশ্রুতিবদ্ধ হওয়ার পরে ফাইলগুলিতে সমস্ত পরিবর্তন বাতিল করে দেবে। যদি --softকাজ না করে, বরং চেষ্টা করুন --mixedবা --keep

  • রিবেস (সর্বশেষ 5 টির কমিটের লগটি দেখান এবং আপনি চান না এমন লাইনগুলি মুছে ফেলুন বা পুনরায় অর্ডার করুন, বা একের মধ্যে একাধিক কমিটি স্কোয়াশ করুন বা আপনি চান অন্য কিছু করুন, এটি খুব বহুমুখী সরঞ্জাম):

    git rebase -i HEAD~5
    

এবং যদি কোনও ভুল হয়:

git rebase --abort
  • দ্রুত পুনর্বাসন: এটির আইডি ব্যবহার করে কেবল একটি নির্দিষ্ট প্রতিশ্রুতি সরিয়ে দিন:

    git rebase --onto commit-id^ commit-id
    
  • বিকল্প: আপনি চেষ্টা করতে পারেন:

    git cherry-pick commit-id
    
  • তবুও অন্য বিকল্প:

    git revert --no-commit
    
  • শেষ অবলম্বন হিসাবে, আপনার যদি ইতিহাস সম্পাদনার সম্পূর্ণ স্বাধীনতার প্রয়োজন হয় (যেমন, কারণ আপনি যা চান তা সম্পাদনা করার অনুমতি দেয় না), আপনি খুব দ্রুত ওপেন সোর্স অ্যাপ্লিকেশনটি ব্যবহার করতে পারেন : রিপোসার্জন

দ্রষ্টব্য: অবশ্যই, এই সমস্ত পরিবর্তনগুলি স্থানীয়ভাবে করা হয়, git pushপরে আপনাকে দূরবর্তীতে পরিবর্তনগুলি প্রয়োগ করতে হবে। এবং যদি আপনার রেপো প্রতিশ্রুতি অপসারণ করতে না চায় ("কোনও ফাস্ট-ফরোয়ার্ড অনুমোদিত নয়", যখন আপনি ইতিমধ্যে ঠেকানো একটি প্রতিশ্রুতি সরিয়ে নিতে চান তখন ঘটে থাকে), আপনি git push -fপরিবর্তনগুলি জোর করে চাপাতে ব্যবহার করতে পারেন ।

দ্রষ্টব্য 2: যদি কোনও শাখায় কাজ করা হয় এবং আপনাকে জোর করে চাপ দিতে হবে তবে আপনার একেবারে এড়ানো উচিত git push --forceকারণ এটি অন্যান্য শাখাগুলিকে ওভাররাইট করতে পারে (যদি আপনার বর্তমান চেকআউট অন্য কোনও শাখায় থাকে এমনকি) them পছন্দ যখন আপনি ধাক্কা বাধ্য সবসময় দূরবর্তী শাখা উল্লেখ : git push --force origin your_branch


@ গাবরস এর পরামর্শের ভিত্তিতে: একটি "গিট রিবেস -i হেড ~ 2" করুন। এখন আপনার কাছে বেশ কয়েকটি বিকল্প রয়েছে। ভিমে আপনি কিছু মন্তব্য করা লাইন দেখতে পাবেন: এর মধ্যে একটি আপনাকে বলে যে আপনি কেবল একটি লাইন মুছে ফেলতে পারেন (যা আপনি মুক্তি পেতে চান এমন প্রতিশ্রুতি হওয়া উচিত) এবং এই প্রতিশ্রুতিটি আপনার ইতিহাসে লগ হওয়ার সাথে একসাথে সরানো হবে।
ইলকার বিড়াল

গিট রিভার্ট - স্ট্রেটজি রিলিজ <কমিট>। এই কমান্ডটি আমার পক্ষে কাজ করেছে। ধন্যবাদ :)
স্বাথিন

2
git rebase -i HEAD~5আমার জন্য কাজ। তারপরে আমি কেবল আমার যে প্রতিশ্রুতিগুলির প্রয়োজন নেই তা সরিয়েছি এবং আমি 30 সেকেন্ডেরও কম সময়ে সমস্যার সমাধান করতে সক্ষম হয়েছি। ধন্যবাদ.
lv10

116

এখানে একটি সহজ সমাধান:

git rebase -i HEAD~x

(দ্রষ্টব্য: xকমিটের সংখ্যা)

নোটপ্যাড চালানোর পরে ফাইলটি ওপেন হবে। dropআপনার অঙ্গীকার ছাড়াও প্রবেশ করুন।
আপনি যদি ভিম না জানেন তবে প্রতিটি শব্দ চয়ন করতে আপনি যে সম্পাদনা করতে চান তার উপর ক্লিক করুন এবং তারপরে "আই" কী (সন্নিবেশ মোডের জন্য) টিপুন। একবার আপনি টাইপিংয়ের পরে সন্নিবেশ মোড থেকে প্রস্থান করতে "এসকে" কী টিপুন।



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

এবং এটি হ'ল, আপনি হয়ে গেছেন ... গিট ড্যাশবোর্ডটি কেবল সিঙ্ক করুন এবং পরিবর্তনগুলি রিমোটে ঠেলা যাবে।

আপনি যে প্রতিশ্রুতিটি ফেলেছেন তা যদি ইতিমধ্যে দূরবর্তী স্থানে থাকে তবে আপনাকে জোর করে চাপ দিতে হবে। যেহেতু - ফোর্স ক্ষতিকারক হিসাবে বিবেচিত হয় , তাই ব্যবহার করুনgit push --force-with-lease


আপনি যদি কেবল প্রশ্নটির মধ্যে কমিটের হ্যাশ জানেন তবে 'এক্স' কী হওয়া উচিত তা জানার কোনও ভাল উপায় আছে?
jlewkovich

1
সিপিপি-মানসিকতার লোকদের জন্য: এক্স (কমিটের সংখ্যা) অন্তর্ভুক্ত নয়। যেমন হেড HE 4 এর মধ্যে সর্বশেষ 4 টি কমিট অন্তর্ভুক্ত থাকে।
হার্পিস ফ্রি ইঞ্জিনিয়ার

নিখুঁত পরামর্শ। কেবল যুক্ত করতে চান, এটি বাদ পড়া কমিট থেকে পরিবর্তনগুলিও বাতিল করে দেয়।
সেলার্নো

1
আমার প্রিয় উত্তর, আমার সমস্যার সমাধান করেছেন!
ড্যানিয়েল ড্যানিয়েলেকি

1
@ ইউস্টিন এটি 3 ডলার নয় -3
জেডি-ভি

37

আপনার পছন্দ মধ্যে

  1. ত্রুটি রাখা এবং একটি সংশোধন এবং
  2. ত্রুটি অপসারণ এবং ইতিহাস পরিবর্তন করা।

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

গিট রিভার্ট হ'ল একটি স্বয়ংক্রিয় সরঞ্জাম (1), এটি কিছু পূর্ববর্তী প্রতিশ্রুতি পূর্বাবস্থায়িত করে একটি নতুন কমিট তৈরি করে। আপনি প্রকল্পের ইতিহাসে ত্রুটি এবং অপসারণটি দেখতে পাবেন কিন্তু যারা আপনার সংগ্রহশালা থেকে টানছেন তারা আপডেট হওয়ার সাথে সাথে সমস্যার মধ্যে পড়বে না। এটি আপনার উদাহরণে একটি স্বয়ংক্রিয় পদ্ধতিতে কাজ করছে না সুতরাং আপনাকে 'মাইফিল' সম্পাদনা করতে হবে (লাইন 2 অপসারণ করতে) git add myfileএবং git commitসংঘাত মোকাবেলা করতে হবে। এরপরে আপনি আপনার ইতিহাসে চারটি প্রতিশ্রুতি দিয়ে শেষ করবেন, প্রতিশ্রুতি 4 ফেরত প্রতিশ্রুতি 2 দিয়ে।

যদি কেউ আপনার ইতিহাস পরিবর্তিত হয় সেদিকে খেয়াল না করে আপনি এটিকে পুনরায় লিখতে এবং কমিট 2 (পছন্দ 2) মুছে ফেলতে পারেন। এটি করার সহজ উপায় হ'ল ব্যবহার করা git rebase -i 8230fa3। এটি আপনাকে সম্পাদক হিসাবে ফেলে দেবে এবং আপনি কমিটগুলি অপসারণ করে (এবং অন্যান্য প্রতিশ্রুতিবদ্ধ বার্তাগুলির পাশে "বাছাই" রেখে ভুল কাজটি অন্তর্ভুক্ত না করা বেছে নিতে পারেন this এটি করার পরিণতি সম্পর্কে পড়ুন


রিবেস জটিল হতে পারে, যেহেতু মনে হচ্ছে এটি একত্রীকরণ হয়েছে।
ক্যাসকেবেল

3
গিট রিবেস -i 8230fa3, এবং কমিটের লাইনটি মুছে ফেলা আমার কেবল স্থানীয় স্থানীয় পরিবর্তনগুলি নিয়ে আমার পক্ষে দুর্দান্ত কাজ করেছে। ধন্যবাদ!
শমূয়েল

26

অ্যাপ্রোচ ঘ

প্রথমে আপনাকে ফিরিয়ে নিতে হবে এমন প্রতিশ্রুতিবদ্ধ হ্যাশ (উদা: 1406cd61) পান। সাধারণ ফিক্স কমান্ডের নীচে থাকবে,

$ git revert 1406cd61

1406cd61 কমিট করার পরে আপনার যদি 1406cd61 ফাইল সম্পর্কিত আরও পরিবর্তন করা থাকে তবে উপরের সরল কমান্ডটি কাজ করবে না। তারপরে আপনাকে নীচের পদক্ষেপগুলি করতে হবে যা চেরি বাছাই।

অ্যাপ্রোচ 2

দয়া করে নীচের ক্রিয়াগুলির ক্রিয়াকলাপ অনুসরণ করুন, যেহেতু আমরা ব্যবহার করছি - বল এটি করার জন্য আপনার গিট রেপোর উপর প্রশাসনিক অধিকার থাকা দরকার।

পদক্ষেপ 1: আপনি যে প্রতিশ্রুতি অপসারণ করতে চান তার আগে কমিট সন্ধান করুনgit log

পদক্ষেপ 2: প্রতিশ্রুতিবদ্ধ যে চেকআউটgit checkout <commit hash>

ধাপ 3: আপনার বর্তমান চেকআউট প্রতিশ্রুতি ব্যবহার করে একটি নতুন শাখা তৈরি করুনgit checkout -b <new branch>

পদক্ষেপ 4: এখন আপনাকে সরিয়ে দেওয়া প্রতিশ্রুতি দেওয়ার পরে কমিট যুক্ত করতে হবেgit cherry-pick <commit hash>

পদক্ষেপ 5: এখন আপনি যে সমস্ত অন্যান্য কমিট রাখতে চান তার জন্য পদক্ষেপ 4 পুনরাবৃত্তি করুন।

পদক্ষেপ।: একবার সমস্ত নতুন কমিটি আপনার নতুন শাখায় যুক্ত হয়ে কমিট হয়ে গেছে। যাচাই করুন যে সবকিছু সঠিক অবস্থায় রয়েছে এবং উদ্দেশ্য হিসাবে কাজ করছে। ডাবল চেক সব কিছু করা হয়েছে:git status

পদক্ষেপ 7: আপনার ভাঙ্গা শাখায় স্যুইচ করুনgit checkout <broken branch>

পদক্ষেপ 8: এখন আপনি যেটিকে সরাতে চান তার পূর্বে প্রতিশ্রুতিবদ্ধ হওয়ার জন্য ভাঙ্গা শাখায় একটি হার্ড রিসেট করুনgit reset --hard <commit hash>

পদক্ষেপ 9: আপনার স্থির শাখাটি এই শাখায় মার্জ করুনgit merge <branch name>

পদক্ষেপ 10: একীভূত পরিবর্তনগুলিকে আবার উত্সে ঠেকান। সতর্কতা: এটি রিমোট রেপোকে ওভাররাইট করে দেবে!git push --force origin <branch name>

পদক্ষেপ 2 এবং 3 এর পরিবর্তে পদক্ষেপ 8 দিয়ে নতুন শাখা তৈরি না করে আপনি প্রক্রিয়াটি করতে পারেন তবে পদক্ষেপ 7 এবং 9 চালাবেন না।


1
প্রথম পদ্ধতির একটি কবজ মত কাজ। এটিতে আপনার একটি প্রতিশ্রুতি রয়েছে যা উল্লেখ করে যে আপনার কাঙ্ক্ষিত প্রতিশ্রুতি ফিরিয়ে দেওয়া হয়েছে যা ট্র্যাকিংয়ের উদ্দেশ্যে সত্যই দুর্দান্ত।
suarsenegger

18

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

git checkout -b tmp-branch my-topic-branch  # Use a temporary branch to be safe.
git rebase -i master  # Interactively rebase against master branch.

এই মুহুর্তে আপনার পাঠ্য সম্পাদকটি ইন্টারেক্টিভ রিবেস ভিউটি খুলবে। উদাহরণ স্বরূপ

Git-রি-বেসের ফলে-করণীয়

  1. আপনি চাইছেন না এমন কমিটগুলি তাদের লাইনগুলি মুছে ফেলা করুন
  2. সংরক্ষণ করুন এবং প্রস্থান করুন

যদি রিবেসটি সফল না হয়, অস্থায়ী শাখাটি মুছুন এবং অন্য কৌশলটি ব্যবহার করে দেখুন। অন্যথায় নিম্নলিখিত নির্দেশাবলীর সাথে চালিয়ে যান।

git checkout my-topic-branch
git reset --hard tmp-branch  # Overwrite your topic branch with the temp branch.
git branch -d tmp-branch  # Delete the temporary branch.

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


আপনি দয়া করে 'অন্য কৌশল চেষ্টা করে' এর উদাহরণ দিতে পারেন?
pfabri

@ ফাফাব্রি আপনি উদাহরণস্বরূপ চেরি-বেছে নিতে পারেন যেখানে আপনি দু'টি প্রতিশ্রুতিবদ্ধ কাজটি বাদ দেন। আপনি খারাপ প্রতিশ্রুতি ফিরিয়ে দিতে পারে। আপনি নিজে পরিবর্তনগুলি পূর্বাবস্থায়িত করে, বা খারাপ প্রতিশ্রুতি ছাড়াই একটি নতুন শাখা থেকে শুরু করে এবং নিজেই ভাল পরিবর্তনগুলি আবারও গিট সমাধান ব্যবহার এড়াতে পারেন। যদি খারাপ প্রতিশ্রুতিবদ্ধ সংবেদনশীল ডেটা থাকে, আপনার আরও যত্নশীল কৌশল দরকার: help.github.com/en/articles/…
ডেনিস

8

অন্যান্য উত্তরগুলি থেকে, আমি কোনও ধরনের git rebase -iপ্রতিশ্রুতি অপসারণের জন্য কীভাবে ব্যবহার করা যেতে পারে সে সম্পর্কে আমি বিভ্রান্ত হয়ে পড়েছিলাম, সুতরাং আমি আশা করি আমার পরীক্ষার কেসটি এখানে (ওপি'র সাথে খুব মিল) লিখে দেওয়া ঠিক হবে।

এখানে একটি bashস্ক্রিপ্ট রয়েছে যা আপনি /tmpফোল্ডারে পরীক্ষার সংগ্রহ তৈরি করতে পেস্ট করতে পারেন :

set -x

rm -rf /tmp/myrepo*
cd /tmp

mkdir myrepo_git
cd myrepo_git
git init
git config user.name me
git config user.email me@myself.com

mkdir folder
echo aaaa >> folder/file.txt
git add folder/file.txt
git commit -m "1st git commit"

echo bbbb >> folder/file.txt
git add folder/file.txt
git commit -m "2nd git commit"

echo cccc >> folder/file.txt
git add folder/file.txt
git commit -m "3rd git commit"

echo dddd >> folder/file.txt
git add folder/file.txt
git commit -m "4th git commit"

echo eeee >> folder/file.txt
git add folder/file.txt
git commit -m "5th git commit"

এই মুহুর্তে, আমাদের file.txtএই সামগ্রীগুলির সাথে একটি রয়েছে:

aaaa
bbbb
cccc
dddd
eeee

এই মুহুর্তে, হেড 5 তম প্রতিশ্রুতিতে রয়েছে, হেড ~ 1 4 র্থ হবে - এবং হেড ~ 4 হবে প্রথম কমিট (সুতরাং হেড ~ 5 থাকবে না)। ধরা যাক আমরা তৃতীয় প্রতিশ্রুতি মুছে ফেলতে চাই - আমরা এই আদেশটি myrepo_gitডিরেক্টরিতে জারি করতে পারি :

git rebase -i HEAD~4

( দ্রষ্টব্য যে git rebase -i HEAD~5"মারাত্মক: একটি একক সংশোধন প্রয়োজন; অবৈধ আপস্ট্রিম হেড ~ 5" এর ফলাফল রয়েছে )) একটি পাঠ্য সম্পাদক ( @ ডেনিসের উত্তরে স্ক্রিনশট দেখুন ) এই বিষয়বস্তুগুলির সাথে খুলবে:

pick 5978582 2nd git commit
pick 448c212 3rd git commit
pick b50213c 4th git commit
pick a9c8fa1 5th git commit

# Rebase b916e7f..a9c8fa1 onto b916e7f
# ...

সুতরাং আমরা আমাদের অনুরোধকৃত হেড ~ 4 এর পর থেকে সমস্ত কমিটগুলি পাই (তবে অন্তর্ভুক্ত নয় )। লাইনটি মুছুন pick 448c212 3rd git commitএবং ফাইলটি সংরক্ষণ করুন; আপনি এই প্রতিক্রিয়া পাবেন git rebase:

error: could not apply b50213c... 4th git commit

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To check out the original branch and stop rebasing run "git rebase --abort".
Could not apply b50213c... 4th git commit

এই সময়ে myrepo_git / folder/file.txtএকটি পাঠ্য সম্পাদককে খুলুন ; আপনি দেখতে পাবেন এটি সংশোধিত হয়েছে:

aaaa
bbbb
<<<<<<< HEAD
=======
cccc
dddd
>>>>>>> b50213c... 4th git commit

মূলত, দেখুন gitযে হেড যখন দ্বিতীয় প্রতিশ্রুতিতে আসে তখন aaaa+ এর বিষয়বস্তু ছিল bbbb; এবং তারপর এটি যোগ একটি প্যাচ রয়েছে cccc+ + ddddযা বিদ্যমান সামগ্রী লিখবেন কিভাবে জানে না।

সুতরাং এখানে gitআপনার জন্য সিদ্ধান্ত নিতে পারে না - আপনিই কে সিদ্ধান্ত নিতে হবে: তৃতীয় প্রতিশ্রুতি সরিয়ে দিয়ে আপনি হয় তা দ্বারা প্রবর্তিত পরিবর্তনগুলি ccccরাখেন (এখানে, লাইন ) - বা আপনি তা করেন না। যদি তা না হয়, কেবল অতিরিক্ত লাইন অপসারণ - সহ ccccমধ্যে - folder/file.txt, একটি টেক্সট সম্পাদক ব্যবহার করে যাতে এটা ভালো দেখায়:

aaaa
bbbb
dddd

... এবং তারপরে সংরক্ষণ করুন folder/file.txt। এখন আপনি নিম্নলিখিত কমান্ড myrepo_gitডিরেক্টরিতে ইস্যু করতে পারেন :

$ nano folder/file.txt  # text editor - edit, save
$ git rebase --continue
folder/file.txt: needs merge
You must edit all merge conflicts and then
mark them as resolved using git add

আহ - তাই চিহ্ন করার যে আমরা দ্বন্দ্ব মীমাংসিত করেছি, আমরা নয় , আগে করছেন :git addfolder/file.txtgit rebase --continue

$ git add folder/file.txt
$ git rebase --continue

এখানে একটি পাঠ্য সম্পাদক আবার খোলে, লাইনটি দেখিয়ে 4th git commit- এখানে আমাদের কাছে প্রতিশ্রুতি বার্তা পরিবর্তন করার সুযোগ রয়েছে (যা এই ক্ষেত্রে অর্থপূর্ণভাবে পরিবর্তিত হতে পারে 4th (and removed 3rd) commitবা এর সাথে মিলে যায়)। যাক আপনি চান না - সুতরাং সংরক্ষণ না করে কেবল পাঠ্য সম্পাদক থেকে প্রস্থান করুন; একবার আপনি এটি করেন, আপনি পাবেন:

$ git rebase --continue
[detached HEAD b8275fc] 4th git commit
 1 file changed, 1 insertion(+)
Successfully rebased and updated refs/heads/master.

এই মুহুর্তে, এখন আপনার কাছে এমন একটি ইতিহাস রয়েছে (যা আপনি বলতে gitk .বা অন্যান্য সরঞ্জাম দিয়েও পরিদর্শন করতে পারেন ) মূল বিষয়গুলির folder/file.txt(দৃশ্যত, অপরিবর্তিত টাইমস্ট্যাম্পগুলি সহ):

1st git commit  |  +aaaa
----------------------------------------------
2nd git commit  |   aaaa
                |  +bbbb
----------------------------------------------
4th git commit  |   aaaa
                |   bbbb
                |  +dddd
----------------------------------------------
5th git commit  |   aaaa
                |   bbbb
                |   dddd
                |  +eeee

এবং যদি পূর্বে, আমরা লাইনটি রাখার সিদ্ধান্ত নিয়েছিলাম cccc(তৃতীয় গিট কমিটের বিষয়বস্তু যা আমরা সরিয়ে দিয়েছি), আমাদের থাকতে হবে:

1st git commit  |  +aaaa
----------------------------------------------
2nd git commit  |   aaaa
                |  +bbbb
----------------------------------------------
4th git commit  |   aaaa
                |   bbbb
                |  +cccc
                |  +dddd
----------------------------------------------
5th git commit  |   aaaa
                |   bbbb
                |   cccc
                |   dddd
                |  +eeee

ঠিক আছে, এই ধরণের পড়াটি আমি আশা করি যে আমি খুঁজে পেয়েছি, খাঁজ কাটা শুরু করার জন্য, git rebaseকমিট / রিভিশনগুলি মোছার ক্ষেত্রে কীভাবে কাজ করে; সুতরাং আশা করি এটি অন্যকেও সহায়তা করতে পারে ...


কী এক অমূল্য পদচারণা - আমি যে সঠিক ব্যবহারের সাথে লড়াই করে যাচ্ছিলাম, এটি আমাকে প্রচুর পরিমাণে সহায়তা করেছিল।
pfabri

2

সুতরাং মনে হচ্ছে খারাপ প্রতিশ্রুতিটি কোনও এক সময়ে মার্জ কমিটে অন্তর্ভুক্ত ছিল। আপনার মার্জ কমিট এখনও টানা হয়েছে? যদি হ্যাঁ, তবে আপনি ব্যবহার করতে চাইবেনgit revert ; আপনাকে দাঁতে কষতে হবে এবং দ্বন্দ্বের মধ্যে দিয়ে কাজ করতে হবে। যদি না হয়, তবে আপনি কল্পিতভাবে হয় পুনর্নির্মাণ বা পুনরায় ফিরিয়ে আনতে পারেন, তবে আপনি এটি আগে করতে পারেন মার্জ কমিটের , তারপরে মার্জটি আবার করুন।

সত্যিকার অর্থে, প্রথম মামলার জন্য আমরা আপনাকে দিতে পারে এমন খুব একটা সহায়তা নেই। প্রত্যাবর্তনের চেষ্টা করার পরে এবং এটি স্বয়ংক্রিয়ভাবে ব্যর্থ হয়েছে তা খুঁজে পাওয়ার পরে, আপনাকে বিবাদগুলি পরীক্ষা করতে হবে এবং এগুলি যথাযথভাবে সমাধান করতে হবে। এটি ঠিক মার্জ সংঘাতগুলি ঠিক করার মতো একই প্রক্রিয়া; আপনি git statusকোথাও দ্বন্দ্ব রয়েছে তা দেখার জন্য, নিমজ্জনিত ফাইলগুলি সম্পাদনা করতে, দ্বন্দ্বযুক্ত কুনিদের সন্ধান করতে, কীভাবে সেগুলি সমাধান করবেন তা নির্ণয় করতে, বিবাদযুক্ত ফাইলগুলি যুক্ত করুন এবং শেষ পর্যন্ত প্রতিশ্রুতিবদ্ধ। যদি আপনি git commitনিজেই ব্যবহার করেন (না-m <message> ) করেন তবে আপনার সম্পাদকটিতে যে বার্তাটি পপ আপ হয় তা হ'ল তৈরি টেম্পলেট বার্তাgit revert ; কীভাবে আপনি দ্বন্দ্বগুলি স্থির করেছেন সে সম্পর্কে আপনি একটি নোট যুক্ত করতে পারেন, তারপরে সংরক্ষণ করুন এবং প্রতিশ্রুতি দেওয়া বন্ধ করুন।

দ্বিতীয় ক্ষেত্রে, আপনার মার্জ হওয়ার আগে সমস্যাটি ঠিক করা, দুটি সংযোজন রয়েছে, আপনি মার্জ হওয়ার পরে আরও কাজ করেছেন কিনা তার উপর নির্ভর করে। যদি আপনার না থাকে তবে আপনি কেবল git reset --hard HEAD^মার্জটি ছুঁড়ে ফেলাতে পারেন, প্রত্যাবর্তনটি করতে পারেন, তারপরে মার্জটি আবার করুন। তবে আমি অনুমান করছি আপনার আছে। সুতরাং, আপনি এই জাতীয় কিছু শেষ করবেন:

  • মার্জ হওয়ার ঠিক আগে অস্থায়ী শাখা তৈরি করুন এবং এটি দেখুন
  • প্রত্যাবর্তন করুন (বা git rebase -i <something before the bad commit> <temporary branch>খারাপ প্রতিশ্রুতি অপসারণ করতে ব্যবহার করুন )
  • মার্জটি আবার করুন
  • আপনার পরবর্তী কাজগুলি আবার চালু করুন: git rebase --onto <temporary branch> <old merge commit> <real branch>
  • অস্থায়ী শাখা অপসারণ

1

সুতরাং আপনি কিছু কাজ করেছেন এবং এটি ধাক্কা দিয়েছিলেন, এগুলিকে এ এবং বি-কে কমিট করতে বলুন cow খুব (কমিট এফ) করে এবং আবিষ্কার করেছে যে আপনার সহকর্মী কিছু জিনিস বদলেছেন যা তার উচিত নয়।

সুতরাং আপনার প্রতিশ্রুতিবদ্ধ ইতিহাসটি এরকম দেখাচ্ছে:

A -- B -- C -- D -- D' -- E -- F

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

এখন, আমি দুটি উপায় দেখছি:

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

    git reset D'
    

    (ডি'কে প্রতিস্থাপন করুন আসল কমিট হ্যাশ যা আপনি এ থেকে প্রাপ্ত করতে পারেন git log

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

  • যদি আপনি ইতিমধ্যে আপনার সহকর্মীর কমান্ডের পরে যে কাজটি করেছিলেন তা ইতিমধ্যে ঠেলাঠেলি করে ফেলেছেন তবে আপনি নিজে চেষ্টা করতে পারেন এবং "বিপরীত প্যাচ" পেতে পারেন ম্যানুয়ালি বা ব্যবহার করে git revert, তবে যেহেতু আপনার কাজটি "পথে" রয়েছে, তাই বলার জন্য আপনি সম্ভবত পাবেন আরও মার্জ সংঘাত এবং আরও বিভ্রান্তিকর। দেখে মনে হচ্ছে আপনি এটাই শেষ করেছেন ...


0

গিট রিভার্ট - স্ট্রেটজি রেজোলিউশন যদি কমিট একত্রিত হয়: গিট রিভার্ট - স্ট্রেটজি রেজোলিউশন -২ 1 ব্যবহার করুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.