Làm thế nào để thay đổi tác giả cam kết cho một cam kết cụ thể?


2109

Tôi muốn thay đổi tác giả của một cam kết cụ thể trong lịch sử. Đó không phải là cam kết cuối cùng.

Tôi biết về câu hỏi này - Làm cách nào để thay đổi tác giả của một cam kết trong git?

Nhưng tôi đang suy nghĩ về một cái gì đó, nơi tôi xác định cam kết bằng hàm băm hoặc hàm băm ngắn.


Câu trả lời:


3566

Tương tác loại bỏ một điểm sớm hơn trong lịch sử so với cam kết bạn cần sửa đổi ( git rebase -i <earliercommit>). Trong danh sách các xác nhận bị từ chối, thay đổi văn bản từ picksang editbên cạnh hàm băm của cái bạn muốn sửa đổi. Sau đó, khi git nhắc bạn thay đổi cam kết, hãy sử dụng:

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

Ví dụ, nếu lịch sử cam kết của bạn là A-B-C-D-E-Fvới Fnhư HEAD, và bạn muốn thay đổi các tác giả của CD, sau đó bạn sẽ ...

  1. Chỉ định git rebase -i B( đây là một ví dụ về những gì bạn sẽ thấy sau khi thực hiện git rebase -i Blệnh )
    • nếu bạn cần chỉnh sửa A, hãy sử dụnggit rebase -i --root
  2. Thay đổi dòng cho cả hai CDtừ pickđếnedit
  3. Thoát trình chỉnh sửa (đối với vim, thao tác này sẽ nhấn Esc và sau đó nhập :wq).
  4. Khi cuộc nổi loạn bắt đầu, đầu tiên nó sẽ tạm dừng tại C
  5. Bạn muốn git commit --amend --author="Author Name <email@address.com>"
  6. Sau đó git rebase --continue
  7. Nó sẽ tạm dừng một lần nữa tại D
  8. Sau đó, bạn sẽ git commit --amend --author="Author Name <email@address.com>"một lần nữa
  9. git rebase --continue
  10. Cuộc nổi loạn sẽ hoàn thành.
  11. Sử dụng git push -fđể cập nhật nguồn gốc của bạn với các cam kết được cập nhật.

90
Câu trả lời hay, nhưng dành cho người mới bắt đầu: trước tiên hãy tìm một cam kết trước khi bạn muốn thay đổi, sau đó chạygit rebase -i <commit>
Mathew Byrne

47
Nếu bạn không biết bạn đang chọn trình soạn thảo nào, câu trả lời rất có thể vim. Để lưu và thoát, gõ Esc: wq Enter. Mặt khác, nếu đó là Nano và bạn thấy những thứ như "WriteOut: ^ O" dọc theo phía dưới, thì bạn nên sử dụng Ctrl + O, Enter, Ctrl + X thay thế.
Amber

30
Điều gì nếu bạn muốn sửa đổi cam kết đầu tiên? Băm cam kết trước đó là gì?
Brenden

219
Sử dụng --no-edittùy chọn. git commit --amend --reset-author --no-editsẽ không mở một biên tập viên. Có sẵn kể từ git 1.7.9.
5lava

51
@Brenden để sửa đổi cam kết đầu tiên trong dự án, hãy sử dụnggit rebase -i --root
Noah Passalacqua

488

Các câu trả lời được chấp nhận cho câu hỏi này là một sử dụng tuyệt vời thông minh của rebase tương tác, nhưng nó không may thể hiện mâu thuẫn nếu cam kết, chúng tôi đang cố gắng để thay đổi tác giả của sử dụng để được trên một chi nhánh mà sau đó đã được sáp nhập vào. Tổng quát hơn, nó không làm việc khi xử lý lịch sử lộn xộn.

Vì tôi e ngại về việc chạy các tập lệnh phụ thuộc vào cài đặt và bỏ đặt các biến môi trường để viết lại lịch sử git, tôi viết một câu trả lời mới dựa trên bài đăng này tương tự như câu trả lời này nhưng đầy đủ hơn.

