একটি নির্দিষ্ট কমিটের জন্য কমিট লেখক কীভাবে পরিবর্তন করবেন?


2105

আমি ইতিহাসের একটি নির্দিষ্ট অঙ্গীকারের লেখককে পরিবর্তন করতে চাই। এটি শেষ প্রতিশ্রুতি নয়।

আমি এই প্রশ্নটি সম্পর্কে জানি - গিট ইন কমিটের লেখককে কীভাবে পরিবর্তন করব?

তবে আমি এমন কিছু সম্পর্কে ভাবছি যেখানে আমি হ্যাশ বা শর্ট-হ্যাশ দ্বারা প্রতিশ্রুতি চিহ্নিত করি।


উত্তর:


3561

ইতিহাসের পূর্বের বিন্দুটির পরিবর্তে ইন্টারেক্টিভ রিবেস বন্ধ করার পরিবর্তে আপনাকে পরিবর্তন করতে হবে ( git rebase -i <earliercommit>)। ইন করে একটি তালিকা রি-বেস হচ্ছে, থেকে টেক্সট পরিবর্তন pickকরতে editআপনি পরিবর্তন করতে চান তার হ্যাশ পাশে। তারপরে যখন গিট আপনাকে অঙ্গীকার পরিবর্তনের জন্য অনুরোধ জানাবে, এটি ব্যবহার করুন:

git commit --amend --author="Author Name <email@address.com>" --no-edit

উদাহরণস্বরূপ, আপনার কমিট ইতিহাস হলে A-B-C-D-E-Fসঙ্গে Fযেমন HEAD, এবং আপনি লেখক পরিবর্তন করতে চান Cএবং D, তাহলে আপনি would ...

  1. নির্দিষ্ট করুন git rebase -i B( কমান্ড কার্যকর করার পরে আপনি কী দেখতে পাবেন তার উদাহরণ এখানেgit rebase -i B )
    • আপনার যদি সম্পাদনা করতে হয় তবে Aব্যবহার করুনgit rebase -i --root
  2. উভয়ের জন্য লাইন পরিবর্তন Cএবং Dথেকে pickথেকেedit
  3. সম্পাদক থেকে প্রস্থান করুন (vim এর জন্য, এটি ইস্ক টিপবে এবং তারপরে টাইপ করা হবে :wq)।
  4. একবার রিবেস শুরু হয়ে গেলে এটি প্রথমে বিরতি দেয় C
  5. তুমি করবে git commit --amend --author="Author Name <email@address.com>"
  6. তারপর git rebase --continue
  7. এটি আবার বিরতি হবে D
  8. তারপর আপনি git commit --amend --author="Author Name <email@address.com>"আবার হবে
  9. git rebase --continue
  10. রিবেস সম্পূর্ণ হবে।
  11. git push -fআপডেট কমিটগুলি সহ আপনার উত্স আপডেট করতে ব্যবহার করুন ।

90
উত্তম উত্তর, তবে নতুনদের জন্য: প্রথমে আপনি পরিবর্তন করতে চান এমন একটি পূর্বের প্রতিশ্রুতি সন্ধান করুন, তারপরে git rebase -i <commit>
দৌড়াবেন

47
আপনি কী সম্পাদক হিসাবে আছেন তা যদি আপনি না জানেন তবে উত্তরটি সম্ভবত রয়েছে vim। সংরক্ষণ এবং প্রস্থান করতে Esc: wq লিখুন টাইপ করুন। অন্যদিকে, যদি এটি ন্যানো এবং আপনি নীচে বরাবর "WritOut: ^ O" এর মতো জিনিসগুলি দেখতে পান তবে তার পরিবর্তে আপনার Ctrl + O, Enter, Ctrl + X ব্যবহার করা উচিত।
আম্বর

30
আপনি যদি প্রথম প্রতিশ্রুতি পরিবর্তন করতে চান? আগের কমিট হ্যাশ তখন কি?
ব্রেন্ডেন

218
--no-editবিকল্প ব্যবহার করুন । git commit --amend --reset-author --no-editসম্পাদক খুলবে না। গিট 1.7.9 থেকে পাওয়া যায়।
5lava

51
@ ব্রেন্ডেন প্রকল্পের প্রথম প্রতিশ্রুতি পরিবর্তন করতে, ব্যবহার করবেনgit rebase -i --root
নোহ পাসালাকোয়া

488

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

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

