গিটে মূল প্রতিশ্রুতি সম্পাদনা করবেন?


328

পরে কমিট করে বার্তাটি পরিবর্তন করার উপায় রয়েছে:

git commit --amend                    # for the most recent commit
git rebase --interactive master~2     # but requires *parent*

আপনি প্রথম প্রতিশ্রুতিবদ্ধতার প্রতিশ্রুতি বার্তাটি কীভাবে পরিবর্তন করতে পারেন (যার কোনও পিতা-মাতা নেই)?



বিশেষত: GIT_COMMIT এনভায়রনমেন্ট ভেরিয়েবলের স্ক্রিপ্টটিতে ব্যবহার করুনgit filter-branch --msg-filter
কাঁটাচামচ

1
আরো দেখুন stackoverflow.com/a/2309391/264607
BlackICE

উত্তর:


285

ধরে নিচ্ছি যে আপনার একটি পরিষ্কার পরিশ্রমী গাছ রয়েছে, আপনি নিম্নলিখিতটি করতে পারেন।

# checkout the root commit
git checkout <sha1-of-root>

# amend the commit
git commit --amend

# rebase all the other commits in master onto the amended root
git rebase --onto HEAD HEAD master

23
আমি বিশ্বাস করি এটি হওয়া উচিত git rebase --onto HEAD <sha1-of-root> master
অ্যান্ড্রু

5
ঠিক আছে, তবে আপনি <upstream> এর জন্য মূল মূল প্রতিশ্রুতি দিতে চান git rebasegit rebase<ব্র্যাঞ্চ> ( master) যা কমপ্লেক্স প্রয়োগ করে <আপ স্ট্রিম> না; HEADএতে নেই master, সুতরাং আপনার সংস্করণটি সমস্ত প্রয়োগ করার চেষ্টা করে master
অ্যান্ড্রু

7
হ্যাঁ, নিশ্চিত হন যে এটি git rebase --onto HEAD <sha1-of-root>মাস্টার, যেখানে <sha1-of-root>একই ব্যবহার রয়েছে git checkout <sha1-of-root>। অন্যথায়, আপনি 2 first commitএর আছে।
অ্যান্ডি

2
@ ক্যাপকেক: আপনি কি কমান্ডটির পুরানো সংস্করণ পরীক্ষা করেছেন? এটা ঠিক কাজ করা উচিত। সংশোধনটি কেবল প্রতিশ্রুতি বার্তা পরিবর্তন করছে তাই পুরাতন এবং নতুন রুট কমিটগুলি একই পরিবর্তনগুলি প্রবর্তন করে যাতে পুরানো রুট কমিটটি স্বয়ংক্রিয়ভাবে বাদ যায়। দ্বিতীয়টি HEADনিশ্চিত করে যে সমস্ত প্রতিশ্রুতি বিবেচনা করা হয় এবং আমরা মাস্টারটিতে ফিরে যেতে রিবেসের দুটি পরামিতি সংস্করণ ব্যবহার করতে পারি। দয়া করে নোট করুন যে এই উত্তরটি পুনর্বাসনের --rootবিকল্পটির অস্তিত্বের পূর্বাভাস দেয় ।
সিবি বেইলি

9
নীচে ecdpalma এর উত্তর অনেক সহজ এবং সহজ এবং আরও বেশি ভোট রয়েছে, লোককে স্ক্রোল করুন!
ফ্লিম

567

গিট সংস্করণ 1.7.12 হিসাবে , আপনি এখন ব্যবহার করতে পারেন

git rebase -i --root

নথিপত্র


2
এই কমান্ডটি ব্যবহার করে সমস্ত শাখার মূল পুনরায় চালু করা সম্ভব? দেখে মনে হচ্ছে এটি নতুন শাখায় বর্তমান শাখাটি বিচ্ছিন্ন করবে এবং অন্যান্য সমস্ত শাখা পুরানো মূলের উপরে থাকবে
woojoo666

@ woojoo666 আপনাকে তখন নতুন রুটে শাখাগুলি পুনরায় চালু করতে হবে। সচরাচর.
বার্কাস

@ এটকল্ড কোনও উজানের মূল না থাকলে এটি কাজ করে না
কাই

সতর্কতা: আমি ভুলভাবে ধরে নিয়েছি যে এটি আমার পরীক্ষিত শাখার মূল কাজ করবে তবে সমস্ত কমিটগুলি লোড করতে কিছুক্ষণ সময় নেয়, তারপরে সেগুলি পুনরায় ফিরিয়ে দিন।
লিও

2
@ লিয়ো আপনার মন্তব্যের অর্থ কী? আমি প্রথম অংশ এবং দ্বিতীয়টির মধ্যে লিঙ্কটি দেখতে পাচ্ছি না - এর সাথে কিছুটা সময় নেওয়ার কী দরকার?
বালক