Sau đây là thử nghiệm và làm việc, không giống như câu trả lời được liên kết. Giả sử cho sự rõ ràng của giải trình 03f482d6là cam kết mà tác giả chúng tôi đang cố gắng thay thế, và 42627abelà cam kết với tác giả mới.

  1. Kiểm tra các cam kết chúng tôi đang cố gắng sửa đổi.

    git checkout 03f482d6
    
  2. Làm cho tác giả thay đổi.

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

    Bây giờ chúng tôi có một cam kết mới với hàm băm được giả định là 42627abe.

  3. Kiểm tra chi nhánh ban đầu.

  4. Thay thế cam kết cũ bằng cái mới cục bộ.

    git replace 03f482d6 42627abe
    
  5. Viết lại tất cả các cam kết trong tương lai dựa trên sự thay thế.

    git filter-branch -- --all
    
  6. Loại bỏ sự thay thế cho sạch sẽ.

    git replace -d 03f482d6
    
  7. Đẩy lịch sử mới (chỉ sử dụng - buộc nếu bên dưới không thành công và chỉ sau khi kiểm tra độ tỉnh táo với git logvà / hoặc git diff).

    git push --force-with-lease
    

Thay vì 4-6, bạn chỉ có thể khởi động lại cam kết mới:

git rebase -i 42627abe

9
Vui lòng đặt một ghi chú vào đó để kiểm tra lại chi nhánh ban đầu của bạn sau bước 2.
Benjamin Riggs

42
Điều này có vẻ rõ ràng thay thế cho kinh khủng git rebase -i. Chưa bao giờ nghe nói về điều này git replacetrước đây. +1
FractalSpace

3
Để làm sạch các bản sao lưu / bản gốc / ... xem tại đây
alexis

5
Tôi khuyên bạn nên sử dụng --force-with-leasethay vì -f. An toàn hơn.
Jay Bazuzi

11
CẢNH BÁO: lưu ý rằng git filter-branch -- --allviệc thay đổi cam kết trong tất cả các chi nhánh mà cam kết ban đầu đã tham gia. Nếu bạn không có đủ thông tin xác thực (hoặc bạn chỉ không muốn thay đổi lịch sử chi nhánh của người khác), thật tốt khi cẩn thận với câu trả lời này.
ribamar

225

Tài liệu Github chứa một tập lệnh thay thế thông tin committer cho tất cả các cam kết trong một nhánh .

  • Chạy đoạn script sau từ terminal sau khi thay đổi giá trị biến

    #!/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
    
  • Đẩy lịch sử đã sửa vào GitHub:

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

    HOẶC nếu bạn muốn đẩy các tham chiếu đã chọn của các nhánh thì hãy sử dụng

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

12
Điều này thay đổi nó trong tất cả các cam kết, không chỉ một. Điều buồn cười, tôi đã làm điều này ít hơn 30 phút trước.
Artjom B.

Khi tôi tìm thấy câu trả lời này sau khi đọc những câu trước, tôi nghĩ rằng nó đáng để thử và thì đó là công việc. Tuy nhiên, trong trường hợp của tôi, nó chỉ thay đổi tên committer trong cam kết ban đầu. Nhân tiện, trước khi tôi thử ý tưởng từ câu trả lời đầu tiên. Có lẽ nó ảnh hưởng đến hệ thống bằng cách nào đó.
Ruslan Gerasimov

2
Lưu ý rằng nếu bạn tránh sử dụng clone/ push, bạn sẽ có một không gian tên dự phòng refs/original/. Tôi không thể tìm ra cách để loại bỏ không gian tên này một cách thông minh, vì vậy tôi đã kết thúc việc xóa thư mục .git/refs/original, nó đã hoạt động.
VasiliNovikov

Tại sao điều này dẫn đến thay đổi đối với repo nếu ví dụ OLD_EMAIL không khớp với bất cứ điều gì? Vì một số lý do, một vài (nhưng không phải tất cả!) Cam kết thay đổi băm.
mjs