লিঙ্কযুক্ত উত্তরের বিপরীতে নিম্নলিখিতটি পরীক্ষিত এবং কাজ করা হচ্ছে। প্রকাশের স্পষ্টতার জন্য ধরে নিন যে 03f482d6প্রতিশ্রুতিবদ্ধ যার লেখককে আমরা প্রতিস্থাপনের চেষ্টা করছি এবং 42627abeএটিই নতুন লেখকের সাথে প্রতিশ্রুতিবদ্ধ।

  1. আমরা সংশোধন করার চেষ্টা করছি প্রতিশ্রুতি চেক আউট।

    git checkout 03f482d6
    
  2. লেখক পরিবর্তন করুন।

    git commit --amend --author "New Author Name <New Author Email>"
    

    এখন আমরা ধরে নিয়েছি হ্যাশ দিয়ে একটি নতুন প্রতিশ্রুতিবদ্ধ 42627abe

  3. আসল শাখাটি চেকআউট করুন।

  4. স্থানীয়ভাবে নতুনটির সাথে পুরানো প্রতিশ্রুতিটি প্রতিস্থাপন করুন।

    git replace 03f482d6 42627abe
    
  5. প্রতিস্থাপনের ভিত্তিতে ভবিষ্যতের সমস্ত কমিট পুনরায় লিখুন rite

    git filter-branch -- --all
    
  6. পরিচ্ছন্নতার জন্য প্রতিস্থাপন সরান।

    git replace -d 03f482d6
    
  7. নতুন ইতিহাসটি পুশ করুন (নীচে ব্যর্থ হলে কেবলমাত্র বল প্রয়োগ করুন এবং কেবল git logএবং / অথবা সাথে স্যানিটি পরীক্ষা করার পরে git diff)।

    git push --force-with-lease
    

4-6 এর পরিবর্তে আপনি কেবল নতুন প্রতিশ্রুতিতে পুনঃব্যবস্থা করতে পারেন:

git rebase -i 42627abe

9
পদক্ষেপ 2 পরে আপনার মূল শাখাটি পুনরায় চেকআউট করার জন্য দয়া করে সেখানে একটি নোট রাখুন
বেনজামিন রিগস

42
এটি ভয়াবহর থেকে অনেক স্পষ্ট বিকল্প দেখাচ্ছে git rebase -i। এই git replaceজিনিসটি এর আগে কখনও শুনিনি । +1
ফ্র্যাক্টালস্পেস

3
পরিষ্কার জন্য refs / মূল / ... ব্যাকআপ দেখতে এখানে
Alexis

5
আমি --force-with-leaseপরিবর্তে ব্যবহার করার পরামর্শ দিচ্ছি -f। এটি নিরাপদ।
জে বাজুজি

11
সতর্কতা: জেনে রাখুন যে git filter-branch -- --allআসল প্রতিশ্রুতি ছিল সেই সমস্ত শাখায় প্রতিশ্রুতি পরিবর্তন করছে you
ribamar

225

গিথুব ডকুমেন্টেশনে একটি স্ক্রিপ্ট রয়েছে যা একটি শাখায় সমস্ত কমিটের জন্য দায়বদ্ধ তথ্যের প্রতিস্থাপন করে

  • ভেরিয়েবলের মান পরিবর্তন করার পরে টার্মিনাল থেকে নিম্নলিখিত স্ক্রিপ্টটি চালান

    #!/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
    
  • সংশোধিত ইতিহাস গিটহাবে পুশ করুন:

    git push --force --tags origin 'refs/heads/*'
    

    অথবা আপনি যদি শাখাগুলির নির্বাচিত রেফারেন্সগুলি ধাক্কা দিতে চান তবে ব্যবহার করুন

    git push --force --tags origin 'refs/heads/develop'
    

12
এটি কেবলমাত্র নয়, সমস্ত প্রতিশ্রুতিতে এটি পরিবর্তন করে। মজার বিষয়, আমি 30 মিনিটেরও কম আগে এটি করেছি।
আর্টজম বি

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

2
মনে রাখবেন যে আপনি clone/ ব্যবহার করা এড়ালে push, আপনি ব্যাকআপ নেমস্পেস দিয়ে শেষ করবেন refs/original/। আমি বুদ্ধি করে এই নেমস্পেসটি সরানোর কোনও উপায় খুঁজে পাচ্ছি না, তাই আমি কাজ শেষ ডিরেক্টরিটি মুছে ফেলি .git/refs/original
ভ্যাসিলিনভিকভ

