Có cách nào để chỉnh sửa tin nhắn cam kết trên GitHub không?


129

Có cách nào để chỉnh sửa thông báo cam kết sau khi cam kết và đẩy lên GitHub không? Tôi thấy rằng có một 'thêm ghi chú' cũng như nhận xét nội tuyến, nhưng không có chỉnh sửa thực sự của một thông điệp cam kết. Ngoài ra còn có 'sửa đổi cam kết' trong các tiện ích mở rộng git nhưng không chỉnh sửa thông báo hiện có.


Bạn có thể thử hoàn nguyên cam kết (xem một số tùy chọn trong câu hỏi SO này: stackoverflow.com/questions/4114095/ mẹo ) - chỉ đảm bảo rằng bạn lần đầu tiên sao lưu bất kỳ thay đổi mã nào để bạn không bị mất vì nhận xét!
Du lịch Tech Guy

Câu trả lời:


183
  1. git rebase -i <commit hash you want to change>^

    Điều này sẽ mở trình soạn thảo mặc định của bạn (thường là ) với một danh sách các cam kết và hành động cho từng trình. Theo mặc định, hành động là pick.

  2. Đối với bất kỳ cam kết nào bạn muốn thay đổi tin nhắn, hãy đổi pickthành reword.

  3. Lưu và thoát (trong vi :wq:).

  4. Đối với mỗi cam kết như vậy, bạn sẽ nhận được một trình soạn thảo để chỉnh sửa thông điệp cam kết. Thay đổi nó khi bạn thấy phù hợp, lưu và thoát.

    Khi bạn hoàn tất chỉnh sửa tất cả các thông báo cam kết, bạn sẽ quay lại dấu nhắc lệnh và có một cây mới với các tin nhắn được cập nhật.

  5. Bây giờ bạn có thể tải chúng lên github bằng cách sử dụng git push origin --force.

Nếu bạn chỉ cần sửa lỗi cam kết cuối cùng của mình, bạn có thể thay thế các bước 1-4 bằng git commit --amend.


3
@MatthewPeter Tôi cho rằng nên có một cách, nhưng tôi không biết - Tôi sử dụng trực tiếp dòng lệnh.
Mureinik

4
Dường như bạn không thể chỉ định <xác nhận băm bạn muốn thay đổi>, thay vào đó bạn cần chỉ định hàm băm của cam kết trước số bạn muốn thay đổi hoặc sử dụng CHÍNH ~ x trong đó x là số lần xác nhận từ CHÍNH mục bạn muốn thay đổi nằm trong.
ssc327 18/12/18

3
@ ssc327 Lưu ý rằng tôi ^ở đó - Tôi thực sự đã đề xuất phản đối cha mẹ của cam kết mà bạn muốn thay đổi.
Mureinik

2
@Murenik bạn đúng, tôi bằng cách nào đó đã bỏ lỡ khi xem ^
ssc327

1
@deadfish Sử dụng dòng lệnh Windows, bạn phải gõ ^^để kết thúc lệnh bằng chữ, ^ ví dụ: git rebase -i 2c747b32^^
Wyck

35

Trong Intellij Idea bạn có thể làm điều đó thật dễ dàng.

  1. Kiểm soát phiên bản mở (Lịch sử)
  2. Chọn tab nhật ký
  3. Chọn cam kết thay đổi nhận xét
  4. nhấn F2 (Mac fn + F2) và cập nhật thông điệp cam kết của bạn

1
Không hoạt động nếu bạn đã đẩy đến điều khiển từ xa.
thanh toán

8
Bạn đã phải thực hiện git push origin --forcesau đó như được đề xuất trong câu trả lời của @ Mureinik.
Dan Macák

1
Tùy chọn "tua lại" bị vô hiệu hóa nếu cam kết đã được đẩy.
huyz

1
Để thực hiện điều đó với Intellij IDEA cho một cam kết đã được đẩy, trước tiên bạn phải bắt đầu với một rebase tương tác (giống như bạn sẽ làm từ dòng lệnh của Git). Để thực hiện rebase, nhấp chuột phải vào dự án của bạn -> mục menu "Git" -> "Kho lưu trữ" -> "rebase ..." (mục menu cuối cùng). Chèn SHA của cam kết trước giao diện bạn muốn sửa đổi trong trường "Lên trên" và nhấp vào "Rebase". Sau đó, bạn sẽ nhận được lời nhắc rebase tương tác. Chọn "tua lại" trong hộp thả xuống bên cạnh (các) cam kết bạn muốn sửa đổi và nhấp vào nút "Bắt đầu khởi động lại" (tiếp tục trong bình luận tiếp theo)
jplandrain

