গিটে পুরানো (শেষ নয়) কমিটে পরিবর্তিত ফাইল কীভাবে যুক্ত করবেন


461

আমি গত এক ঘন্টা ধরে বেশ কয়েকটি জিনিস পরিবর্তন করেছি এবং তাদের ধাপে ধাপে প্রতিশ্রুতিবদ্ধ করেছি, তবে আমি কেবল বুঝতে পেরেছি যে আমি কিছু কমিটমেন্ট আগে একটি পরিবর্তিত ফাইল যুক্ত করতে ভুলে গেছি।

লগটি দেখতে এমন দেখাচ্ছে:

    GIT TidyUpRequests u:1 d:0> git log 
    commit fc6734b6351f6c36a587dba6dbd9d5efa30c09ce 
    Author: David Klein <> 
    Date:   Tue Apr 27 09:43:55 2010 +0200

        The Main program now tests both Webservices at once

    commit 8a2c6014c2b035e37aebd310a6393a1ecb39f463 
    Author: David Klein <>
    Date:   Tue Apr 27 09:43:27 2010 +0200

        ISBNDBQueryHandler now uses the XPath functions from XPath.fs too

    commit 06a504e277fd98d97eed4dad22dfa5933d81451f 
    Author: David Klein <> 
    Date:   Tue Apr 27 09:30:34 2010 +0200

        AmazonQueryHandler now uses the XPath Helper functions defined in XPath.fs

    commit a0865e28be35a3011d0b6091819ec32922dd2dd8 <--- changed file should go here
    Author: David Klein <> 
    Date:   Tue Apr 27 09:29:53 2010 +0200

        Factored out some common XPath Operations

কোন ধারনা?


উত্তর:


692