উদাহরণস্বরূপ OLD_EMAIL কোনও কিছুর সাথে মেলে না, কেন এই ফলাফলটি রেপোতে পরিবর্তিত হবে? কিছু কারণে কয়েকটি (তবে সমস্ত নয়!) কমিট হ্যাশ পরিবর্তন হয়।
mjs

1
এই উত্তরের জন্য আমার ব্যবহারের ক্ষেত্রটি হল: আমার দুটি গিথুব অ্যাকাউন্ট রয়েছে, একটি যা আমি অনিচ্ছাকৃতভাবে কমিট করতে ব্যবহৃত হয়েছিল। এই স্ক্রিপ্টটি ভুল প্রতিশ্রুতিবদ্ধ ইমেল / নাম পরিবর্তন করে আমার সমস্ত প্রতিশ্রুতি সংশোধন করতে সহায়তা করেছিল। অবশ্যই, যদি আমি থেকে ভুল ব্যবহারকারীর সাথে প্রতিশ্রুতিবদ্ধ হয়ে থাকি তবে আসুন, বলুন যে 50 তম প্রতিশ্রুতি 500 তম প্রতিশ্রুতিতে রয়েছে, সেখানে 450 বিভক্ত প্রতিশ্রুতি থাকবে। যাইহোক, স্ক্রিপ্টটি চালানোর পরে, যেমন @ ওন্দ্রেজ উল্লেখ করেছেন, আপনাকে রেপোতে git push -fধাক্কা পরিবর্তন বাধ্য করতে হবে ।
এলডাব্লুওয়াই

164
  • আপনার ইমেলটি বিশ্বব্যাপী কনফিগারেশনে পুনরায় সেট করুন:

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

  • আপনার সম্পাদনার প্রয়োজন ছাড়াই আপনার প্রতিশ্রুতি লেখকের পুনরায় সেট করুন:

    git commit --amend --reset-author --no-edit


2
না এইটা না. ওপিটির দিকে তাকান: It's not last commit.তাহলে তারা কীভাবে তা amendকরবে?
আন্ডারস্কোর_ডে

2
এটি দুর্দান্ত, এটি কেবল শেষ প্রতিশ্রুতিবদ্ধ হলেও লজ্জার বিষয়। আমার এটি সর্বশেষ দু'এর দরকার ছিল, ভাগ্যক্রমে, তাই ঠিক একটি করেছেন git reset HEAD~, আপনার প্রস্তাবিত লাইনগুলি চালিয়েছেন, তারপরে পরেরটি নিজেই আবার কমিট করেছিলেন। ভাল কাজ!
ম্যাট ফ্লেচার

2
ধন্যবাদ! --Reset- লেখক আমার জন্য কৌশলটি করেছেন, কারণ এটি ছাড়া লেখক পরিবর্তন করেন তবে "প্রতিশ্রুতিবদ্ধ" পুরানো লেখকের বিবরণ নিয়েই থাকে।
লুকাস পি।

9
আমার শেষ ছয়টি কমিটগুলি ঠিক করতে: প্রথমে বর্তমান গিট রেপো ব্যবহার করে git config --local user.name FirstName LastName এবং এর জন্য সঠিক লেখকটি সেট করুন git config --local user.email first.last@example.com। তারপর ছয় ব্যবহার করে প্রযোজ্য git rebase --onto HEAD~6 --exec "git commit --amend --reset-author --no-edit" HEAD~6। অবশেষে এটি ব্যবহার করে দূরবর্তী গিট রেপোতে চাপ দিন git push --force-with-lease
অলিবরে

@ অলিব্রে এটি মনোহর মত কাজ করে, ধন্যবাদ।
ব্রুনো গ্যাসপ্যারোটো

88

আপনি নীচের কমান্ডটি ব্যবহার করে সর্বশেষ কমিটের লেখক পরিবর্তন করতে পারেন।

git commit --amend --author="Author Name <email@address.com>"

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

এর সাথে প্রতারণা শুরু করুন git rebase -i। এটি আপনাকে এরকম কিছু প্রদর্শন করবে।

https://monosnap.com/file/G7sdn66k7JWpT91uiOUAQWMhPrMQVT.png

পরিবর্তন pickশব্দ থেকে editকরে করার জন্য আপনাকে লেখক নামটি পরিবর্তন করতে চান।

https://monosnap.com/file/dsq0AfopQMVskBNknz6GZZwlWGVwWU.png

তারপরে সম্পাদকটি বন্ধ করুন। নতুনদের জন্য, হিট করুন Escapeতারপর টাইপ করুন :wqএবং হিট করুন Enter

