a

Câu hỏi Làm cách nào để sửa đổi các cam kết hiện có, chưa được xóa?


Tôi đã viết sai điều trong một thông điệp cam kết. Ngoài ra, tôi đã quên bao gồm một số tệp.

Làm cách nào để thay đổi thông báo / tệp cam kết? Cam kết chưa được đẩy.


7680
2017-10-07 15:44


gốc


Đối với những người mới đến git: Điểm của Laurie về việc chưa được đẩy là quan trọng. Giống như rebasing, điều này đang thay đổi lịch sử. Nếu ai đó đã nhân bản / kéo từ repo của bạn giữa lịch sử ban đầu và viết lại thì họ sẽ không thể kéo sau khi viết lại (cho nhánh đó). - Pat Notz


Các câu trả lời:


Đang sửa đổi thông báo cam kết gần đây nhất

git commit --amend

sẽ mở trình soạn thảo của bạn, cho phép bạn thay đổi thông báo cam kết của lần commit gần đây nhất. Ngoài ra, bạn có thể đặt thông báo cam kết trực tiếp trong dòng lệnh với:

git commit --amend -m "New commit message"

... tuy nhiên, điều này có thể làm cho nhiều dòng cam kết tin nhắn hoặc chỉnh sửa nhỏ hơn cồng kềnh để nhập.

Đảm bảo bạn không có bất kỳ thay đổi bản sao làm việc nào dàn dựng trước khi làm điều này hoặc họ cũng sẽ được cam kết. (Không được tổ chức thay đổi sẽ không được cam kết.)

Thay đổi thông báo của một cam kết mà bạn đã đẩy đến nhánh từ xa của bạn

Nếu bạn đã đẩy cam kết của mình đến chi nhánh từ xa, thì bạn sẽ cần ép buộc cam kết với:

git push <remote> <branch> --force
# Or
git push <remote> <branch> -f

Cảnh báo: lực đẩy sẽ ghi đè lên nhánh từ xa với trạng thái cục bộ của bạn. Nếu có các cam kết trên nhánh từ xa mà bạn không có trong chi nhánh địa phương của bạn, bạn sẽ mất những cam kết đó.

Cảnh báo: hãy thận trọng về việc sửa đổi các cam kết mà bạn đã chia sẻ với những người khác. Sửa đổi cam kết về cơ bản viết lại họ có sự khác biệt SHA ID, trong đó đặt ra một vấn đề nếu người khác có bản sao của cam kết cũ mà bạn đã viết lại. Bất kỳ ai có bản sao cam kết cũ sẽ cần phải đồng bộ hóa công việc của họ với cam kết mới được viết lại của bạn, đôi khi có thể khó khăn, vì vậy hãy đảm bảo bạn phối hợp với những người khác khi cố gắng viết lại lịch sử chia sẻ được chia sẻ hoặc tránh viết lại các cam kết được chia sẻ hoàn toàn.


Sử dụng tính năng rebase tương tác

Một lựa chọn khác là sử dụng rebase tương tác.
Điều này cho phép bạn chỉnh sửa bất kỳ tin nhắn nào bạn muốn cập nhật ngay cả khi đó không phải là tin nhắn mới nhất.

Để làm một quả bóng git, hãy làm theo các bước sau:

// X is the number of commits to the last commit you want to be able to edit
git rebase -i HEAD~X

Sau khi bạn bỏ bí quyết của mình - hãy chọn e/r để chỉnh sửa tin nhắn

enter image description here

Lưu ý quan trọng về tương tác rebase

Khi bạn sử dụng git rebase -i HEAD~X có thể có hơn hơn X cam kết. Git sẽ "thu thập" tất cả các cam kết trong X cam kết và nếu có một hợp nhất ở đâu đó trong khoảng đó bạn sẽ thấy tất cả các cam kết cũng như vậy kết quả sẽ là X +.

Mẹo tốt:

Nếu bạn phải làm điều đó cho nhiều hơn một chi nhánh duy nhất và bạn có thể phải đối mặt với xung đột khi sửa đổi nội dung, hãy thiết lập git rerere và để git giải quyết những xung đột đó tự động cho bạn.


Tài liệu


14802
2018-02-08 04:26