1
Trường hợp sử dụng của tôi cho câu trả lời này là: Tôi có hai tài khoản github, một tài khoản mà tôi vô tình sử dụng để thực hiện các cam kết. Kịch bản này đã giúp sửa tất cả các cam kết của tôi bằng cách đổi tên email / tên người gửi không chính xác. Tất nhiên, nếu tôi đã cam kết với người dùng sai từ, giả sử, cam kết thứ 50 đến cam kết thứ 500, sẽ có 450 cam kết chuyển hướng. Dù sao, sau khi chạy tập lệnh, như @andrej đã chỉ ra, bạn sẽ cần phải git push -fđẩy các thay đổi đẩy sang repo.
LÚC

168
  • Đặt lại email của bạn để cấu hình trên toàn cầu:

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

  • Bây giờ đặt lại tác giả của cam kết của bạn mà không cần chỉnh sửa:

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


2
Không, không phải vậy. Nhìn vào OP: It's not last commit.Vậy họ sẽ như thế nào amend?
gạch dưới

2
Điều này thật tuyệt, thật đáng tiếc, đó chỉ là cam kết cuối cùng. Tôi đã cần nó trên hai cái mới nhất, may mắn thay, vì vậy chỉ cần làm một git reset HEAD~, chạy các dòng gợi ý của bạn, sau đó thực hiện lại cam kết tiếp theo một cách thủ công. Làm việc tốt
Matt Fletcher

2
Cảm ơn! Tác giả --reset đã thực hiện mánh khóe cho tôi, vì không có nó, tác giả thay đổi nhưng "người đi làm" vẫn ở lại với các chi tiết của tác giả cũ.
Lucas P.

9
Để sửa sáu cam kết cuối cùng của tôi: Đầu tiên hãy đặt đúng tác giả cho repo Git hiện tại bằng cách sử dụng git config --local user.name FirstName LastNamegit config --local user.email first.last@example.com. Sau đó áp dụng cho sáu cam kết cuối cùng bằng cách sử dụng git rebase --onto HEAD~6 --exec "git commit --amend --reset-author --no-edit" HEAD~6. Cuối cùng đẩy nó vào repo Git từ xa bằng cách sử dụng git push --force-with-lease.
olibre

@olibre nó hoạt động như một bùa mê, cảm ơn.
Bruno Gasparotto

88

Bạn có thể thay đổi tác giả của lần xác nhận cuối cùng bằng cách sử dụng lệnh bên dưới.

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

Tuy nhiên, nếu bạn muốn thay đổi nhiều hơn một tên tác giả, điều đó hơi khó. Bạn cần bắt đầu một rebase tương tác sau đó đánh dấu các cam kết là chỉnh sửa sau đó sửa đổi từng cái một và hoàn thành.

Bắt đầu nổi loạn với git rebase -i. Nó sẽ cho bạn thấy một cái gì đó như thế này.

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

Thay đổi picktừ khóa thành editcam kết bạn muốn thay đổi tên tác giả.

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

Sau đó đóng trình chỉnh sửa. Đối với người mới bắt đầu, nhấn Escaperồi gõ :wqvà đánhEnter .

Sau đó, bạn sẽ thấy thiết bị đầu cuối của bạn như không có gì xảy ra. Trên thực tế, bạn đang ở giữa một cuộc nổi loạn tương tác. Bây giờ là lúc sửa đổi tên tác giả của bạn bằng cách sử dụng lệnh trên. Nó sẽ mở trình soạn thảo một lần nữa. Thoát và tiếp tục rebase với git rebase --continue. Lặp lại tương tự cho số lượng cam kết bạn muốn chỉnh sửa. Bạn có thể chắc chắn rằng rebase tương tác đã kết thúc khi bạn nhận được No rebase in progress?tin nhắn.


Bạn có thể vui lòng cập nhật hình ảnh của bạn?
Shimmy Weitzhandler