তারপরে আপনি দেখবেন যে আপনার টার্মিনালটি কিছুই ঘটেনি। আসলে আপনি একটি ইন্টারেক্টিভ রিবেসের মাঝখানে। এখন সময় এসেছে উপরের কমান্ডটি ব্যবহার করে আপনার প্রতিশ্রুতিবদ্ধ লেখকের নাম সংশোধন করার। এটি আবার সম্পাদক খুলবে। ছাড়ুন এবং এর সাথে পুনর্বাসনা চালিয়ে যান git rebase --continue। আপনি সম্পাদনা করতে চান প্রতিশ্রুতি গণনার জন্য একই পুনরাবৃত্তি করুন। আপনি No rebase in progress?বার্তাটি পেয়ে গেলে ইন্টারেক্টিভ রিবেস শেষ হয়েছে তা নিশ্চিত করতে পারেন ।


আপনি দয়া করে আপনার ছবি আপডেট করতে পারেন?
শিমি ওয়েটজ্যান্ডলার

1
যদি আপনি একাধিক প্রতিশ্রুতি পরিবর্তনের জন্য পেয়ে থাকেন তবে স্বতন্ত্রভাবে এডিট করার পরিবর্তে, আপনি pickক্রিয়াটি করতে এবং প্রতিটি লাইনের পরে যুক্ত করতে পারেনexec git commit --no-edit --amend --author="MyNewAuthor <my@new-auth.or>"
পিয়েরে-অলিভিয়ের ভারেস

60

আপনি যে প্রশ্নের সাথে যুক্ত ছিলেন তার উত্তরগুলি ভাল উত্তর এবং আপনার পরিস্থিতিটি coverেকে রাখে (অন্য প্রশ্নটি আরও সাধারণ কারণ এটিতে একাধিক কমিটির পুনর্লিখন জড়িত)।

চেষ্টা করার অজুহাত হিসাবে git filter-branch, আমি প্রদত্ত প্রতিশ্রুতির জন্য লেখকের নাম এবং / অথবা লেখকের ইমেলটি আবার লিখতে একটি স্ক্রিপ্ট লিখেছিলাম:

#!/bin/sh

#
# Change the author name and/or email of a single commit.
#
# change-author [-f] commit-to-change [branch-to-rewrite [new-name [new-email]]]
#
#     If -f is supplied it is passed to "git filter-branch".
#
#     If <branch-to-rewrite> is not provided or is empty HEAD will be used.
#     Use "--all" or a space separated list (e.g. "master next") to rewrite
#     multiple branches.
#
#     If <new-name> (or <new-email>) is not provided or is empty, the normal
#     user.name (user.email) Git configuration value will be used.
#

force=''
if test "x$1" = "x-f"; then
    force='-f'
    shift
fi

die() {
    printf '%s\n' "$@"
    exit 128
}
targ="$(git rev-parse --verify "$1" 2>/dev/null)" || die "$1 is not a commit"
br="${2:-HEAD}"

TARG_COMMIT="$targ"
TARG_NAME="${3-}"
TARG_EMAIL="${4-}"
export TARG_COMMIT TARG_NAME TARG_EMAIL

filt='

    if test "$GIT_COMMIT" = "$TARG_COMMIT"; then
        if test -n "$TARG_EMAIL"; then
            GIT_AUTHOR_EMAIL="$TARG_EMAIL"
            export GIT_AUTHOR_EMAIL
        else
            unset GIT_AUTHOR_EMAIL
        fi
        if test -n "$TARG_NAME"; then
            GIT_AUTHOR_NAME="$TARG_NAME"
            export GIT_AUTHOR_NAME
        else
            unset GIT_AUTHOR_NAME
        fi
    fi

'

git filter-branch $force --env-filter "$filt" -- $br

+1 ধন্যবাদ অ্যাসেম্বলা ডট কম গিট রেপো ওয়েবের লেখকের সমস্ত লেখকের রেফারেন্সকে রেপোর পরিবর্তিত করে না, তবে 'গিট টান / ক্লোন' এর ফলাফল সমস্ত কাজের জন্য ঠিক আছে।
জনি উটাহ

দুর্দান্ত সমাধান, কারণ এটি কেবল যা উদ্দেশ্য তা পরিবর্তন করে, এবং অন্যান্য ক্ষেত্রগুলি যেমন কমিটের তারিখ।
গিলিয়াম লেমাট্রে

