আমি কীভাবে ইতিহাসে সমাহিত গিট কমিটকে আলাদা করব?


292

আমি আমার ইতিহাসকে ফুটিয়ে তুলেছি এবং এতে কিছু পরিবর্তন করতে চাই। সমস্যাটি হ'ল, আমার দুটি সম্পর্কহীন পরিবর্তনের সাথে প্রতিশ্রুতিবদ্ধ এবং এই প্রতিশ্রুতিটি আমার স্থানীয় (অ-চাপানো) ইতিহাসের কিছু অন্যান্য পরিবর্তন দ্বারা ঘিরে রয়েছে।

আমি এই প্রতিশ্রুতিটি তাড়িত করার আগেই বিভক্ত করতে চাই, তবে আমি দেখছি যে বেশিরভাগ গাইড আপনার সাম্প্রতিক প্রতিশ্রুতি বিভক্ত করা বা স্থানীয় আপত্তিহীন পরিবর্তনগুলি করতে হবে। সেই থেকে আমার কৃতকর্মগুলি "পুনরায় করণ" না করে ইতিহাসে কিছুটা সমাহিত প্রতিশ্রুতি দিয়ে এটি করা কি সম্ভব?


উত্তর:


449

রিবেস ম্যানপেজে বিভাজনে কমিট করার জন্য একটি গাইড রয়েছে । দ্রুত সংক্ষিপ্তসারটি হ'ল:

  • লক্ষ্য প্রতিশ্রুতি (যেমন git rebase -i <commit-to-split>^ branch) সহ একটি ইন্টারেক্টিভ রিবেস সম্পাদন করুন এবং এটি সম্পাদিত হওয়ার জন্য চিহ্নিত করুন।

  • যখন রিবেস সেই প্রতিশ্রুতিতে পৌঁছে যায় তখন কমিটের git reset HEAD^আগে পুনরায় সেট করতে ব্যবহার করুন , তবে আপনার কাজের গাছটি অক্ষত রাখুন।

  • ক্রমবর্ধমান পরিবর্তনগুলি যুক্ত করুন এবং তাদের প্রতিশ্রুতিবদ্ধ করুন, যতগুলি ইচ্ছামত কমিট করে। add -pপ্রদত্ত ফাইলটিতে কিছু পরিবর্তন যুক্ত করতে দরকারী হতে পারে। ব্যবহারের commit -c ORIG_HEADআপনি মূল পুনরায় ব্যবহার করতে চান তাহলে একটি নির্দিষ্ট জন্য বার্তা কমিট কমিট।

  • আপনি যদি git stashপ্রতিশ্রুতিবদ্ধ না হওয়া অংশটি (বা stash --keep-indexআপনি এটি প্রতিশ্রুতি দেওয়ার আগে ) লুকিয়ে রাখার জন্য আপনি কী প্রতিশ্রুতিবদ্ধ (ভাল ধারণা!) ব্যবহার করেন তা পরীক্ষা করতে চান, তবে git stash popবাকী কাজের গাছটিতে ফিরিয়ে দিতে পরীক্ষা করুন । যতক্ষণ না আপনি সমস্ত পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ হন ততক্ষণ কমিটগুলি চালিয়ে যান, অর্থাত্ একটি পরিষ্কার কাজের গাছ নেই।

  • চালান git rebase --continueএখন বিভক্ত পর করে আবেদন কমিট এগিয়ে যেতে।


17
... তবে আপনি ইতিমধ্যে বিভাজনের প্রতিশ্রুতিবদ্ধ হওয়ার পরে ইতিমধ্যে ইতিহাসকে ঠেলে দিলে এর কোনওটিই নিবেন না।
wilhelmtell

29
@ উইলহেম্টেল: আমি আমার সাধারণ "সম্ভাব্য বিপজ্জনক; বাদ দিয়ে" পুনরুদ্ধার "পুনরুদ্ধার" বয়লারপ্লেট বাদ দিয়েছি কারণ ওপি স্পষ্টতই বলেছে যে তিনি এই ইতিহাসকে এগিয়ে দেননি।
ক্যাস্যাবেল