1
(tiếp theo) Sau đó, bạn sẽ được trình bày lời nhắc văn bản cho mỗi cam kết bạn muốn sửa đổi. Sau khi thông báo nhật ký được sửa đổi, bạn có thể áp dụng các sửa đổi thêm (lưu ý rằng bây giờ tùy chọn "tua lại" không còn bị mờ đi nữa). Khi bạn đã hoàn thành, sau đó bạn có thể buộc đẩy các sửa đổi của mình để kết thúc cuộc nổi loạn tương tác. Toàn bộ quá trình thực sự giống hệt như trong câu trả lời của @Mureinik, người thực hiện nó từ dòng lệnh thay thế.
jplandrain

3

Tiền đề:

nếu biểu đồ git của bạn trông giống như ...

O   target-commit that you want to change its message [df9c192]
|
O   parent-commit [b7ec061]
|
O

( df9c192b7ec061là các giá trị băm xác nhận của cam kết đích và cam kết cha mẹ, riêng biệt)

Giải pháp:

bạn chỉ có thể gõ các hướng dẫn sau đây ...

git reset --soft b7ec061
git commit -m "your_new_description"
git push -f

Giải trình:

  1. git reset --soft b7ec061 sẽ giữ các thay đổi của bạn về tệp và đặt lại thành cam kết gốc (ví dụ: b7ec061)
  2. git commit -m "..." sẽ tạo một cam kết mới
  3. git push -f sẽ đẩy cam kết mới của bạn đến máy chủ và thay thế cam kết cũ (ví dụ: df9c192)

2

Một tùy chọn khác là tạo thêm một "errata commit" (và đẩy) tham chiếu đến đối tượng cam kết có lỗi - cam kết errata mới cũng cung cấp sự điều chỉnh. Một cam kết errata là một cam kết không có thay đổi mã đáng kể nhưng là một thông điệp cam kết quan trọng - ví dụ: thêm một ký tự khoảng trắng vào tệp readme của bạn và cam kết thay đổi đó với thông điệp cam kết quan trọng hoặc sử dụng tùy chọn git --allow-empty. Nó chắc chắn dễ dàng và an toàn hơn so với việc nổi loạn, nó không sửa đổi lịch sử thực sự và nó giữ cho cây nhánh sạch sẽ (sử dụngamendcũng là một lựa chọn tốt nếu bạn đang sửa lỗi cam kết gần đây nhất, nhưng cam kết errata có thể là một lựa chọn tốt cho các cam kết cũ hơn). Loại điều này rất hiếm khi xảy ra mà chỉ cần ghi lại lỗi là đủ tốt. Trong tương lai, nếu bạn cần tìm kiếm thông qua nhật ký git cho một từ khóa tính năng, cam kết ban đầu (có lỗi) có thể không xuất hiện do từ khóa sai được sử dụng trong cam kết ban đầu đó (lỗi chính tả) - tuy nhiên, từ khóa sẽ xuất hiện trong cam kết errata sau đó sẽ đưa bạn đến cam kết ban đầu có lỗi đánh máy. Đây là một ví dụ:

$ git nhật ký
cam kết 0c28141c68adae276840f17ccd4766542c33cf1d
Tác giả: Đầu tiên cuối cùng 
Ngày: Thứ Tư 8 tháng 8 15:55:52 2018 -0600

    Errata cam kết:
    Cam kết này không có thay đổi mã đáng kể.
    Cam kết này chỉ được cung cấp để ghi lại sự điều chỉnh cho thông điệp cam kết trước đó.
    Điều này liên quan đến cam kết đối tượng e083a7abd8deb5776cb304fa13731a4182a24be1
    Thông báo cam kết không chính xác:
        Thay đổi màu nền thành màu đỏ
    Sửa lỗi (* thay đổi được tô sáng *):
        Thay đổi màu nền thành * xanh *