1
Nếu bạn có nhiều cam kết thay đổi, thay vì chỉnh sửa chúng riêng lẻ, bạn cũng có thể để pickhành động và thêm sau mỗi dòngexec git commit --no-edit --amend --author="MyNewAuthor <my@new-auth.or>"
Pierre-Olivier Vares

60

Các câu trả lời trong câu hỏi mà bạn liên kết là câu trả lời hay và bao quát tình huống của bạn (câu hỏi còn lại chung chung hơn vì nó liên quan đến việc viết lại nhiều cam kết).

Để bào chữa git filter-branch, tôi đã viết một kịch bản để viết lại Tên tác giả và / hoặc Email tác giả cho một cam kết nhất định:

#!/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 cảm ơn. Assembla.com git repo dường như không thay đổi tất cả các tham chiếu của tác giả trong chế độ xem web của repo, nhưng kết quả của 'git pull / clone' dường như đều ổn.
Johnny Utahh

Giải pháp tuyệt vời, vì nó chỉ thay đổi những gì dự định, chứ không phải các lĩnh vực khác, như ngày cam kết.
Guillaume Lemaître

12
Tài liệu Github chứa một tập lệnh tương tự
olivieradam666

2
@ olivieradam666 hoạt động như một bùa mê và dễ đọc hơn
fregante

@ olivieradam666 Cảm ơn bạn. Bạn thực sự nên thêm nó như là một câu trả lời để nó được chú ý nhiều hơn.
seane

44

Cam kết trước:

nhập mô tả hình ảnh ở đây

Để sửa tác giả cho tất cả các cam kết, bạn có thể áp dụng lệnh từ câu trả lời của @ Amber:

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

Hoặc để sử dụng lại tên và email của bạn, bạn chỉ cần viết:

git commit --amend --author=Eugen

Cam kết sau lệnh:

nhập mô tả hình ảnh ở đây

Ví dụ để thay đổi tất cả bắt đầu từ 4025621:

nhập mô tả hình ảnh ở đây

Bạn phải chạy:

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

Lưu ý: Để bao gồm một tác giả có chứa các khoảng trắng như tên và địa chỉ email, tác giả phải được bao quanh bởi các trích dẫn được thoát. Ví dụ:

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

hoặc thêm bí danh này vào ~/.gitconfig:

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

Và sau đó chạy:

git reauthor 4025621 Eugen

1
Để xác minh rằng lệnh hoạt động như mong đợi, tôi đã xem lại đầu ra của git shortlog -e -s.
Taylor Edmiston

5
Đây là câu trả lời phục vụ tốt nhất cho mục đích của tôi, cảm ơn bạn. Và kể từ khi tôi chỉ muốn điều chỉnh của tôi địa chỉ e-mail, tôi có thể chạy với --exec = "git commit --amend --reset giả", sau khi cập nhật của tôi .git / config.
Dato

1
Eeh, không chắc tại sao tôi quên! Xong ngay.
Dato

Câu trả lời tuyệt vời và rất dễ sửa chữa. Yêu bí danh!
J_A_X

Điều đó đã không giúp tôi. Bây giờ tôi đã Continue rebase Không lỗi
Alexey Sh.

17

Có thêm một bước cho câu trả lời của Amber nếu bạn đang sử dụng kho lưu trữ tập trung:

git push -f để buộc cập nhật các kho lưu trữ trung tâm.

Hãy cẩn thận rằng không có nhiều người làm việc trong cùng một chi nhánh vì nó có thể phá hỏng tính nhất quán.


16

Khi làm git rebase -iđiều này có một chút thú vị trong tài liệu:

Nếu bạn muốn gấp hai hoặc nhiều lần xác nhận thành một, hãy thay thế lệnh "pick"cho lần xác nhận thứ hai và tiếp theo bằng "squash"hoặc "fixup". Nếu các xác nhận có các tác giả khác nhau, thì cam kết được gấp lại sẽ được quy cho tác giả của cam kết đầu tiên. Thông báo cam kết được đề xuất cho cam kết được gấp lại là nối các thông điệp cam kết của cam kết đầu tiên và của những người có "squash"lệnh, nhưng bỏ qua các thông báo cam kết cam kết với "fixup"lệnh.

  • Nếu bạn có một lịch sử về A-B-C-D-E-F,
  • và bạn muốn thay đổi các xác nhận BD(= 2 lần xác nhận),

