গিট সংগ্রহস্থল থেকে নির্বাচিত প্রতিশ্রুতিবদ্ধ লগ এন্ট্রিগুলি কীভাবে পরিবর্তন করবেন?


241

আমি লিনিয়ার কমিট ট্রি থেকে নির্বাচিত কমিট লগ এন্ট্রিগুলি সরাতে চাই, যাতে কমিট লগটিতে এন্ট্রিগুলি প্রদর্শিত না হয়।

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

R--A--B--C--D--E--HEAD

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

R--A--BC--D--E--HEAD

বা, আদর্শভাবে, এ আসার পরে সরাসরি ডি আসে। ডি 'এ থেকে বি, বি থেকে সি এবং সিতে ডি পরিবর্তিত প্রতিনিধিত্ব করে

R--A--D'--E--HEAD

এটা কি সম্ভব? যদি হ্যাঁ, কিভাবে?

এটি মোটামুটি নতুন প্রকল্প এটির এখন পর্যন্ত কোনও শাখা নেই, সুতরাং পাশাপাশি কোনও সংযোজনও হয় না।


@ xk0der: "প্রতিশ্রুতিবদ্ধ" এখানে সঠিক শব্দ। rebaseপুরানো সরিয়ে / নতুন কমিট তৈরি করতে পারে। "কমিট লগ এন্ট্রি" এর অর্থ কী তা আমি জানি না।
jfs

@ জেফাসেবাস্টিয়ান আমি "কমিট লগ" - কোন কমিটের লগ নিয়ে কোনও সমস্যা দেখছি না। এবং আমি লগ থেকে কয়েকটি এন্ট্রি মুছে ফেলতে চেয়েছিলাম - আসল পরিবর্তনগুলি (কমিট) রাখার সময়।
xk0der

@ xk0der: গিট কমিটগুলি বিষয়বস্তু সম্বোধনযোগ্য অর্থাত্, যদি আপনি কোন প্রতিশ্রুতিতে কিছু পরিবর্তন করেন যেমন এর লগ বার্তা; আপনি একটি নতুন অঙ্গীকার তৈরি। আপনি গিট ছাড়াই গিটের প্রতিশ্রুতি পড়তে এবং নিজের জন্য দেখতে পারেন
jfs

@ জেফাসেবাস্টিয়ান - লিঙ্কগুলির জন্য ধন্যবাদ - আমি জানি যে - তবে কী প্রযুক্তিগতভাবে আমার যে সমস্যার মুখোমুখি হয়েছিল এবং কীভাবে আমি তা সামনে রেখেছি তা কি সত্যিই পরিবর্তন করে? আমি মনে করি না. শেষ পর্যন্ত: আমি "প্রতিশ্রুতিবদ্ধ লগ বার্তাগুলি" মুছে ফেলতে চেয়েছিলাম - "কমিট পরিবর্তনগুলি" সরিয়ে না দিয়ে - দয়া করে আমার প্রশ্নটি আবার পড়ুন - বিশেষ করে দ্বিতীয় অনুচ্ছেদটি। আরও যোগ git logকরতে "কমিট লগ" দেখায় git-scm.com/docs/git-log । এবং আমি সেই লগ থেকে দুটি এন্ট্রি থেকে মুক্তি পেতে চেয়েছিলাম - পরিবর্তনগুলি নয়।
xk0der

উত্তর:


273

গিট-রিবেস (1) ঠিক এটি করে।

$ git rebase -i HEAD~5

গিট অ্যাজম-নেস [গিট রিবেস - ইন্টারেক্টিভ] এর একটি উদাহরণ রয়েছে।

  1. git-rebaseসর্বজনীন (দূরবর্তী) কমিটে ব্যবহার করবেন না ।
  2. আপনার কার্যকারী ডিরেক্টরিটি পরিষ্কার ( commitবা stashআপনার বর্তমান পরিবর্তনগুলি) নিশ্চিত করুন।
  3. উপরের কমান্ডটি চালান। এটি আপনার চালু $EDITOR
  4. প্রতিস্থাপন pickকরার পূর্বে Cএবং Dদ্বারা squash। এটি সি এবং ডি বি তে মিশ্রিত করবে যদি আপনি কোন প্রতিশ্রুতি মুছতে চান তবে কেবল তার লাইনটি মুছুন।

আপনি যদি হারিয়ে যান তবে টাইপ করুন:

$ git rebase --abort  

দ্রুত উত্তর দেওয়ার জন্য ধন্যবাদ. তাহলে আমি কি এটিকে চেকআউট করব এবং একটি রিবেস করব, এরকম কিছু git rebase -i D [A]?
xk0der


3
আমরা কীভাবে এটি রিমোট রিপোসে করতে পারি?
এরে