cam kết 032d0ff0601bff79bdef3c6f0a02ebfa061c4ad4
Tác giả: Đầu tiên cuối cùng 
Ngày: Thứ Tư 8 tháng 8 15:43:16 2018 -0600

    Một số tin nhắn cam kết tạm thời

cam kết e083a7abd8deb5776cb304fa13731a4182a24be1
Tác giả: Đầu tiên cuối cùng 
Ngày: Thứ Tư 8 tháng 8 13:31:32 2018 -0600

    Thay đổi màu nền thành màu đỏ

Để chắc chắn rằng nó an toàn, nhưng rất nhiều văn bản để đọc. Tôi thích viết lại lịch sử :)
pkalinow

0

Câu trả lời của @Mureinik là tốt nhưng không dễ hiểu bởi người mới.

Phương pháp đầu tiên:

  1. Nếu bạn chỉ muốn chỉnh sửa tin nhắn cam kết mới nhất, thì bạn chỉ cần git commit --amend, bạn sẽ thấy:
<your existing commit mesage foo bar> 

# Please enter the commit message fir your changes. Lines starting
# with # will be ignored, and an empty message aborts the commit.
#
# Date: Sat Aug 24 17:56:16 2019 +0800
#
# On branch is up to date with 'origin/master'.
#
# changes to be committed:
#       modified:   foo.py
#
  1. Như bạn có thể thấy, cam kết thông báo trên đầu mà không có bất kỳ tiền tố lệnh nào, chẳng hạn như pickđây đã là trang chỉnh sửa và bạn có thể trực tiếp chỉnh sửa tin nhắn hàng đầulưu & thoát , ví dụ:
<your new correction commit message> 

# Please enter the commit message for your changes. Lines starting
....
  1. Sau đó làm git push -u origin master --forcehoặc <how you push normally> --force. Chìa khóa ở đây là --force.

Phương pháp thứ hai:

  1. Bạn có thể thấy hàm băm cam kết bằng git loghoặc trích xuất từ ​​url kho lưu trữ, ví dụ trong trường hợp của tôi là881129d771219cfa29e6f6c2205851a2994a8835

  2. Sau đó, bạn có thể làm git rebase --interactive 881129d771219cfa29e6f6c2205851a2994a8835hoặc git rebase -i HEAD^(nếu mới nhất)

  3. Bạn sẽ thấy:

pick <commit hash> <your current commit message>

# Rebase 8db7e8b..fa20af3 onto 8db7e8b
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#  d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
  1. Nhưng nếu bạn thấy noopthì có lẽ bạn đang gõ sai, ví dụ nếu bạn làm git rebase -i 881129d771219cfa29e6f6c2205851a2994a88thiếu ^phần cuối, tốt nhất bạn nên thoát trình soạn thảo mà không lưu và tìm ra lý do:
noop

# Rebase 8db7e8b..fa20af3 onto 8db7e8b
...
  1. Nếu không có noopvấn đề gì, thì chỉ cần thay đổi từ pickthành reword, phần còn lại (bạn không chỉnh sửa thông báo cam kết tại thời điểm này), ví dụ:
reword <commit hash> <your current commit message>

# Rebase 8db7e8b..fa20af3 onto 8db7e8b
#
# Commands:
#  p, pick = use commit
...
  1. Lưu và thoát sẽ thấy trang chỉnh sửa tương tự như phương pháp # 1:
<your existing commit mesage foo bar> 

# Please enter the commit message fir your changes. Lines starting
# with # will be ignored, and an empty message aborts the commit.
#
# Date: Sat Aug 24 17:56:16 2019 +0800
#
# interactive rebase in progress; onto b057371
# Last command done (1 command done):
#    reword d996ffb <existing commit message foo bar>
# No commands remaining.
# You are currently editing a commit while rebasing branch 'master' on 'b057371'.
#
# changes to be committed:
#       modified:   foo.py
#
  1. Chỉnh sửa tin nhắn trên cùng, giống như phương pháp # 1 và lưu và thoát, ví dụ:
<your new correction commit message> 

# Please enter the commit message for your changes. Lines starting
....
  1. Một lần nữa, giống như phương pháp # 1, làm git push -u origin master --forcehoặc <how you push normally> --force. Chìa khóa ở đây là --force.

Để biết thêm thông tin xin vui lòng đọc tài liệu .

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.