sau đó bạn có thể làm:

  • git config user.name "Correct new name"
  • git config user.email "correct@new.email"
  • tạo các xác nhận trống (một cho mỗi cam kết):
    • bạn cần một tin nhắn cho mục đích rebase
    • git commit --allow-empty -m "empty"
  • bắt đầu hoạt động rebase
    • git rebase -i B^
    • B^chọn cha mẹ của B.
  • bạn sẽ muốn đặt một cam kết trống trước mỗi cam kết sửa đổi
  • bạn sẽ muốn thay đổi pickđể squashcho những người.

Ví dụ về những gì git rebase -i B^sẽ cung cấp cho bạn:

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

thay đổi thành:

# 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

Nó sẽ nhắc bạn chỉnh sửa tin nhắn:

# 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...

và bạn chỉ có thể loại bỏ một vài dòng đầu tiên.


16

Để đáp ứng với phản ứng của Eugen Konkov , để bắt đầu từ cam kết gốc, hãy sử dụng --rootcờ. Các --no-editlá cờ là hữu ích quá

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

Điều này đã làm việc và thay đổi trên tất cả các cam kết.
SagarKapasi099

1
Cảm ơn câu trả lời. Nó đã phải thêm - tương tác để làm cho nó hoạt động. git rebase --root --interactive --exec "git commit --amend - Author = 'name <email>' --no-edit"
Sreeragh AR

8

Tìm cách có thể thay đổi người dùng nhanh chóng và không có tác dụng phụ đối với các cam kết khác.

Cách đơn giản và rõ ràng:

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

hoạt động chi tiết

  • hiển thị nhật ký cam kết và tìm ra id xác nhận trước cam kết mà bạn muốn thay đổi:
git log
  • git rebase bắt đầu từ id xác nhận được chọn đến lần đảo ngược gần đây:
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 sẽ dừng ở id xác nhận tiếp theo, đầu ra:
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
  • xác nhận và tiếp tục cuộc nổi loạn của bạn cho đến khi thành công 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 đẩy để cập nhật
git push --force-with-lease

5

Nếu cam kết mà bạn muốn thay đổi không phải là cam kết cuối cùng, thì hãy làm theo các bước dưới đây. Nếu cam kết của bạn ở nhánh khác thì trước tiên hãy chuyển sang nhánh đó.

kiểm tra chi nhánh git_name

Tìm cam kết trước khi cam kết mà bạn muốn thay đổi và tìm hàm băm của nó. Sau đó ban hành lệnh rebase.

git rebase -i -p băm của cam kết

Sau đó, một biên tập viên sẽ mở và nhập 'chỉnh sửa' cho các cam kết mà bạn muốn thay đổi. Để những người khác với tùy chọn 'chọn' mặc định. Sau khi thay đổi, nhập phím 'esc' và wq! để thoát ra

Sau đó ban hành lệnh git commit với tùy chọn sửa đổi.

git commit --amend - Tác giả = "Email tên người dùng" --no-chỉnh sửa

Sau đó ban hành lệnh sau.

git rebase - tiếp tục

Khi tác giả cam kết được cập nhật trong kho lưu trữ cục bộ, hãy đẩy các thay đổi sang kho lưu trữ từ xa.


Tôi nghĩ rằng đây là cách đơn giản nhất để làm điều đó. Tôi đã sử dụng lệnh tua lại và thất bại. Tôi đã học được rằng tôi cần phải sử dụng lệnh chỉnh sửa thay thế. Có lẽ từ khóa chỉnh sửa từ có thể được tô sáng. Cảm ơn câu trả lời @ChannaB
Berk

thực sự dễ dàng để làm theo các bước. Cảm ơn bạn!
Habiba

4