ব্যবহার git rebase। বিশেষ করে:

  1. git stashআপনি যে পরিবর্তনগুলি যুক্ত করতে চান তা সঞ্চয় করতে ব্যবহার করুন।
  2. ব্যবহার করুন git rebase -i HEAD~10(বা তবে আপনি দেখতে চান এমন অনেকগুলি প্রতিশ্রুতি ফিরে এসেছে)
  3. লাইনের শুরুতে a0865...শব্দটি পরিবর্তন করে সম্পাদনার জন্য প্রশ্নে ( ) প্রতিশ্রুতিবদ্ধ চিহ্ন চিহ্নিত করুন । অন্যান্য লাইনগুলি মুছবেন না কারণ এটি কমিটগুলি মুছে ফেলবে [[im ভিমনোট]pickedit
  4. রিবাজ ফাইলটি সংরক্ষণ করুন, এবং গিটটি শেলের কাছে ফিরে আসবে এবং আপনাকে সেই প্রতিশ্রুতিটি ঠিক করার জন্য অপেক্ষা করবে।
  5. স্ট্যাশ ব্যবহার করে পপ করুন git stash pop
  6. এর সাথে আপনার ফাইল যুক্ত করুন git add <file>
  7. সাথে কমিট সংশোধন করুন git commit --amend --no-edit
  8. এমন কিছু করুন git rebase --continueযা আপনার বাকী অংশটি নতুনটির বিরুদ্ধে পুনর্লিখন করবে।
  9. আপনি সম্পাদনার জন্য একাধিক প্রতিশ্রুতিবদ্ধ চিহ্নিত করে থাকলে দ্বিতীয় ধাপ থেকে পুনরাবৃত্তি করুন।

[im ভাইমনোট]: আপনি যদি ব্যবহার করছেন vimতবে আপনাকে Insertসম্পাদনার জন্য কীটি চাপতে হবে Escএবং তারপরে :wqফাইলটি সংরক্ষণ করতে টাইপ করতে হবে, সম্পাদকটি ছেড়ে দিতে হবে এবং পরিবর্তনগুলি প্রয়োগ করতে হবে। বিকল্পভাবে, আপনি একটি ব্যবহারকারী বান্ধব গিট কমিট সম্পাদক সহ কনফিগার করতে পারেন git config --global core.editor "nano"


23
আপনি যদি সম্পাদনাটিতে যোগ করতে চান এমন স্টেস্টেড পরিবর্তন না করে থাকেন? আমি যদি তাদের লুকিয়ে রাখি, আমি পারতাম না git add
স্যাম

15
স্যাম আপনি প্রশ্নের সমাধানের সময় কেবল পরিবর্তনগুলি আনস্টাশ করতে পারেন, এটি দুর্দান্ত কাজ করবে।
omnikron

17
দ্রষ্টব্য: আপনি যখন অঙ্গীকারটি চিহ্নিত করেন edit, তখন ফাইলটিতে তালিকাবদ্ধ অন্যান্য কমিটগুলি মুছে ফেলবেন না। আপনি যদি করেন তবে কমিটগুলি মুছে ফেলা হবে এবং সেগুলি ফিরে পেতে আপনাকে এই পদক্ষেপগুলি অনুসরণ করতে হবে।
ডেভিড টুয়েট

2
@ ডেভিডটুইট যা বলেছিলেন তা সম্পর্কে, গিটে স্টাফ করার সময় আমার একটি অভ্যাস যা আমি নিশ্চিত না যে কীভাবে চালু হবে কীভাবে আমি বিষয়গুলি স্ক্রু করার ক্ষেত্রে টাইমলাইনের বর্তমান অবস্থা বাঁচানোর জন্য "ব্রাঞ্চনাম-রেফ" শাখা তৈরি করব। আমি হয়ে গেলে, আমি এটি মুছে ফেলি।
রাফেল

1
Step ধাপে, অন্তর্ভুক্ত করুন। (ডট) কমান্ডে। সঠিক আদেশ:git add .
টম

323

পুরানো কমিটের প্রতিশ্রুতি বার্তা পরিবর্তন না করেই একটি ছোট পরিবর্তন দিয়ে কোনও পুরানো প্রতিশ্রুতি "সংশোধন" করা, যেখানে OLDCOMMITএরকম কিছু রয়েছে 091b73a:

git add <my fixed files>
git commit --fixup=OLDCOMMIT
git rebase --interactive --autosquash OLDCOMMIT^

git commit --squash=OLDCOMMITরিবেস চলাকালীন আপনি পুরানো প্রতিশ্রুতি বার্তা সম্পাদনা করতেও ব্যবহার করতে পারেন ।


  • git rebase --interactiveরিবেস নির্দেশের ক্রমটি নিশ্চিত করতে (বা সম্পাদনা করতে) একটি পাঠ্য সম্পাদক এনেছেন (যা কনফিগার করা যায় ) । ফাইলে রিবেস নির্দেশ পরিবর্তনের জন্য তথ্য রয়েছে ; শুধু সংরক্ষণ করুন এবং প্রস্থান এডিটর ( মধ্যে ) রি-বেসের ফলে চালিয়ে যাওয়ার জন্য।:wqvim
  • --autosquashস্বয়ংক্রিয়ভাবে --fixup=OLDCOMMITপছন্দসই ক্রমে কোনও কমিট স্থাপন করবে। নোটটি --autosquashকেবলমাত্র বৈধ যখন --interactiveবিকল্পটি ব্যবহৃত হয়।
  • ^মধ্যে OLDCOMMIT^মানে একটি রেফারেন্স এর ঠিক আগে সমর্পণ করতে OLDCOMMIT

উপরের পদক্ষেপগুলি পুনঃনির্দেশ নির্দেশ ক্রমটি যাচাইকরণ এবং / বা সংশোধন করার জন্য ভাল তবে ইন্টারেক্টিভ রিবেস পাঠ্য সম্পাদককে এড়িয়ে যাওয়া / স্বয়ংক্রিয়ভাবে চালানোও সম্ভব:

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


18
অন্যান্য বিকল্পগুলির চেয়ে অনেক পরিষ্কার, এবং এটি একটি
কবজির

5
@ জোনাঃ সম্পাদক কমিট বার্তা সম্পাদনা করার জন্য খোলা হয়নি , তবে পুনর্বাসনের পদক্ষেপগুলি নিশ্চিত করতে (বা সম্পাদনা করতে) । এড়ানো যায় না; বিকল্পটি --autosquashকেবল তখনই কার্যকর --interactiveহয়
জোয়েল পুররা

5
এই সমাধানটি ব্যবহার করে আমি ভিআইএম দেখিয়ে গিট আটকে আছি। আমার সমস্যাটি হল, আমি ভিআইএম কীভাবে ব্যবহার করব তা জানি না don't আমি কীভাবে হ্যাক পেতে পারি, কীভাবে আমি এই জিনিসটি নিয়ন্ত্রণ করতে পারি, এটি এত বিভ্রান্তিকর।
নিয়ন ওয়ার্জ

2
@ নিওন ওয়ার্জ: উদাহরণস্বরূপ পছন্দের সম্পাদকটি কনফিগারযোগ্য git config --global core.editor "pico"গিটটি কনফিগার করার এবং / অথবা আপনার সিস্টেমের ডিফল্ট সম্পাদক এটেটেরা পরিবর্তন করার জন্য আরও কয়েকটি উপায় রয়েছে
জোয়েল পুররা


61

1.7 গিট সহ, এখানে ব্যবহার করার সত্যিই একটি সহজ উপায় রয়েছে git rebase:

আপনার ফাইল মঞ্চ:

git add $files

একটি নতুন প্রতিশ্রুতি তৈরি করুন এবং আপনার "ভাঙ্গা" প্রতিশ্রুতি পুনরায় ব্যবহার প্রতিশ্রুতি বার্তা

git commit -c master~4

fixup!সাবজেক্ট লাইনে প্রিপেন্ড করুন (বা squash!আপনি যদি কমিট সম্পাদনা করতে চান (বার্তা)):

fixup! Factored out some common XPath Operations

git rebase -i --autosquashআপনার প্রতিশ্রুতি স্থির করতে ব্যবহার করুন


2
+1 টি। নতুন ফিক্সআপ নির্দেশ হলাম ব্যবহার (1.7+): stackoverflow.com/questions/2302736/trimming-git-checkins/...
VonC

@ কেটিটল আমি আমার পুরাতন প্রতিশ্রুতিতে অন্য ফাইল যুক্ত করার জন্য আপনার পদ্ধতিটি চেষ্টা করছিলাম (ধাক্কা দেওয়া হয়নি) তবে যখন আমি প্রতারণা করি তখন You asked me to rebase without telling me which branch you want to rebase against, and 'branch.master.merge'এবং যদি আমি ব্যবহার git rebase -i --autosquashকরি তবে আমি কেবল একটি noopসাবজেক্ট লাইন পেয়েছি , প্রতিশ্রুতিটি নিজের উপর চাপিয়ে দিচ্ছি । কোন ধারণা আমি ভুল কি?
oschrenk

7
@ ওসরেঙ্ক: আপনাকে একটি প্রতিশ্রুতি প্রদান করতে হবে যার প্রতি আপনি git rebase -i --autosquash HEAD~10
পুনঃস্থাপন

1
উত্তম উত্তর তবে আমার পুনরায় শোধ করার বিরুদ্ধে একটি প্রতিশ্রুতি যুক্ত করতে হবে। আপনি এটি আপডেট করতে পারলে দুর্দান্ত হবে।
পল ওডিয়ন

@ পাওলঅডিয়ন: আমি আপনার প্রশ্নটি বুঝতে পারি না। আপনি কী করতে চেষ্টা করছেন এবং কোথায় আপনার সমস্যা হচ্ছে?
নিটল

8

আপনি rebase --interactiveআপনার পুরানো প্রতিশ্রুতি সংশোধন করার জন্য একটি অধিবেশন চেষ্টা করতে পারেন ( আপনি যদি আগে থেকেই এই প্রতিশ্রুতিগুলি অন্য রেপোতে চাপ দেন না ) তবে।

কখনও কখনও জিনিস খ .2 এ স্থির করা হয়। একেবারে নিখুঁত কমিটের সংশোধন করা যায় না এটি সংশোধন করে, কারণ সেই প্রতিশ্রুতি প্যাচ সিরিজে গভীরভাবে সমাহিত করা হয়
ইন্টারেক্টিভ রিবেস হ'ল এটি: "এ" এস এবং "বি" এর প্রচুর পরে ব্যবহার করুন, পুনরায় ব্যবস্থা এবং সম্পাদনা সম্পাদনা করে এবং একাধিক কমিটকে এক মধ্যে স্কোয়াশ করে।

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

git rebase -i <after-this-commit>

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

pick deadbee The oneline of this commit
pick fa1afe1 The oneline of the next commit
...

অনলাইন বর্ণনা সম্পূর্ণরূপে আপনার সন্তুষ্টির জন্য; গিট রিবেস এগুলি দেখতে পাবে না তবে প্রতিশ্রুতিবদ্ধ নামগুলিতে ("উদাহরণস্বরূপ" ডেডবি "এবং" এফএএফ 1 "), সুতরাং নামগুলি মুছুন বা সম্পাদনা করবেন না।

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

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