Tuy nhiên git commit --amend không mạnh mẽ như git rebase -i. - Jeffrey Jose
@jeffjose, Nó chắc chắn không cần phải. Cũng thế, git commit --amend có thể sửa chữa cam kết chính (a?). - strager
Nếu bạn đã đẩy, chỉ cần đẩy mạnh một lần nữa: git push -f origin branchname - hughes
@hughes không phải git push -f một chút nguy hiểm nếu người khác đang sử dụng cùng một kho lưu trữ? - Armand
Nếu bạn không muốn viết lại toàn bộ thông điệp cam kết, hãy truy cập git commit --amend -c HEAD. Thao tác này sẽ mở trình chỉnh sửa được điền sẵn với thông báo cam kết cũ của bạn, vì vậy bạn có thể thay đổi nó. - Sam


git commit --amend -m "your new message"

2415
2017-10-07 19:52



Tôi đã git cam kết --amend -m "Tin nhắn mới", nhưng đẩy để Github tạo ra "Hợp nhất các thay đổi từ xa trước khi đẩy một lần nữa". Sau khi kéo, cam kết --amend và đẩy lại, thông báo mới sẽ không xuất hiện. Thay vào đó tôi có "Merge branch 'master" của github.com:[myrepo] " - Dave Everitt
@DaveEveritt bạn rất có thể đã đẩy luồng cam kết của mình lên trước khi cố khắc phục nó. - Thorbjørn Ravn Andersen
@ Kyralessa không đúng. Trong bash bạn có thể dễ dàng soạn tin nhắn cam kết nhiều dòng bằng cách không đóng báo giá cho đến khi bạn hoàn thành (nhấn trở lại ở cuối mỗi dòng trong dấu ngoặc kép). - hobs
Tôi không hiểu câu trả lời trông như thế nào chỉ là ý tưởng chính của câu trả lời được viết cách đây hai năm và câu trả lời được chấp nhận cũng nhận được rất nhiều phiếu bầu. Lạ thật. (không có gì sai với câu trả lời) - happy coder
@AmalMurali, tốt. Quan điểm của tôi không quá nhiều về sự nổi tiếng của câu hỏi, cũng không phải là tiện ích của câu trả lời. Nhưng câu trả lời đặc biệt này không phải là câu trả lời lâu đời nhất, cũng không cung cấp thêm bất kỳ cái nhìn sâu sắc nào vào câu trả lời được chấp nhận. Nó dường như là một bản sao của một phần của câu trả lời được chấp nhận. Đó là quan điểm của tôi. CHÀO! - happy coder


Nếu cam kết bạn muốn khắc phục không phải là cam kết gần đây nhất:

  1. git rebase --interactive $parent_of_flawed_commit

    Nếu bạn muốn sửa một số các cam kết không hoàn thiện, hãy chuyển cho phụ huynh của một trong những commit cũ nhất.

  2. Một trình soạn thảo sẽ xuất hiện, với danh sách tất cả các cam kết kể từ khi bạn đưa ra.

    1. Thay đổi pick đến reword (hoặc trên các phiên bản cũ của Git, để edit) trước bất kỳ cam kết nào bạn muốn sửa.
    2. Khi bạn lưu, Git sẽ phát lại các cam kết được liệt kê.
       

  3. Đối với mỗi cam kết bạn muốn viết lại, Git sẽ thả bạn trở lại trình soạn thảo của bạn. Đối với mỗi cam kết bạn muốn chỉnh sửa, Git thả bạn vào vỏ. Nếu bạn đang ở trong trình bao:

    1. Thay đổi cam kết theo bất kỳ cách nào bạn muốn.
    2. git commit --amend
    3. git rebase --continue

Hầu hết các trình tự này sẽ được giải thích cho bạn bởi đầu ra của các lệnh khác nhau khi bạn đi. Rất dễ dàng, bạn không cần phải ghi nhớ nó - chỉ cần nhớ rằng git rebase --interactive cho phép bạn sửa các cam kết bất kể chúng đã lâu bao lâu rồi.


Lưu ý rằng bạn sẽ không muốn thay đổi các cam kết mà bạn đã đẩy. Hoặc có thể bạn làm, nhưng trong trường hợp đó bạn sẽ phải rất cẩn thận để giao tiếp với tất cả những người có thể đã kéo các cam kết của bạn và thực hiện công việc trên đầu trang của họ. Làm cách nào để khôi phục / tái đồng bộ hóa sau khi ai đó đẩy một lần rebase hoặc đặt lại thành chi nhánh đã xuất bản?


2297
2017-08-15 21:20