66

একডপালমার উত্তরটি প্রসারিত করতে, আপনি এখন --rootবিকল্পটি ব্যবহার করে বলতে পারবেন rebaseযে আপনি মূল / প্রথম প্রতিশ্রুতি পুনর্লিখন করতে চান:

git rebase --interactive --root

তারপরে মূল প্রতিশ্রুতিটি রিবেস টোডো তালিকায় প্রদর্শিত হবে এবং আপনি এটি সম্পাদনা করতে বা পুনরায় পাঠ্য নির্বাচন করতে পারেন:

reword <root commit sha> <original message>
pick <other commit sha> <message>
...

এটি গিট রিবেস ডক্স (জোর খনি) --rootথেকে ব্যাখ্যা :

রি-বেসের ফলে সব করে থেকে পৌঁছানো <branch>পরিবর্তে তাদের একটি সঙ্গে সীমাবদ্ধতা, <upstream>এটি আপনাকে একটি শাখায় রুট কমিট (গুলি) পুনরায় চালু করতে দেয়


12

কেবলমাত্র উচ্চ রেট দেওয়া উত্তরের বিকল্প সরবরাহ করতে:

যদি আপনি কোনও রেপো তৈরি করে চলেছেন এবং আপনি যদি ভবিষ্যতে তার "প্রথম" বাস্তব প্রতিশ্রুতি শীর্ষে প্রত্যাখ্যান করেন তা অবগত থাকলে আপনি শুরুতে একটি স্পষ্ট ফাঁকা প্রতিশ্রুতি দিয়ে এই সমস্যাটি পুরোপুরি এড়াতে পারবেন:

git commit --allow-empty -m "Initial commit"

এবং তারপরেই "বাস্তব" কমিটগুলি করা শুরু করুন। তারপরে আপনি স্ট্যান্ডার্ড উপায়ে কমিটের উপরে সহজেই রিবেস করতে পারেন, উদাহরণস্বরূপgit rebase -i HEAD^


4
এর অর্থ এই নয় যে এটি কাজ করার জন্য আপনার প্রকল্পের একেবারে শুরুতে খালি প্রতিশ্রুতি দেওয়ার জন্য আপনার দূরদৃষ্টি (বা মনস্তাত্ত্বিক হওয়া) প্রয়োজন ? এটি আমার কাছে অত্যন্ত পরিস্থিতিগত বলে মনে হচ্ছে এবং সাধারণত ব্যবহারিক নয় । আপনি কি মনে করেন? যদি আমি ইতিমধ্যে 100 টি কমিট করে ফেলেছি তবে কী ঘটবে এবং হঠাৎ করে আমার কাছে রুট কমিট সম্পাদনা করা দরকার। শুরুতে আমি যদি খালি প্রতিশ্রুতি না দিয়ে থাকি তবে কি এটি এখনও কার্যকর হবে?

2
রুট কমিটের বার্তা সম্পাদনা করা সম্ভবত সেগুলির 100 শতাংশ থাকার পরে আপনি যে কিছু করবেন তা নয়। আমি মাঝে মাঝে কেবল গিট রেপো রাখতে চাই, কিছু ট্র্যাশীয় কমিট করে জেনে যে আমি একবার ব্যবহারের মতো কিছু স্থানে পৌঁছেছি, সেগুলি আমি উদাহরণস্বরূপ একটি জায়গায় স্কোয়াশ করে পাঠিয়েছি এবং বার্তাটি শব্দের সংজ্ঞা দিয়েছি। যাইহোক, এখন আমি আমার মতামত পরিবর্তন করেছি এবং আমি মনে করি যে প্রথম প্রতিশ্রুতিবদ্ধতার জন্য একেবারে দরকারী জিনিসটি .gitattributesখালি প্রতিশ্রুতি না দিয়ে ফাইল স্থাপন করবে ।
jakub.g

4

আপনি ব্যবহার করতে পারেন git filter-branch:

cd test
git init

touch initial
git add -A
git commit -m "Initial commit"

touch a
git add -A
git commit -m "a"

touch b
git add -A
git commit -m "b"

git log

-->
8e6b49e... b
945e92a... a
72fc158... Initial commit

git filter-branch --msg-filter \
"sed \"s|^Initial commit|New initial commit|g\"" -- --all

git log
-->
c5988ea... b
e0331fd... a
51995f1... New initial commit

আমি ফিল্টার-শাখা লেখক / প্রতিশ্রুতিবদ্ধ পরিবর্তন ব্যবহার করছি, এবং -- --allবিকল্পটি অবশ্যই এই ক্ষেত্রে মূল প্রতিশ্রুতিটি হ্যান্ডেল করতে সক্ষম হতে পারে key
sschuberth
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.