লেখক পরিবর্তন করতে কীভাবে গিটের বেশ কয়েকটি কমিটি সংশোধন করবেন


180

আমি গিটে একাধিক কমিট করেছি এবং আমি বুঝতে পেরেছি যে আমি নিজের ব্যবহারকারীর নাম এবং ব্যবহারকারীর ইমেল বৈশিষ্ট্যগুলি সঠিকভাবে সেট করতে (ভুলে গেছি) নতুন কম্পিউটারে)। আমি এখনও এই প্রতিশ্রুতিগুলি আমার ভাণ্ডারটিতে ঠাঁই করি নি, সুতরাং আমি কীভাবে এই কমিটগুলি সংশোধন করতে পারি তা করার আগে (মাস্টার শাখায় কেবলমাত্র 3 টি সর্বশেষ কমিট)?

আমি তাকিয়ে ছিল git resetএবংgit commit -C <id> --reset-author আমি মনে করি না যে আমি সঠিক পথে রয়েছি।


1
আপনি ইমেল সম্পত্তি পরিবর্তন করতে চাইতে পারেন অন্য কারণ হ'ল এই গিথুব ত্রুটি: remote: error: GH007: Your push would publish a private email address.... `! [রিমোট প্রত্যাখ্যান] মাস্টার -> মাস্টার (ইমেল গোপনীয়তার বিধিনিষেধের কারণে ধাক্কা অস্বীকার) ``
ক্র্যাক

উত্তর:


232

আপনার আঙ্গুলের উপরে ফিল্টার-শাখার ক্ষমতা থাকলে রিবেস / সংশোধন অকার্যকর বলে মনে হয়:

git filter-branch --env-filter 'if [ "$GIT_AUTHOR_EMAIL" = "incorrect@email" ]; then
     GIT_AUTHOR_EMAIL=correct@email;
     GIT_AUTHOR_NAME="Correct Name";
     GIT_COMMITTER_EMAIL=$GIT_AUTHOR_EMAIL;
     GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME"; fi' -- --all

(স্পষ্টতার জন্য লাইন জুড়ে বিভক্ত, কিন্তু প্রয়োজনীয় নয়)

আপনার কাজ শেষ হয়ে গেলে ফলাফলটি পরীক্ষা করে নিরীক্ষণ করতে ভুলবেন না, আপনি যা বোঝাতে চেয়েছিলেন কিছুই পরিবর্তন করেন নি তা নিশ্চিত করে!


মন আরও একটু বুঝিয়ে বলছে? ফিল্টার শাখা কী তা নিশ্চিত নন
সর্বোচ্চ আবেদনকারী

1
@ ম্যাক্সপ্লানারটি git filter-branch --helpবেশ সোজাসাপ্টা :)
আলেডিয়াফেরিয়া

3
এছাড়াও help.github.com/articles/changing-author-info দেখুন , যা নতুন ইতিহাসে ট্যাগগুলি স্থানান্তরিত --tag-name-filter catকরতে ক্রমটিকে যুক্ত করে filter-branch। এটি --branches --tagsপরিবর্তে এটিও ব্যবহার করে --all, যা কেবল শাখা এবং ট্যাগ ইতিহাসকে refsgit-notes
পুনরায় লেখায়

12
এই সঞ্চালন করতে মাত্র গত দুই করে, আমি প্রতিস্থাপিত -- --allসঙ্গেHEAD~1..HEAD
nmz787

1
@ nmz787 আপনি লগ করলে কতটি লগ প্রদর্শিত হয় git log HEAD~2..HEAD?
জোনা

148

এক্সেকটিভের সাথে একত্রে ব্যবহৃত হলে ইন্টারেক্টিভ রিবেস পদ্ধতিটি খুব সুন্দর। আপনি কোনও নির্দিষ্ট কমিটের বিরুদ্ধে বা রিবেসে সমস্ত কমিটের বিরুদ্ধে যে কোনও শেল কমান্ড চালাতে পারেন।

প্রথমে আপনার গিট লেখকের সেটিংস সেট করুন

git config --global user.name "John Doe"
git config --global user.email johndoe@example.com

তারপরে প্রদত্ত এসএইচএর পরে সমস্ত কমিটের জন্য লেখককে পুনরায় সেট করতে

git rebase -i YOUR_SHA -x "git commit --amend --reset-author -CHEAD"

পরিবর্তনগুলি নিশ্চিত করতে এটি আপনার সম্পাদককে পপ আপ করবে। আপনাকে এখানে যা করতে হবে তা হ'ল সংরক্ষণ এবং প্রস্থান করা এবং এটি প্রতিটি প্রতিশ্রুতি দিয়ে যাবে এবং -x পতাকাতে নির্দিষ্ট কমান্ডটি চালাবে।

নীচে @ ডেভের মন্তব্যে, মূল টাইমস্ট্যাম্পগুলি বজায় রেখে আপনি লেখককেও পরিবর্তন করতে পারেন:

git rebase -i YOUR_SHA -x "git commit --amend --author 'New Name <new_address@example.com>' -CHEAD"