Ai có thể thay đổi thông điệp của lần commit đầu tiên (không có cha / mẹ) không? - 13ren
Điều này được đề cập trong một trong những câu trả lời khác nhưng tôi sẽ lưu ý nó ở đây. Kể từ git 1.6.6 bạn có thể sử dụng reword thay cho pick để chỉnh sửa thông điệp tường trình. - MitMaro
Ngẫu nhiên, $parent_of_flawed_commit tương đương với $flawed_commit^. - Peeja
Không bao giờ EVER làm điều này (hoặc rebase nói chung) nếu bạn đã đẩy ngược dòng! - Daniel Rinser
Sử dụng -p (--preserve-merges) nếu có sự hợp nhất sau cam kết không hoàn thiện. - ahven


Để sửa đổi cam kết trước đó, thực hiện các thay đổi bạn muốn và điều chỉnh các thay đổi đó, và sau đó chạy

git commit --amend

Thao tác này sẽ mở một tệp trong trình soạn thảo văn bản của bạn thể hiện thông điệp cam kết mới của bạn. Nó bắt đầu ra với văn bản từ tin nhắn cam kết cũ của bạn. Thay đổi thông điệp cam kết như bạn muốn, sau đó lưu tệp và thoát trình soạn thảo của bạn để hoàn tất.

Để sửa đổi cam kết trước đó và giữ cùng một thông điệp tường trình, hãy chạy

git commit --amend -C HEAD

Để khắc phục cam kết trước đó bằng cách xóa hoàn toàn, hãy chạy

git reset --hard HEAD^

Nếu bạn muốn chỉnh sửa nhiều hơn một thông điệp cam kết, hãy chạy

git rebase -i HEAD~commit_count

(Thay thế commit_count với số lần commit mà bạn muốn chỉnh sửa.) Lệnh này sẽ khởi chạy trình soạn thảo của bạn. Đánh dấu cam kết đầu tiên (cái mà bạn muốn thay đổi) là "chỉnh sửa" thay vì "chọn", sau đó lưu và thoát khỏi trình soạn thảo của bạn. Thực hiện thay đổi bạn muốn cam kết và sau đó chạy

git commit --amend
git rebase --continue

Lưu ý: Bạn có thể "Thực hiện thay đổi bạn muốn" cũng từ trình chỉnh sửa được mở bởi git commit --amend


750
2018-06-06 21:16



git rebase -i HEAD~commit_count cũng sẽ cho phép bạn thay đổi các thông điệp cam kết của tuy nhiên nhiều cam kết mà bạn chọn. Chỉ cần đánh dấu các cam kết đã chọn là "reword" thay vì "pick". - Joe
Nếu bạn không muốn rebase thì sao? Bạn chỉ muốn thay đổi một tin nhắn cũ hơn? - SuperUberDuper
git reset --hardhủy bỏ những thay đổi không được cam kết. Hãy thay thế --hard với --soft. - eel ghEEz


Như đã đề cập, git commit --amend là cách ghi đè lên lần commit cuối cùng. Một lưu ý: nếu bạn cũng muốn ghi đè lên các tập tin, lệnh sẽ là

git commit -a --amend -m "My new commit message"

381
2017-09-01 20:35



Và nếu bạn không muốn thêm mọi thứ, trước tiên bạn có thể làm git add file.ext sau đó chỉ git commit --amend - MalcolmOcean


Bạn cũng có thể sử dụng git filter-branch cho điều đó.

git filter-branch -f --msg-filter "sed 's/errror/error/'" $flawed_commit..HEAD

Nó không dễ dàng như tầm thường git commit --amend, nhưng nó đặc biệt hữu ích, nếu bạn đã có một số hợp nhất sau thông điệp cam kết sai lầm của bạn.

Lưu ý rằng điều này sẽ cố gắng viết lại MỌI cam kết giữa HEAD và cam kết không hoàn thiện, vì vậy bạn nên chọn msg-filter lệnh rất khôn ngoan ;-)


346
2018-01-10 14:23



Có một phiên bản này mà không thay đổi cam kết nếu regex không tìm thấy bất cứ điều gì? - sjakubowski
AFAIK filter-branch --msg-filter sẽ tạo ra các commit mới trong mọi trường hợp. Tuy nhiên, bạn có thể kiểm tra trong bộ lọc msg, nếu sed đã thành công và sử dụng thông tin này khi hoạt động chi nhánh bộ lọc kết thúc để đặt lại cây của bạn thành refs / original. - Mark
@DavidHogue Điều này chỉ đúng khi sử dụng phương pháp lọc-chi nhánh. ID cam kết theo cam kết đã sửa đổi không thay đổi nếu bạn sử dụng tính năng rebase tương tác. - Mark
@Mark Có họ làm, họ được yêu cầu. Id cam kết phụ thuộc vào các cam kết trước đó. Nếu họ không thay đổi, git sẽ vô dụng. - Miles Rout
Bạn cần $flawed_commit^..HEAD, không phải $flawed_commit..HEAD. như đã nêu trong trang của người đàn ông: «Lệnh sẽ chỉ ghi lại các tham chiếu tích cực được đề cập trong dòng lệnh (ví dụ: nếu bạn vượt qua a..b, chỉ b sẽ được viết lại).» - Ángel


