วิธีการเปลี่ยนผู้แต่งมอบอำนาจสำหรับหนึ่งกระทำเฉพาะ?


2108

ฉันต้องการที่จะเปลี่ยนผู้เขียนของการกระทำที่เฉพาะเจาะจงหนึ่งในประวัติศาสตร์ มันไม่ใช่การกระทำสุดท้าย

ฉันรู้เกี่ยวกับคำถามนี้ - ฉันจะเปลี่ยนผู้แต่งคอมมิทคอมได้อย่างไร?

แต่ฉันกำลังคิดเกี่ยวกับบางสิ่งที่ฉันระบุความมุ่งมั่นโดยแฮชหรือแฮชสั้น


มีความเป็นไปได้ที่ซ้ำกันของการแก้ไขคอมมิชชันเดิมที่ยังไม่ได้ทำ
tkruse

คำตอบ:


3563

การปฏิเสธแบบโต้ตอบจากจุดก่อนหน้านี้ในประวัติศาสตร์กว่าการมอบหมายที่คุณต้องแก้ไข ( 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แล้วคุณจะ ...

  1. ระบุgit rebase -i B( นี่คือตัวอย่างของสิ่งที่คุณจะเห็นหลังจากดำเนินการgit rebase -i Bคำสั่ง )
    • หากคุณต้องการแก้ไขAให้ใช้git rebase -i --root
  2. เปลี่ยนบรรทัดสำหรับทั้งCและDจากpickเป็นedit
  3. ออกจากเครื่องมือแก้ไข (สำหรับเป็นกลุ่มนี้จะกด Esc แล้วพิมพ์: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>
Mathew Byrne

47
หากคุณไม่รู้ว่าคุณกำลังแก้ไขอะไรอยู่คำตอบก็น่าจะเป็นvimเช่นนั้น หากต้องการบันทึกและออกให้พิมพ์ Esc: wq Enter ในทางกลับกันถ้าเป็นนาโนและคุณเห็นสิ่งต่าง ๆ เช่น "WriteOut: ^ O" ที่ด้านล่างคุณควรใช้ Ctrl + O, Enter, Ctrl + X แทน
แอมเบอร์

30
เกิดอะไรขึ้นถ้าคุณต้องการแก้ไขการกระทำแรก แฮชคอมมิทก่อนหน้านี้คืออะไร?
Brenden

219
ใช้--no-editตัวเลือก git commit --amend --reset-author --no-editจะไม่เปิดตัวแก้ไข มีให้ตั้งแต่ git 1.7.9
5lava

51
@Brenden เพื่อแก้ไขการกระทำแรกในโครงการให้ใช้git rebase -i --root
Noah Passalacqua

488

คำตอบที่ได้รับการยอมรับสำหรับคำถามนี้คือการใช้ฉลาดอย่างน่าพิศวงของ rebase โต้ตอบ แต่ก็น่าเสียดายที่การจัดแสดงนิทรรศการความขัดแย้งถ้ากระทำที่เรากำลังพยายามที่จะเปลี่ยนผู้เขียนเคยเป็นสาขาซึ่งรวมต่อมาในส่วน. มากกว่าปกติก็ไม่ได้ทำงาน เมื่อจัดการกับประวัติที่ยุ่งเหยิง

เนื่องจากฉันกังวลเกี่ยวกับการเรียกใช้สคริปต์ซึ่งขึ้นอยู่กับการตั้งค่าและการยกเลิกการตั้งค่าตัวแปรสภาพแวดล้อมเพื่อเขียนประวัติคอมไพล์ฉันจึงเขียนคำตอบใหม่ตามโพสต์นี้ซึ่งคล้ายกับคำตอบนี้แต่สมบูรณ์กว่า

การทดสอบและการทำงานต่อไปนี้ต่างจากคำตอบที่เชื่อมโยง สมมติว่ามีความชัดเจนในการอธิบายซึ่ง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. เขียนซ้ำทุกความมุ่งมั่นในอนาคตขึ้นอยู่กับการเปลี่ยน

    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
Benjamin Riggs

42
git rebase -iนี้มีลักษณะทางเลือกที่ชัดเจนมากที่จะน่ากลัว ไม่เคยได้ยินเรื่องนี้git replaceมาก่อน +1
FractalSpace

3
เพื่อทำความสะอาด refs / original / ... backup ดูที่นี่
alexis

5
ผมขอแนะนำให้ใช้แทน--force-with-lease -fมันปลอดภัยกว่า
Jay Bazuzi

11
คำเตือน: ระวังว่าgit filter-branch -- --allมีการเปลี่ยนแปลงการกระทำในทุกสาขาที่การกระทำดั้งเดิมเข้ามาหากคุณมีข้อมูลประจำตัวไม่เพียงพอ (หรือคุณไม่ต้องการเปลี่ยนประวัติสาขาของผู้อื่น) ก็ควรระวังคำตอบนี้
ribamar

225

เอกสาร Github มีสคริปต์ที่มาแทนที่ข้อมูล committer สำหรับการกระทำทั้งหมดในสาขาที่

  • เรียกใช้สคริปต์ต่อไปนี้จากเทอร์มินัลหลังจากเปลี่ยนค่าตัวแปร

    #!/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
    
  • ผลักดันประวัติที่แก้ไขไปยัง GitHub:

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

    หรือถ้าคุณต้องการที่จะผลักดันการอ้างอิงที่เลือกของสาขาแล้วใช้

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

12
การเปลี่ยนแปลงนี้จะกระทำในทุกการกระทำไม่ใช่แค่หนึ่งเดียว สิ่งที่ตลกฉันทำสิ่งนี้น้อยกว่า 30 นาทีที่ผ่านมา
Artjom B.

เมื่อฉันพบคำตอบนี้หลังจากอ่านคำตอบก่อนหน้าฉันคิดว่ามันคุ้มค่าที่จะลองดูและ voila ก็ทำงานได้ดี อย่างไรก็ตามในกรณีของฉันมันเปลี่ยนชื่อผู้เดินทางในการกระทำเริ่มต้นเท่านั้น ก่อนที่ฉันจะลองไอเดียจากคำตอบแรก บางทีมันอาจส่งผลกระทบต่อระบบอย่างใด
Ruslan Gerasimov

2
โปรดทราบว่าถ้าคุณหลีกเลี่ยงการใช้clone/ pushคุณจะจบลงด้วยการสำรองข้อมูล refs/original/namespace ฉันไม่สามารถหาวิธีลบ namespace นี้ได้อย่างชาญฉลาดดังนั้นฉันจึงสิ้นสุดการลบไดเรกทอรี.git/refs/originalซึ่งใช้งานได้
VasiliNovikov

ทำไมสิ่งนี้ส่งผลให้เกิดการเปลี่ยนแปลงของ repo ถ้าเช่น OLD_EMAIL ไม่ตรงกับสิ่งใด? ด้วยเหตุผลบางอย่างไม่กี่คน (แต่ไม่ใช่ทั้งหมด!) กระทำการเปลี่ยนแปลงแฮช
mjs

1
กรณีการใช้งานของฉันสำหรับคำตอบนี้คือ: ฉันมีบัญชี GitHub สองบัญชีหนึ่งบัญชีที่ฉันใช้โดยไม่ได้ตั้งใจเพื่อส่งมอบ สคริปต์นี้ช่วยแก้ไขความมุ่งมั่นทั้งหมดของฉันโดยเปลี่ยนชื่ออีเมล / ชื่อผู้เปลี่ยนที่ไม่ถูกต้อง แน่นอนว่าถ้าฉันทำผิดกับผู้ใช้ผิดสมมติว่า 50 ส่งคำมั่นสัญญาที่ 500 ไปแล้วจะมีข้อผูกมัด 450 ข้อ อย่างไรก็ตามหลังจากเรียกใช้สคริปต์ตามที่ @andrej ชี้ให้เห็นคุณจะต้องgit push -fบังคับการเปลี่ยนแปลงไปสู่ ​​repo
LWY

167
  • รีเซ็ตอีเมลของคุณเป็นค่ากำหนดทั่วโลก:

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

  • ตอนนี้รีเซ็ตผู้เขียนการคอมมิทของคุณโดยไม่ต้องแก้ไข:

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


2
ไม่มันไม่ใช่. ดูที่ OP: It's not last commit.แล้วพวกamendมันจะเป็นอย่างไร
underscore_d

2
นี่มันยอดเยี่ยมมากมันเป็นความอัปยศที่เป็นคนสุดท้ายที่ทำ แต่เพียงอย่างเดียว ฉันต้องการมันในสองล่าสุดโชคดีดังนั้นเพียงแค่ทำgit reset HEAD~วิ่งบรรทัดที่แนะนำของคุณจากนั้นก็กระทำต่อไปด้วยตนเองอีกครั้ง ทำงานได้ดี!
Matt Fletcher

2
ขอบคุณ! --reset-author ใช้กลอุบายของฉันเนื่องจากไม่มีการเปลี่ยนแปลงผู้แต่ง แต่ "ผู้ดูแล" ยังคงอยู่กับรายละเอียดของผู้แต่งเก่า
ลูคัสพี

9
ในการแก้ไขปัญหาที่ผ่านมาหกกระทำของฉัน: First ตั้งผู้เขียนที่ถูกต้องสำหรับปัจจุบัน Git repo ใช้และ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 repo git push --force-with-leaseใช้
olibre

@olibre มันใช้งานได้เหมือนมีเสน่ห์ขอบคุณ
Bruno Gasparotto

88

คุณสามารถเปลี่ยนผู้แต่งคอมมิทล่าสุดได้โดยใช้คำสั่งด้านล่าง

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

อย่างไรก็ตามหากคุณต้องการเปลี่ยนชื่อผู้แต่งมากกว่าหนึ่งชื่อมันก็ค่อนข้างยุ่งยาก คุณต้องเริ่มการทำงานแบบ rebase แบบอินเทอร์แอคทีฟจากนั้นทำเครื่องหมายคอมมิทเป็นการแก้ไขจากนั้นทำการแก้ไขทีละรายการและเสร็จสิ้น

เริ่ม rebasing git rebase -iกับ มันจะแสดงบางอย่างเช่นนี้

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

เปลี่ยนpickคำหลักเป็นeditสำหรับการยอมรับที่คุณต้องการเปลี่ยนชื่อผู้แต่ง

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

จากนั้นปิดเครื่องมือแก้ไข สำหรับผู้เริ่มต้นตีEscapeแล้วพิมพ์และการตี:wqEnter

จากนั้นคุณจะเห็นเทอร์มินัลของคุณไม่มีอะไรเกิดขึ้น จริงๆแล้วคุณกำลังอยู่ในช่วงกลางของการปฏิเสธแบบโต้ตอบ ตอนนี้ได้เวลาแก้ไขชื่อผู้แต่งคอมมิทของคุณโดยใช้คำสั่งด้านบน มันจะเปิดตัวแก้ไขอีกครั้ง เลิกและ rebase git rebase --continueดำเนินการกับ ทำซ้ำเช่นเดียวกันสำหรับการนับการกระทำที่คุณต้องการแก้ไข คุณสามารถตรวจสอบให้แน่ใจว่าการปฏิเสธแบบโต้ตอบเสร็จสิ้นเมื่อคุณได้รับNo rebase in progress?ข้อความ


คุณช่วยอัพเดทรูปภาพของคุณหน่อยได้ไหม?
Shimmy Weitzhandler

1
หากคุณมีความมุ่งมั่นที่จะเปลี่ยนแปลงหลายรายการแทนที่จะแก้ไขเป็นรายบุคคลคุณสามารถปล่อยให้pickดำเนินการและเพิ่มหลังจากแต่ละบรรทัดexec git commit --no-edit --amend --author="MyNewAuthor <my@new-auth.or>"
Pierre-Olivier Vares

60

คำตอบในคำถามที่คุณเชื่อมโยงนั้นเป็นคำตอบที่ดีและครอบคลุมสถานการณ์ของคุณ (คำถามอื่นนั้นกว้างกว่าเนื่องจากเกี่ยวข้องกับการเขียนหลายคอมมิท)

เพื่อเป็นข้ออ้างในการทดลอง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 assembla.com git repo ไม่ปรากฏว่ามีการเปลี่ยนแปลงการอ้างอิงผู้เขียนทั้งหมดในมุมมองเว็บของ repo แต่ผลลัพธ์ของ 'git pull / clone' ดูเหมือนว่าจะทำงานได้ทั้งหมด
Johnny Utahh

วิธีแก้ปัญหาที่ยอดเยี่ยมเนื่องจากเปลี่ยนแปลงเฉพาะสิ่งที่ต้องการและไม่ใช่สาขาอื่นเช่นวันที่ส่ง
Guillaume Lemaître


2
@ olivieradam666 ที่ใช้งานได้อย่างมีเสน่ห์และอ่านง่ายขึ้น
fregante

@ olivieradam666 ขอบคุณ คุณควรเพิ่มคำตอบนั้นเพื่อให้ได้รับความสนใจมากขึ้น
seane

44

กระทำก่อน:

ป้อนคำอธิบายรูปภาพที่นี่

ในการแก้ไขปัญหาผู้แต่งคุณสามารถใช้คำสั่งจากคำตอบของ @ Amber:

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

หมายเหตุ: ในการรวมผู้แต่งที่มีช่องว่างเช่นชื่อและที่อยู่อีเมลผู้เขียนจะต้องล้อมรอบด้วยคำพูดที่ใช้ Escape ตัวอย่างเช่น:

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
นี่คือคำตอบที่ตอบสนองวัตถุประสงค์ของฉันได้ดีที่สุดขอบคุณ และตั้งแต่ฉันแค่อยากจะปรับของฉันที่อยู่อีเมลของฉันจะทำงานด้วย = --exec "คอมไพล์กระทำ --amend --reset ผู้เขียน" หลังจากการปรับปรุงของฉัน .git / config
Dato

1
เอ๊ะไม่แน่ใจว่าทำไมฉันลืม! เสร็จแล้ว
Dato

คำตอบที่ยอดเยี่ยมและง่ายต่อการแก้ไข รักนามแฝง!
J_A_X

ที่ไม่ได้ช่วยฉัน ตอนนี้ฉันมีข้อผิดพลาดRebase ดำเนินการต่อ
Alexey

17

มีอีกหนึ่งขั้นตอนสำหรับคำตอบของแอมเบอร์ถ้าคุณใช้ที่เก็บส่วนกลาง:

git push -f เพื่อบังคับให้มีการอัพเดตที่เก็บส่วนกลาง

ระวังว่ามีคนไม่มากที่ทำงานในสาขาเดียวกันเพราะอาจทำลายความมั่นคงได้


16

เมื่อทำgit rebase -iมีบิตที่น่าสนใจในเอกสารนี้:

หากคุณต้องการที่จะพับสองคนหรือมากกว่ากระทำเป็นหนึ่งแทนที่คำสั่ง"pick"สำหรับกระทำสองและต่อมาด้วยหรือ"squash" "fixup"หากคอมมิทมีผู้แต่งคนอื่นการคอมมิทแบบพับจะถูกนำมาประกอบกับผู้แต่งคอมมิทก่อน ข้อความคอมมิชชันที่แนะนำสำหรับการคอมมิทแบบ folded คือการรวมข้อความคอมมิทของการคอมมิทครั้งแรกและ"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"
  • เริ่มการดำเนินการ rebase
    • 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"

สิ่งนี้ได้ผล & เปลี่ยนแปลงได้ในทุกข้อผูกพัน
SagarKapasi099

1
ขอบคุณสำหรับคำตอบ. มันต้องเพิ่ม - โต้ตอบเพื่อให้มันใช้งานได้ git rebase - รูท - อินเทอร์แอกซ์ --exec "คอมไพล์คอมมิท --amend --author = 'ชื่อ <email>' - ไม่มีการแก้ไข"
Sreeragh AR

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 rebase เริ่มต้นจาก chosed commit id ไปสู่การย้อนกลับล่าสุด:
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
  • rebase จะหยุดที่การส่งข้อมูลครั้งถัดไป:
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 เพื่ออัปเดต
git push --force-with-lease

5

หากการส่งมอบที่คุณต้องการเปลี่ยนไม่ใช่การส่งมอบครั้งสุดท้ายให้ทำตามขั้นตอนด้านล่าง หากการกระทำของคุณอยู่ในสาขาที่แตกต่างกันก่อนอื่นให้สลับไปที่สาขานั้น

git checkout branch_name

ค้นหาการกระทำก่อนส่งคำสั่งที่คุณต้องการเปลี่ยนและค้นหาแฮช จากนั้นออกคำสั่ง rebase

git rebase -i -p hash of commit

จากนั้นตัวแก้ไขจะเปิดขึ้นและป้อน 'แก้ไข' สำหรับข้อผูกพันที่คุณต้องการเปลี่ยนแปลง ปล่อยให้คนอื่น ๆ ที่มีตัวเลือก 'เลือก' เริ่มต้น เมื่อเปลี่ยนแล้วใส่รหัส 'esc' และ wq! เพื่อออก

จากนั้นออกคำสั่งคอมไพล์ด้วยตัวเลือกการแก้ไข

git กระทำ - แก้ไข --author = "อีเมลชื่อผู้ใช้" - ไม่แก้ไข

จากนั้นออกคำสั่งต่อไปนี้

git rebase - ยุติ

เมื่อผู้เขียนคอมมิชชันถูกอัพเดตในที่เก็บโลคัลให้ดันการเปลี่ยนแปลงไปยังที่เก็บรีโมต


ฉันคิดว่านี่เป็นวิธีที่ง่ายที่สุดที่จะทำ ฉันใช้คำสั่ง reword และล้มเหลว ฉันเรียนรู้ว่าฉันต้องใช้คำสั่งแก้ไขแทน อาจมีการเน้นคำหลัก“ แก้ไข” ขอบคุณสำหรับคำตอบ @ChannaB 👍
Berk

ง่ายมากที่จะทำตามขั้นตอน ขอบคุณ!
Habiba

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. ประเภทแรก "บันทึก git" เพื่อรับรหัสกระทำและรายละเอียดเพิ่มเติม
  2. git rebase i HEAD ~ 10 (10 คือจำนวนการกระทำทั้งหมดที่จะแสดงเมื่อ rebase)

    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. จากนั้นพิมพ์ "git rebase - ยุติ" หรือ "git rebase --abort" ตามความต้องการของคุณ

    • ตอนนี้หน้าต่าง rebase ของคุณจะเปิดขึ้นให้คลิกที่ปุ่ม "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. แค่นี้ก็กด ESC,: wq และคุณพร้อมแล้ว

    2. จากนั้นคอมไพล์ต้นกำเนิด HEAD: BRANCH NAME -f [โปรดดูแล -f Force push]

    ชอบ git push -fหรือgit push origin HEAD: dev -f


คำตอบที่ดีมากคุณสามารถอัปเดตจุดที่ 6 ด้วยตัวอย่างของgit pushคำสั่งได้ไหม
Lukasz 'Severiaan' Grela

1
@ Lukasz'Severiaan'Grela แก้ไขแล้วโปรดตรวจสอบก่อนนี้ขอบคุณ
Kirtikumar A.

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

หากสิ่งที่คุณต้องการเปลี่ยนแปลงคือ AUTHOR of THE LAST และไม่มีผู้อื่นใช้ที่เก็บของคุณคุณสามารถยกเลิกการคอมมิทครั้งล่าสุดด้วย:

git push -f origin last_commit_hash:branch_name 

เปลี่ยนชื่อผู้แต่งของการกระทำของคุณด้วย:

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

ออกจากเครื่องมือแก้ไขที่เปิดขึ้นและดันรหัสของคุณอีกครั้ง:

git push

2

สำหรับข้อความยืนยันการรวมฉันพบว่าฉันไม่สามารถแก้ไขได้โดยใช้rebaseอย่างน้อยบน gitlab มันแสดงให้เห็นว่าการรวมเป็นการกระทำ แต่ฉันไม่สามารถ rebase ลงบน #sha ได้ ฉันพบว่าโพสต์นี้มีประโยชน์

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

โค้ดสามบรรทัดนี้ทำงานเพื่อเปลี่ยนข้อความการยอมรับรวม (เช่นผู้เขียน)


1

คุณสามารถใช้คำสั่งเหล่านี้ได้จากหน้าทางการของ GitHub

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.