3
-X বিকল্পে আমাকে পরিচয় করিয়ে দেওয়ার জন্য আপনাকে ধন্যবাদ। বেশ সুন্দর! -i বিকল্পের জন্য আমি আমার শেষ 4 টিতে আমার ইমেল ঠিকানা ঠিক করতে হেড ~ 4 ব্যবহার করেছি। একটি কবজ মত কাজ।
ব্র্যাড হেইন

2
filter-branchআপনি কেবল নিজের শেষ কমিটগুলি ঠিক করতে চান তার চেয়ে এটি অনেক সহজ is তবে খেয়াল করুন, এটি কমিটের টাইমস্ট্যাম্প পরিবর্তন করে।
luator

24
লেখক পরিবর্তন করতে কিন্তু মূল টাইমস্ট্যাম্পগুলি বজায় রাখতেgit rebase -i YOUR_SHA -x "git commit --amend --author 'New Name <new_address@example.com>' -CHEAD"
ডেভ

2
@ কনর git logআমার পক্ষে পুরানো লেখকত্বও দেখিয়েছিল, তবে গিট স্ট্যাটাসটি নতুন কমিটকে সঠিকভাবে চিহ্নিত করেছিল এবং জোর করে চাপ দেওয়ার পরে তারা আমার ইচ্ছা মতো ছিল।
ড্যান এম

6
মূল ব্যবহার সহ সমস্ত কমিট পুনর্বাসনের জন্য: git rebase -i --root …এসএইচএ পাস করার পরিবর্তে।
গফুল্লাম

80

শুধুমাত্র শেষ প্রতিশ্রুতির জন্য লেখককে পরিবর্তন করতে:

git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit

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

git rebase -i HEAD~4 -x "git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit"

মন্তব্য

  • --no-editপতাকা তোলে নিশ্চিত git commit --amendএকটি অতিরিক্ত নিশ্চিতকরণ জিজ্ঞাসা করা হয় না
  • আপনি যখন ব্যবহার করবেন git rebase -i, আপনি লেখকটি কোথায় পরিবর্তন করবেন তা ম্যানুয়ালি নির্বাচন করতে পারেন,

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

pick 897fe9e simplify code a little
pick abb60f9 add new feature
exec git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit
pick dc18f70 bugfix

1
সমস্ত শিকড় থেকে কমিট জন্য। গিট রিবেসে -i --root UPTO_COMMIT_SHA -x "গিট কমিট - সমীক্ষা - অনুমোদনকারী 'NEW_CHANGE' - কোন সম্পাদনা"
আশীশ নেগি

1
আপনার শাখার টপোলজিটি অক্ষত রাখার জন্য আমি --rebase-mergesসংক্ষেপে (সংক্ষিপ্ত -r) বিকল্পটি যুক্ত করার পরামর্শ দিচ্ছি যদি এতে কিছু মার্জ থাকে।
donquixote

4

এই পদ্ধতিটি গিথুব দ্বারা এই উদ্দেশ্যে ডকুমেন্ট করা হয়েছিল। পদক্ষেপগুলি হ'ল:

  1. টার্মিনালটি খুলুন এবং আপনার রেপোর একটি খালি ক্লোন তৈরি করুন
git clone --bare https://github.com/user/repo.git
cd repo
  1. সম্পাদনা করুন নিম্নলিখিত স্ক্রিপ্ট (প্রতিস্থাপন OLD_EMAIL, CORRECT_EMAILএবং CORRECT_NAME)
#!/bin/sh

git filter-branch --env-filter '
OLD_EMAIL="your-old-email@example.com"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="your-correct-email@example.com"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_COMMITTER_NAME="$CORRECT_NAME"
    export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_AUTHOR_NAME="$CORRECT_NAME"
    export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags
  1. আপনার টার্মিনালে স্ক্রিপ্টটি অনুলিপি / আটকান এবং এটি চালানোর জন্য এন্টার টিপুন।
  2. আপনার পরিবর্তনগুলি এর সাথে চাপ দিন git push --force --tags origin 'refs/heads/*'এবং আপনি সম্পন্ন করেছেন!

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

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

ধন্যবাদ, আমি জানি, তবে এটি গিডহাব / গিটের মতো প্রতিমা হিসাবে মনে হচ্ছে না।
এনগিগমেন্ট

2

আমি বিশ্বাস করি আপনি যা খুঁজছেন তা হ'ল git rebase --interactive

এটি আপনাকে একটি নির্দিষ্ট প্রতিশ্রুতিতে পুনরায় সেট করতে দেয় এবং তারপরে ইতিহাস যোগ বা গোষ্ঠীবদ্ধকরণের পরিবর্তনগুলি ফেলে দেয়

এখানে আপনার একটি ব্যাখ্যা https://web.archive.org/web/20100213104931/http://blog.madism.org/index.php/2007/09/09/138-git-awsome-ness-git-rebase -interactive


0

আপনি যদি ডিবেজিং এবং সংশোধন সম্পর্কে অনিরাপদ বোধ করেন তবে আপনি এটি এইভাবে করতে পারেন। একই সময়ে আপনি বৈশ্বিক কনফিগারেশনও সেট করে যাচ্ছেন সম্ভবত আপনি যেভাবেই করতে চেয়েছিলেন।

git reset HEAD~ (শেষ প্রতিশ্রুতি পূর্বাবস্থায় ফেরা)

git config --global user.name "Your Name"

git config --global user.email you@example.com

git commit -m "message"

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