6
@ ইরাই: push -fআপনার পরিবর্তনগুলি আপনি একা কাজ না করলে এটি করবেন না।
jfs

2
@ রিপার 234: আমি git-rebaseব্লগ পোস্টের জন্য ম্যানুয়াল এবং ওয়েব্যাক মেশিনটি নির্দেশ করার জন্য লিঙ্কগুলি স্থির করেছি ।
jfs

75
# detach head and move to D commit
git checkout <SHA1-for-D>

# move HEAD to A, but leave the index and working tree as for D
git reset --soft <SHA1-for-A>

# Redo the D commit re-using the commit message, but now on top of A
git commit -C <SHA1-for-D>

# Re-apply everything from the old D onwards onto this new place 
git rebase --onto HEAD <SHA1-for-D> master

এটিও কাজ করে এবং একটি সফট রিসেট কী তা আমাকে বুঝতে সহায়তা করে। মঞ্জুর, "শীর্ষ" উত্তরটি ঠিক এবং সংক্ষিপ্ত, তবে এই উত্তরের জন্যও ধন্যবাদ।
সিজিপি

41

আপনি যে প্রতিশ্রুতিবদ্ধ অপসারণটি অপসারণ করতে চান তা জেনে নির্দিষ্ট প্রতিশ্রুতি আইডি সরানোর এখানে একটি উপায় Here

git rebase --onto commit-id^ commit-id

দ্রষ্টব্য যে এটি আসলে প্রতিশ্রুতি দ্বারা প্রবর্তিত পরিবর্তনটিকে সরিয়ে দেয়।


7
এই কমান্ডের অতিরিক্ত হেড হ'ল রিবাজটিকে 'বিচ্ছিন্ন হেড' দিয়ে শেষ করা হবে যা অনাকাঙ্ক্ষিত। এটি বাদ দেওয়া উচিত।
ফ্রস্টি

3
এটি আমার প্রতিশ্রুতি-আইডি প্রবর্তিত পরিবর্তনগুলিকে ফিরিয়ে দেয়, ওপি পরিবর্তনগুলি ধরে রাখতে চায়, কেবল কমিটসকে স্কোয়াশ করে।
সিবি বেইলি

1
-1 কারণ এটি ওপি যা বলেছিল তা করে না (বরং এটি এমন কোনও কিছুকে নষ্ট করে যা সে স্পষ্টভাবে ধরে রাখতে চেয়েছিল)।
এমিল স্টায়ার্ক

1
যদিও এটি ওপি যা বলেছিল তা করে না, এটি আমার প্রয়োজন মতো ছিল, সুতরাং একটি দরকারী উত্তরের জন্য +1 করুন।
এডভিনস

20

জেএফ সেবাস্তিয়ান এর উত্তরে প্রসারিত করতে:

আপনি আপনার প্রতিশ্রুতিবদ্ধ ইতিহাসে সহজেই সমস্ত ধরণের পরিবর্তন করতে গিট-রিবেস ব্যবহার করতে পারেন।

গিট রিবেস চালানোর পরে - ইন্টারেক্টিভ আপনি নিম্নলিখিতটি আপনার $ সম্পাদনায় পাবেন:

pick 366eca1 This has a huge file
pick d975b30 delete foo
pick 121802a delete bar
# Rebase 57d0b28..121802a onto 57d0b28
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit

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

আমি মনে করি বাছাইয়ের অর্থ হ'ল আপনি সেই প্রতিশ্রুতিটি একা ছেড়ে যেতে চান।

(উদাহরণ এখান থেকে )


14

আপনি উদাহরণস্বরূপ অ এবং ইন্টারেক্টিভ বি এবং সি অপসারণ করতে পারেন :

git rebase --onto HEAD~5 HEAD~3 HEAD

বা প্রতীকীভাবে,

git rebase --onto A C HEAD

দ্রষ্টব্য যে বি এবং সি এর পরিবর্তনগুলি ডি তে হবে না ; তারা চলে যাবে


: আরও তথ্যের জন্য এখানে দেখুন sethrobertson.github.io/GitFixUm/fixup.html#remove_deep
ম্যাক্স

3

আরও একটি উপায়,