12
গিথুব ডকুমেন্টেশনে একটি অনুরূপ স্ক্রিপ্ট
অলিভিডারডাম 666


@ Olivieradam666 ধন্যবাদ। আপনার উত্তরটি হিসাবে সত্যই যুক্ত করা উচিত যাতে এটি আরও মনোযোগ পায়।
seane

44

আগে প্রতিশ্রুতিবদ্ধ:

এখানে চিত্র বর্ণনা লিখুন

সমস্ত কমিটের জন্য লেখককে ঠিক করতে আপনি @ আম্বরের উত্তর থেকে আদেশটি প্রয়োগ করতে পারেন:

git commit --amend --author="Author Name <email@address.com>"

অথবা আপনার নাম এবং ইমেল পুনরায় ব্যবহার করতে আপনি কেবল লিখতে পারেন:

git commit --amend --author=Eugen

আদেশের পরে প্রতিশ্রুতিবদ্ধ:

এখানে চিত্র বর্ণনা লিখুন

উদাহরণস্বরূপ সমস্ত থেকে শুরু করে পরিবর্তন 4025621:

এখানে চিত্র বর্ণনা লিখুন

আপনার অবশ্যই দৌড়াতে হবে:

git rebase --onto 4025621 --exec "git commit --amend --author=Eugen" 4025621

দ্রষ্টব্য: কোনও নাম এবং ইমেল ঠিকানার মতো ফাঁকা স্থান যুক্ত কোনও লেখককে অন্তর্ভুক্ত করতে লেখককে অবশ্যই পালানো উক্তি দ্বারা ঘিরে থাকতে হবে। উদাহরণ স্বরূপ:

git rebase --onto 4025621 --exec "git commit --amend --author=\"Foo Bar <foo@bar.com>\"" 4025621

অথবা এই উপন্যাসটি এতে যুক্ত করুন ~/.gitconfig:

[alias]
    reauthor = !bash -c 'git rebase --onto $1 --exec \"git commit --amend --author=$2\" $1' --

এবং তারপরে চালান:

git reauthor 4025621 Eugen

1
কমান্ডটি প্রত্যাশা মতো কাজ করেছে তা যাচাই করতে, আমি এর আউটপুট পর্যালোচনা করেছি git shortlog -e -s
টেলর এডমিস্টন

5
এই উত্তরটি আমার উদ্দেশ্যকে সর্বোত্তমভাবে উপস্থাপন করেছে, আপনাকে ধন্যবাদ। এবং যেহেতু আমি কেবল আমার ইমেল ঠিকানাটি সামঞ্জস্য করতে চেয়েছি , তাই আমার .git / কনফিগারেশন আপডেট করার পরে --exec = "গিট কমিট --amend --reset-লেখক" দিয়ে চালাতে পারি run
ডেটো

1
এহ, নিশ্চিত কেন আমি ভুলে গেছি! এখন সম্পন্ন.
ডেটো

দুর্দান্ত উত্তর এবং ঠিক করা খুব সহজ। ওরফে প্রেম!
J_A_X

এটা আমাকে সাহায্য করেনি এখন আমার চালিয়ে যাওয়া রিবেস ব্যর্থ ত্রুটি আছে
আলেক্সি এস।

17

আপনি যদি কোনও কেন্দ্রীভূত সংগ্রহস্থল ব্যবহার করেন তবে অ্যাম্বারের উত্তরের আরও একটি পদক্ষেপ রয়েছে :

git push -f কেন্দ্রীয় সংগ্রহস্থলের আপডেট জোর করে।

সতর্কতা অবলম্বন করুন যে একই শাখায় প্রচুর লোক কাজ করছে না কারণ এটি ধারাবাহিকতা নষ্ট করতে পারে।


16

যখন করছেন git rebase -iসেখানে দস্তাবেজে অন্তর্ভুক্ত এই আকর্ষণীয় বিট হল:

আপনি যদি দুটি বা তারও বেশি কমিটকে একটিতে ভাঁজ করতে চান "pick"তবে দ্বিতীয়টির কমান্ডটি প্রতিস্থাপন করুন এবং পরবর্তীকালে "squash"বা এর সাথে কমিট করুন "fixup"। যদি কমিটগুলির বিভিন্ন লেখক থাকে তবে ভাঁজ করা প্রতিশ্রুতি প্রথম প্রতিশ্রুতি লেখকের জন্য দায়ী করা হবে। ভাঁজ প্রতিশ্রুতিবদ্ধতার জন্য প্রস্তাবিত প্রতিশ্রুতিবদ্ধ বার্তা হ'ল প্রথম প্রতিশ্রুতি এবং "squash"কমান্ডটি রয়েছে তাদের প্রতিশ্রুতিবদ্ধ বার্তাগুলির সংক্ষিপ্তকরণ, তবে কমান্ডের মাধ্যমে কমিটের প্রতিশ্রুতি বার্তা বাদ দেয় "fixup"

  • আপনার যদি ইতিহাস থাকে A-B-C-D-E-F ,
  • এবং আপনি কমিট Bএবং D(= 2 কমিট) পরিবর্তন করতে চান ,

তাহলে আপনি এটি করতে পারেন:

  • git config user.name "Correct new name"
  • git config user.email "correct@new.email"
  • খালি কমিট তৈরি করুন (প্রতিটি প্রতিশ্রুতির জন্য একটি):
    • আপনার পুনর্বাসনের উদ্দেশ্যে একটি বার্তা প্রয়োজন
    • git commit --allow-empty -m "empty"
  • রিবেস অপারেশন শুরু করুন
    • git rebase -i B^
    • B^এর পিতামাতাকে নির্বাচন করে B
  • প্রতিটি সংশোধন করার আগে আপনি একটি খালি প্রতিশ্রুতি রাখতে চান
  • আপনি তাদের জন্য পরিবর্তন pickকরতে চান squash

git rebase -i B^আপনাকে কী দেবে তার উদাহরণ :

pick sha-commit-B some message
pick sha-commit-C some message
pick sha-commit-D some message
pick sha-commit-E some message
pick sha-commit-F some message
# pick sha-commit-empty1 empty
# pick sha-commit-empty2 empty

এতে পরিবর্তন করুন:

# change commit B's author
pick sha-commit-empty1 empty
squash sha-commit-B some message
# leave commit C alone
pick sha-commit-C some message
# change commit D's author
pick sha-commit-empty2 empty
squash sha-commit-D some message
# leave commit E-F alone
pick sha-commit-E some message
pick sha-commit-F some message

এটি আপনাকে বার্তাগুলি সম্পাদনা করতে অনুরোধ করবে:

# This is a combination of 2 commits.
# The first commit's message is:

empty

# This is the 2nd commit message:

...some useful commit message there...

এবং আপনি কেবল প্রথম কয়েকটি লাইন সরাতে পারেন।


16

থেকে আরও এগিয়ে Eugen Konkov প্রতিক্রিয়া, রুট কমিট, ব্যবহার থেকে শুরু করতে --rootপতাকা। --no-editপতাকা খুব সহায়ক

git rebase --root --exec "git commit --amend --author='name <email>' --no-edit"

এটি সমস্ত কমিটিতে কাজ করেছে এবং পরিবর্তিত হয়েছে।
সাগরকাপাশি ০৯৯

1
উত্তরের জন্য ধন্যবাদ. এটি কাজ করতে এটি - সংযুক্তি যুক্ত করতে হয়েছিল। গিট রিবেস --রুট
ইন্টেরেটিভ

8

এমন একটি উপায় সন্ধান করুন যা ব্যবহারকারীকে দ্রুত পরিবর্তন করতে পারে এবং অন্যের প্রতিশ্রুতিবদ্ধ হওয়ার কোনও পার্শ্ব প্রতিক্রিয়া নেই।

সহজ এবং পরিষ্কার উপায়:

git config user.name "New User"
git config user.email "newuser@gmail.com"

git log
git rebase -i 1f1357
# change the word 'pick' to 'edit', save and exit

git commit --amend --reset-author --no-edit
git rebase --continue

git push --force-with-lease

বিস্তারিত অপারেশন

  • প্রতিশ্রুতিবদ্ধ লগগুলি দেখান এবং প্রতিশ্রুতিবদ্ধ আইডিটি সন্ধান করুন যে আপনি যে প্রতিশ্রুতি পরিবর্তন করতে চান তার আগে:
git log
  • গিট রিবেসটি বেছে নেওয়া কমিট আইডি থেকে সাম্প্রতিক বিপরীতে শুরু করুন:
git config user.name "New User"
git config user.email "newuser@gmail.com"
git rebase -i 1f1357

# change word pick to edit, save and exit
edit 809b8f7 change code order 
pick 9baaae5 add prometheus monitor kubernetes
edit 5d726c3 fix liquid escape issue   
edit 3a5f98f update tags
pick 816e21c add prometheus monitor kubernetes
  • রিবাজ পরবর্তী কমিট আইডি, আউটপুট এ বন্ধ হবে:
Stopped at 809b8f7...  change code order 
You can amend the commit now, with
  git commit --amend 

Once you are satisfied with your changes, run

  git rebase --continue
  • নিশ্চিত করুন এবং আপনার রিবেসটিকে এটির সাফল্যের সাথে অব্যাহত রাখুন refs/heads/master.
# each continue will show you an amend message
# use git commit --amend --reset-author --no-edit to comfirm
# use git rebase --skip to skip
git commit --amend --reset-author --no-edit
git rebase --continue
git commit --amend --reset-author --no-edit
...
git rebase --continue
Successfully rebased and updated refs/heads/master.
  • আপডেট করার জন্য গিট ধাক্কা
git push --force-with-lease

5

আপনি যে প্রতিশ্রুতিটি পরিবর্তন করতে চান তা যদি শেষ প্রতিশ্রুতি না হয় তবে নীচের পদক্ষেপগুলি অনুসরণ করুন। যদি আপনার কমিট বিভিন্ন শাখায় থাকে তবে প্রথমে সেই শাখায় স্যুইচ করুন।

গিট চেকআউট শাখা_নাম

আপনি যে প্রতিশ্রুতি পরিবর্তন করতে চান তার আগে প্রতিশ্রুতি সন্ধান করুন এবং এর হ্যাশটি সন্ধান করুন। তারপরে রিবেস কমান্ড ইস্যু করুন।

গিট রিবেস -i -p কমিটের হ্যাশ

তারপরে একটি সম্পাদক খুলবেন এবং যে পরিবর্তনগুলি আপনি পরিবর্তন করতে চান তার জন্য 'সম্পাদনা' প্রবেশ করবে। ডিফল্ট 'পিক' বিকল্পের সাহায্যে অন্যকে ছেড়ে যান। একবার পরিবর্তিত হয়ে 'এস্ক' কী এবং ডাব্লিউকিউ লিখুন! প্রস্থান করা.

তারপরে সংশোধন বিকল্পের সাথে গিট কমিট কমান্ড জারি করুন।

git কমিট --amend --author = "ব্যবহারকারীর নাম ইমেল" - না-সম্পাদনা

তারপরে নিম্নলিখিত কমান্ডটি ইস্যু করুন।

গিট রিবেস - অবিরত

প্রতিশ্রুতিবদ্ধ লেখক একবার স্থানীয় সংগ্রহস্থলে আপডেট হয়ে গেলে, দূরবর্তী সংগ্রহস্থলগুলিতে পরিবর্তনগুলি চাপুন।


আমি মনে করি এটি করার সহজ উপায় এটি। আমি রিওয়ার্ড কমান্ড ব্যবহার করছিলাম এবং এটি ব্যর্থ হয়েছিল। আমি শিখেছি পরিবর্তে আমার সম্পাদনা কমান্ড ব্যবহার করা প্রয়োজন। সম্ভবত "সম্পাদনা" কীওয়ার্ডটি হাইলাইট করা যেতে পারে। উত্তরের জন্য ধন্যবাদ @ চন্নাবি 👍
বার্ক

পদক্ষেপগুলি অনুসরণ করা সত্যিই সহজ। ধন্যবাদ!
হাবিবা

4

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

আপনার মূল শাখায় যান:

git checkout develop

এটি থেকে নতুন শাখা তৈরি করুন:

git checkout -b myFeature develop 

প্রতিশ্রুতিবদ্ধ তথ্য ছাড়াই একে কমিট হিসাবে মার্জ করুন:

git merge --no-commit --squash branchWrongAuthor

আপনি পরিবর্তনগুলি পর্যায়ক্রমেও যেতে চাইতে পারেন:

git stage .

লেখকের নাম পরিবর্তন করুন এবং পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ করুন:

git commit --amend --author "New Author Name <New Author Email>" -m "new feature added"

এবং এটি হ'ল, আপনি পরিবর্তনগুলি ধাক্কা দিতে পারেন।

git push

এর পরে আপনি কোনও ভুল লেখকের সাথে শাখাটি মুছতে পারেন।


4