2
এবং আপনি একটি নিখুঁত পড়া করেছেন। আমি 'বয়লারপ্লেট' এড়াতে চেষ্টা করছিলাম যখন উল্লেখ করেছি এটি এখনও ভাগ করা ইতিহাস নয় :) যে কোনও ক্ষেত্রে, আপনার পরামর্শ নিয়ে আমার সাফল্য আছে। যদিও এই জিনিস পরে এই জিনিস না করা একটি বড় ব্যথা হয়। আমি এখানে একটি পাঠ শিখেছি এবং এটি নিশ্চিত করা যে কমিটগুলি সঠিকভাবে শুরু করা হয়েছে তা দিয়ে!
বেন

2
প্রথম পদক্ষেপ হিসাবে ভাল বলা যেতে পারে git rebase -i <sha1_of_the_commit_to_split>^ branch। এবং git guiবিভাজন কার্যের জন্য একটি দুর্দান্ত সরঞ্জাম, যা কোনও ফাইলের বিভিন্ন অংশকে বিভিন্ন কমিটে যুক্ত করতে ব্যবহার করা যেতে পারে।
কিয়াং শু

3
@ কিয়াংএক্সু: প্রথমটি হ'ল যুক্তিসঙ্গত পরামর্শ। দ্বিতীয়টি হ'ল কেন আমি প্রস্তাব দিয়েছি git add -p, যা git guiএই বিভাগে ক্যান্সারের চেয়ে বেশি কিছু করতে পারে (উল্লেখযোগ্যভাবে কুকুরের সম্পাদনা, বর্তমানের কান্ড থেকে শুরু করে সমস্ত কিছু মজুত করা, এবং রেগেক্স দ্বারা কুকুরের সন্ধান)।
ক্যাসাবেল

3

এটি ম্যাজিট দিয়ে কীভাবে করবেন তা এখানে ।

বলুন প্রতিশ্রুতিবদ্ধ ed417ae আপনি পরিবর্তন করতে চান এটি; এতে দুটি সম্পর্কযুক্ত পরিবর্তন রয়েছে এবং এটি এক বা একাধিক কমিটের নিচে সমাধিস্থ হয়েছে। llলগটি দেখানোর জন্য হিট করুন এবং এড 417ae তে নেভিগেট করুন:

প্রাথমিক লগ

তারপরে rরিবেস পপআপ খুলতে আঘাত করুন

পুনরায় পপআপ

এবং mসময়ে প্রতিশ্রুতি সংশোধন করতে।

@আপনি যে বিভাগে বিভক্ত করতে চান সেই প্রতিশ্রুতিতে এখন কীভাবে তা লক্ষ্য করুন - এর অর্থ হ'ল হেড এখন সেই প্রতিশ্রুতিতে রয়েছে:

একটি প্রতিশ্রুতি পরিবর্তন

আমরা হেডকে পিতামাতার কাছে স্থানান্তর করতে চাই, তাই পিতামাতায় নেভিগেট করুন (47e18b3) এবং আঘাত করুন x( magit-reset-quickly, আপনি oযদি ব্যবহার করছেন তবে আবদ্ধ evil-magit) এবং "হ্যাঁ আমি বলতে চাইছিলাম প্রতিশ্রুতিবদ্ধ ছিলাম"। আপনার লগ এখন দেখতে হবে:

পুনরায় সেট করার পরে লগ

এখন, qনিয়মিত ম্যাজিট স্ট্যাটাসে যেতে আঘাত করুন , তারপরে নিয়মিত আনস্টেজ uকমান্ডটি ব্যবহার করুন যা প্রথমে প্রতিশ্রুতি দেয় না তা আনস্টেজ করার জন্য, বাকিটি cযথারীতি প্রতিশ্রুতিবদ্ধ করুন, তারপরে টেজ করুন sএবং cদ্বিতীয় প্রতিশ্রুতিতে যা ঘটে তা বাদ দিন এবং যখন: rরিবেস পপআপ খুলতে আঘাত

পুনরায় পপআপ

এবং অন্য rচালিয়ে যেতে, এবং আপনি সম্পন্ন করেছেন! llএখন দেখায়:

সমস্ত সম্পন্ন লগ


1