Tôi thích cách này.

git commit --amend -c <commit ID>

Nếu không, sẽ có một cam kết mới với một ID cam kết mới


306
2017-11-08 03:51



Đối với tôi, sử dụng lệnh của bạn ở trên thực sự tạo ra một cam kết mới với một ID cam kết mới cộng với một cam kết thêm nói rằng "hợp nhất chi nhánh" như một thông điệp cam kết mặc định. - Jan
Đang sửa đổi luôn luôn tạo một cam kết mới với một ID cam kết mới. ID cam kết là hàm băm SHA của nội dung của cam kết, bao gồm thông báo cam kết và dấu thời gian được cam kết / tác giả. Đây là một tính năng của Git, ngăn chặn các va chạm băm, đảm bảo rằng hai cam kết có cùng một ID chính xác là cùng một cam kết, với chính xác cùng một nội dung, lịch sử và như vậy. - Emil Lundberg
Đồng ý với Emil. Ngoài ra, đọc các tài liệu - có vẻ như tất cả "-c" làm là cho git biết thông điệp nào cam kết sử dụng làm mặc định / mẫu cho commit mới của bạn ..Thực sự nó đã làm "-c <commit ID>" theo mặc định , vì vậy không cần phải xác định nó. - Gal
Các -c làm một vài điều. Nó sử dụng thông điệp cũ theo mặc định, nhưng nó cũng sao chép thông tin quyền tác giả (người và thời gian). -C làm điều tương tự ngoại trừ việc nó không yêu cầu bạn chỉnh sửa tin nhắn. - Joseph K. Strauss
Giống như @SantanuDey, nó không có tác dụng với tôi. tôi đã nhận fatal: Option -m cannot be combined with -c/-C/-F/--fixup. - Andrew Grimm


Nếu bạn đang sử dụng công cụ Git GUI, có một nút có tên là sửa đổi cam kết cuối cùng. Nhấp vào nút đó và sau đó nó sẽ hiển thị các tập tin cam kết và tin nhắn cuối cùng của bạn. Chỉ cần chỉnh sửa tin nhắn đó và bạn có thể cam kết với thông điệp cam kết mới.

Hoặc sử dụng lệnh này từ bảng điều khiển / thiết bị đầu cuối:

git commit -a --amend -m "My new commit message"

304
2018-01-22 17:23





Bạn có thể dùng Git rebasing. Ví dụ: nếu bạn muốn sửa đổi lại thành cam kết bbc643cd, hãy chạy

$ git rebase bbc643cd^ --interactive

Trong trình chỉnh sửa mặc định, hãy sửa đổi 'chọn' thành 'chỉnh sửa' trong dòng có cam kết bạn muốn sửa đổi. Thực hiện các thay đổi của bạn và sau đó sắp xếp chúng với

$ git add <filepattern>

Bây giờ bạn có thể sử dụng

$ git commit --amend

để sửa đổi cam kết và sau đó

$ git rebase --continue

để quay trở lại cam kết trước đó.


279
2017-10-22 11:22



Nếu bạn muốn đảm bảo thay đổi của mình từ git commit --amend đã ảnh hưởng đến bạn có thể sử dụng git show và nó sẽ hiển thị thông điệp mới. - Steve Tauber


  1. Nếu bạn chỉ muốn sửa đổi thông báo cam kết cuối cùng của mình, hãy làm:

    git commit --amend
    

    Điều đó sẽ thả bạn vào exitor văn bản của bạn và cho phép bạn thay đổi thông điệp cam kết cuối cùng.

  2. Nếu bạn muốn thay đổi 3 thông điệp cam kết cuối cùng, hoặc bất kỳ thông báo cam kết nào cho đến thời điểm đó, thì hãy cung cấp HEAD~3 đến git rebase -i chỉ huy:

    git rebase -i HEAD~3
    

270
2017-11-15 09:29



Câu trả lời trước đó đã nói rằng bạn có thể sử dụng git commit --amendvà nó cũng nói rằng bạn có thể sử dụng git rebase -i HEAD~commit_count, tất cả những gì bạn đã làm là cắm 3 cho commit_count.