git rebase -i ad0389efc1a79b1f9c4dd6061dca6edc1d5bb78a (C's hash)
and
git push origin master  -f

আপনি এটির ভিত্তি হিসাবে যে হ্যাশটি ব্যবহার করতে চান তা চয়ন করুন এবং উপরের কমান্ডটি এটি ইন্টারেক্টিভ করে তুলতে হবে যাতে আপনি শীর্ষস্থানীয় সমস্ত বার্তা স্কোয়াশ করতে পারেন (আপনাকে সবচেয়ে পুরানোটি ছেড়ে যেতে হবে)


2

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

git checkout <SHA1 of A>
git log #verify looks good
git checkout -b rework
git cherry-pick <SHA1 of D>
....
git log #verify looks good
git branch -D <oldbranch>
git branch -m rework <oldbranch>

আপনি যদি এটি করেন আপনি E প্রতিশ্রুতিও হারাবেন, তাই না? যেমনটি আমি বুঝতে পেরেছি, আপনি মাস্টারকে মুছুন এবং পুনরায় নামটি মাস্টার হিসাবে নামকরণ করুন (এবিসিডিই প্রবাহকে মাস্টার শাখা বিবেচনা করে)।
রেনান

1

কেবলমাত্র সমস্ত লোকের উত্তর সংগ্রহ করেছেন: (গিট প্লাজে আমি কেবলমাত্র রেফারেন্সের জন্য এটি ব্যবহার করব)

যেকোন কমিট মুছতে গিট রিবেস

গিট লগ

-first check from which commit you want to rebase

গিট রিবেস -i হেড ~ 1

-Here i want to rebase on the second last commit- commit count starts from '1')
-this will open the command line editor (called vim editor i guess)

তারপরে স্ক্রিনটি এরকম কিছু দেখাবে:

0c2236d বেছে নিন নতুন লাইন যুক্ত।

2a1cd65 (1 কমান্ড) এ 2a1cd65..0c2236d রিবেস করুন

#

আদেশগুলি:

পি, বাছাই = ব্যবহার প্রতিশ্রুতি

আর, রেওয়ার্ড = কমিট ব্যবহার করুন, কিন্তু কমিট ম্যাসেজটি সম্পাদনা করুন

ই, সম্পাদনা = প্রতিশ্রুতি ব্যবহার করুন, কিন্তু সংশোধন করার জন্য বন্ধ করুন

s, স্কোয়াশ = ব্যবহার প্রতিশ্রুতিবদ্ধ, কিন্তু পূর্ববর্তী প্রতিশ্রুতিতে মিলিত

এফ, ফিক্সআপ = "স্কোয়াশ" এর মতো, তবে এই কমিটের লগ বার্তাটি বাতিল করুন

x, exec = শেল ব্যবহার করে চালানো কমান্ড (বাকী রেখাটি)

d, ড্রপ = প্রতিশ্রুতি অপসারণ

#

এই লাইনগুলি পুনরায় অর্ডার করা যেতে পারে; তারা উপরে থেকে নীচে কার্যকর করা হয়।

#

আপনি যদি এখানে একটি লাইন সরিয়ে ফেলেন তবে কমিট হারিয়ে যাবে।

#

তবে, আপনি যদি সমস্ত কিছু সরিয়ে ফেলেন তবে রিবেসটি বাতিল করা হবে।

#

নোট করুন যে খালি কমিটগুলি মন্তব্য করা হয়েছে ~ ~

~
~
~
~
~
~
~
~
~

এখানে আপনার প্রয়োজন অনুসারে প্রথম লাইনটি পরিবর্তন করুন (উপরের তালিকাবদ্ধ কমান্ডগুলি যেমন কমিট ইত্যাদি অপসারণ করতে 'ড্রপ' ব্যবহার করে) সম্পাদনাটি সম্পাদনা সম্পন্ন হলে সম্পাদনাটি সংরক্ষণ এবং প্রস্থান করতে একবার ': x' টিপুন (এটি কেবলমাত্র ভিএম সম্পাদকের জন্য)

এবং তারপর

গিট ঠেলা

যদি এটির সমস্যাটি দেখাতে সমস্যা হয় তবে আপনাকে পরিবর্তনগুলি জোর করে রিমোটে ঠেকাতে হবে (এটি অত্যন্ত গুরুতর: আপনি দলে কাজ করছেন তবে জোর করে চাপ দিন না)

গিট ধাক্কা -f উত্স


-1

আপনি এটির জন্য গিট চেরি-পিক ব্যবহার করতে পারেন। 'চেরি-পিক' এখন আপনার শাখায় একটি প্রতিশ্রুতি প্রয়োগ করবে।

তাহলে কর

git rebase --hard <SHA1 of A>

তারপরে ডি এবং ই কমিট প্রয়োগ করুন।

git cherry-pick <SHA1 of D>
git cherry-pick <SHA1 of E>

এটি বি এবং সি কমিটিকে এড়িয়ে যাবে। এই বলে যে বি ছাড়া শাখায় ডি কমিট প্রয়োগ করা অসম্ভব, তাই ওয়াইএমএমভি।


2
ওপি বি, সি, ডি কমিট করে তাদের পরিবর্তনগুলি মুছে ফেলতে চায় না।
jfs

3
আমি মনে করি আপনি বোঝাতে চেয়েছিলেন reset --hard, না rebase --hard(যার অস্তিত্ব নেই)
মরিসিও শেফার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.