Ngoài ra còn có một cách tiếp cận lười biếng cho vấn đề này, đặc biệt nếu bạn có nhiều hơn một cam kết mà bạn muốn thay đổi. Trong trường hợp của tôi, tôi đã có một chi nhánh mới với một số cam kết với một tác giả sai, vì vậy điều gì đã giúp tôi:

Chuyển đến chi nhánh ban đầu của bạn:

git checkout develop

Tạo chi nhánh mới từ nó:

git checkout -b myFeature develop 

Hợp nhất nó mà không có thông tin cam kết như một cam kết:

git merge --no-commit --squash branchWrongAuthor

Bạn cũng có thể muốn thay đổi giai đoạn:

git stage .

Thay đổi tên của tác giả và cam kết thay đổi:

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

Và đó là nó, bạn có thể thúc đẩy những thay đổi.

git push

Bạn có thể xóa chi nhánh với một tác giả sai sau đó.


4

Các bước để đổi tên tác giả sau khi cam kết đẩy

  1. Đầu tiên gõ "git log" để lấy id xác nhận và biết thêm chi tiết
  2. git rebase i ĐẦU ~ 10 (10 là tổng số cam kết hiển thị trên 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. Sau đó nhập "git rebase --continue" hoặc "git rebase --abort" theo nhu cầu của bạn

    • bây giờ cửa sổ rebase của bạn sẽ mở ra, nhấp vào phím "i" từ bàn phím
    • sau đó bạn sẽ nhận được danh sách các cam kết thành 10 [vì chúng tôi đã vượt qua 10 cam kết ở trên] Giống như bên dưới

    pick 897fe9e simplify code a little

    pick abb60f9 add new feature

    pick dc18f70 bugfix

  4. Bây giờ bạn cần thêm lệnh bên dưới ngay bên dưới của cam kết bạn muốn chỉnh sửa, như bên dưới

    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. Thế là xong, bây giờ chỉ cần nhấn ESC ,: wq và bạn đã sẵn sàng

    2. Sau đó, git đẩy nguồn gốc ĐẦU: CHI NHÁNH TÊN -f [vui lòng chăm sóc -f Lực đẩy]

    thích git push -fhoặcgit push origin HEAD: dev -f


câu trả lời tuyệt vời, bạn có thể cập nhật điểm 6 với một ví dụ về git pushlệnh không?
Lukasz 'Severiaan' Grela

1
@ Lukasz'Severiaan'Grela đã chỉnh sửa, vui lòng kiểm tra ngay, Cảm ơn
Kirtikumar A.

3

Thay đổi tên và email của bạn trên toàn cầu:

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

Thay đổi tên người gửi và email của bạn trên mỗi kho lưu trữ:

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

Thay đổi thông tin tác giả chỉ cho cam kết tiếp theo:

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

Gợi ý : Đối với tình huống khác và đọc thêm thông tin đọc tài liệu tham khảo .


2

Nếu những gì bạn cần thay đổi là AUTHOR OF THE LAST và không ai khác đang sử dụng kho lưu trữ của bạn, bạn có thể hoàn tác cam kết cuối cùng của mình với:

git push -f origin last_commit_hash:branch_name 

thay đổi tên tác giả của cam kết của bạn với:

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

Thoát khỏi trình chỉnh sửa mở và đẩy lại mã của bạn:

git push

2

Đối với thông báo cam kết hợp nhất, tôi thấy rằng tôi không thể sửa đổi nó bằng cách sử dụng rebase, ít nhất là trên gitlab. Nó cho thấy sự hợp nhất như một cam kết nhưng tôi không thể phản ứng lại với #sha đó. Tôi tìm thấy này bài là hữu ích.

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

Ba dòng mã này đã thực hiện công việc thay đổi thông điệp cam kết hợp nhất (như tác giả).


1

bạn có thể sử dụng các lệnh này từ trang chính thức của github

https://help.github.com/en/github/USE-git/changing-master-info

đây là các lệnh

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

Ở đây bạn có thể thay đổi email cũ thành tên người dùng và địa chỉ email mới.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.