একটি প্রতিশ্রুতি বিভক্ত করতে <commit>এবং এটির আগে নতুন প্রতিশ্রুতি যুক্ত করতে এবং লেখকের তারিখটি সংরক্ষণ করতে <commit>- পদক্ষেপগুলি নিম্নলিখিত:

  1. আগে কমিট সম্পাদনা করুন <commit>

    git rebase -i <commit>^^
    

    নোট: সম্ভবত এটিরও সম্পাদনা করার প্রয়োজন হবে <commit>

  2. চেরি <commit>সূচক মধ্যে পিক

    git cherry-pick -n <commit>
    
  3. ইন্টারেক্টিভভাবে সূচি থেকে অপরিবর্তিত পরিবর্তনগুলি পুনরায় সেট করুন এবং কার্যক্ষম গাছটি পুনরায় সেট করুন

    git reset -p && git checkout-index -f -a
    

    বিকল্প হিসাবে, কেবল ইন্টারেক্টিভভাবে বিনা শর্তে পরিবর্তনগুলি লুকিয়ে রাখুন: git stash push -p -m "tmp other changes"

  4. অন্যান্য পরিবর্তন করুন (যদি থাকে) এবং নতুন প্রতিশ্রুতি তৈরি করুন

    git commit -m "upd something" .
    

    Interচ্ছিকভাবে, আরও মধ্যবর্তী কমিট যোগ করতে আইটেমগুলিকে 2-4 করুন।

  5. প্রতারণা চালিয়ে যান

    git rebase --continue
    

0

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

  1. আপনার সম্পাদক ব্যবহার করুন এবং আপনি যে লাইনগুলি থেকে বের করতে চান তা মুছুন the_file। বন্ধ the_file। এটি আপনার প্রয়োজন একমাত্র সংস্করণ, বাকি সমস্ত কেবল গিট কমান্ড।
  2. সূচীতে মুছে ফেলা পর্যায়:

    git  add  the_file
    
  3. সূচককে প্রভাবিত না করে আপনি কেবল ফাইলে মুছে ফেলা লাইনগুলি পুনরুদ্ধার করুন !

    git show HEAD:./the_file > the_file
    
  4. "SHA1" হ'ল প্রতিশ্রুতি যা থেকে আপনি লাইনগুলি বের করতে চান:

    git commit -m 'fixup! SHA1' 
    
  5. পদক্ষেপ 3 দ্বারা পুনরুদ্ধার করার জন্য সামগ্রীটির সাথে দ্বিতীয়, সম্পূর্ণ নতুন প্রতিশ্রুতি তৈরি করুন:

    git commit -m 'second and new commit' the_file 
    
  6. সম্পাদনা করবেন না, থামবেন না / চালিয়ে যান না - কেবল সমস্ত কিছু গ্রহণ করুন:

    git rebase --autosquash -i SHA1~1
    

অবশ্যই আরও দ্রুত যখন থেকে উত্তোলনের প্রতিশ্রুতি সর্বশেষ প্রতিশ্রুতিবদ্ধ হয়:

4. git commit -C HEAD --amend
5. git commit -m 'second and new commit' thefile
6. no rebase, nothing

আপনি যদি ব্যবহার করেন magitতবে পদক্ষেপ 4, 5 এবং 6 হ'ল একক ক্রিয়া: প্রতিশ্রুতিবদ্ধ, তাত্ক্ষণিক ফিক্সআপ


-2

আপনি যদি এখনও ঠেলাঠেলি না করেন তবে কেবল ব্যবহার করুন git rebase। আরও ভাল, git rebase -iকমিটিকে ইন্টারেক্টিভভাবে ঘুরে দেখার জন্য ব্যবহার করুন । আপত্তিজনক প্রতিশ্রুতিটি আপনি সামনে সরিয়ে নিতে পারেন, তারপরে নিজের পছন্দ মতো এটিকে বিভক্ত করুন এবং প্যাচগুলি পিছনে সরিয়ে নিতে (প্রয়োজনে)।


14
এটি কোথাও সরানোর দরকার নেই। এটি যেখানে সেখানে বিভক্ত।
ক্যাসকেবেল

1
দুর্ভাগ্যক্রমে, এটি আমার পক্ষে কার্যকর হয়নি কারণ প্রতিশ্রুতিবদ্ধতার পরে কিছু ইতিহাস এর উপর নির্ভরশীল, তাই আমি কিছুটা সীমাবদ্ধ। তবে এটি আমার প্রথম পছন্দ হত choice
বেন

@ বেন: এটি ঠিক আছে - এরপরে কমিটসগুলির কোনও পরিবর্তন করার দরকার নেই (ধরে নিলেন আপনি কিছু পরিবর্তন এড়ানোর পরিবর্তে সমস্ত পরিবর্তন রাখবেন)। এখানে আরও তথ্য - stackoverflow.com/questions/1440050/…
ইথার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.