প্রতিশ্রুতিবদ্ধ চাপের পরে লেখকের নাম পরিবর্তন করার পদক্ষেপ

  1. কমিট আইডি এবং আরও বিশদ জানতে প্রথম "গিট লগ" টাইপ করুন
  2. গিট রিবেস আমি হেড ~ 10 (10 রিবাজে প্রদর্শিত মোট প্রতিশ্রুতি)

    If you Get anything like below

    fatal: It seems that there is already a rebase-merge directory, and I wonder if you are in the middle of another rebase. If that is the case, please try

    git rebase (--continue | --abort | --skip) If that is not the case, please rm -fr ".git/rebase-merge" and run me again. I am stopping in case you still have something valuable there.

  3. তারপরে আপনার প্রয়োজন অনুযায়ী "গিট রিবেস - কনটিনিউ" বা "গিট রিবেস --abort" টাইপ করুন

    • এখন আপনার উইল রিবেস উইন্ডো খোলা হয়েছে, কীবোর্ড থেকে "i" কী টিপুন
    • তারপরে আপনি কমিটের তালিকা 10 এ পাবেন [কারণ আমরা উপরে 10 টি কমিট পাস করেছি] নীচের মত

    pick 897fe9e simplify code a little

    pick abb60f9 add new feature

    pick dc18f70 bugfix

  4. এখন আপনাকে যে কমিট সম্পাদনা করতে চান তার ঠিক নীচে নীচের কমান্ডটি যুক্ত করতে হবে

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

    1. এটি এখন, কেবল এসএসসি টিপুন: ডাব্লিউকিউ এবং আপনি প্রস্তুত আছেন

    2. তারপরে গিট পুশ অরিজিনের শিরোনাম: ব্রাঞ্চের নাম -f [দয়া করে -ফ ফোর্স পুশের যত্ন নিন]

    মত git push -fবাgit push origin HEAD: dev -f


দুর্দান্ত উত্তর, আপনি git pushআদেশের উদাহরণ সহ 6 পয়েন্ট আপডেট করতে পারবেন ?
লুকাসজ 'সেভেরিয়ান' গ্রেলা

1
@ লুকাস'সেভেরিয়া'গ্রেলা সম্পাদিত, দয়া করে এখনই দেখুন, ধন্যবাদ
কির্তিকুমার এ।

3

আপনার প্রতিশ্রুতিবদ্ধ নাম এবং বিশ্বব্যাপী ইমেল পরিবর্তন:

$ git config --global user.name "John Doe"
$ git config --global user.email "john@doe.org"

প্রতি প্রতিবেদকের প্রতি আপনার প্রতিশ্রুতিবদ্ধ নাম এবং ইমেল পরিবর্তন করা:

$ git config user.name "John Doe"
$ git config user.email "john@doe.org"

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

$ git commit --author="John Doe <john@doe.org>"

ইঙ্গিত : অন্যান্য পরিস্থিতিতে এবং আরও তথ্য পড়ুন পোস্ট রেফারেন্স পড়ুন


2

আপনার যা পরিবর্তন করতে হবে তা হ'ল সর্বশেষ প্রতিশ্রুতির লেখক এবং অন্য কেউ আপনার সংগ্রহশালা ব্যবহার করছেন না, আপনি আপনার শেষ প্রতিশ্রুতিটি পূর্বাবস্থায় ফিরিয়ে নিতে পারেন:

git push -f origin last_commit_hash:branch_name 

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

git commit --amend --author "type new author here"

যে সম্পাদকটি খোলে এবং প্রস্থান করুন আপনার কোডটি আবার চাপ দিন:

git push

2

মার্জ কমিট বার্তার জন্য, আমি খুঁজে পেয়েছি যে আমি rebaseকমপক্ষে গিটলব ব্যবহার করে এটি সংশোধন করতে পারি না । এটি অঙ্গীকার হিসাবে মার্জটি দেখায় তবে আমি # ইশায় পুনরায় শোধ করতে পারি না। আমি এই পোস্টে সহায়ক মনে করি।

git checkout <sha of merge>
git commit --amend # edit message
git rebase HEAD previous_branch

এই তিনটি লাইনের কোডটি মার্জ কমিট বার্তা (লেখকের মতো) পরিবর্তন করার জন্য কাজ করেছিল।


1

আপনি গিথুবের অফিসিয়াল পৃষ্ঠা থেকে এই আদেশগুলি ব্যবহার করতে পারেন

https://help.github.com/en/github/using-git/changing-author-info

এখানে আদেশ আছে

#!/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

এখানে আপনি পুরানো ইমেলটি আপনার নতুন ব্যবহারকারীর নাম এবং ইমেল ঠিকানাতে পরিবর্তন করতে পারেন।

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