Tôi đã viết điều sai trong một thông điệp cam kết.
Làm thế nào tôi có thể thay đổi tin nhắn? Các cam kết chưa được đẩy.
Tôi đã viết điều sai trong một thông điệp cam kết.
Làm thế nào tôi có thể thay đổi tin nhắn? Các cam kết chưa được đẩy.
Câu trả lời:
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 xác nhận 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 các thông điệp cam kết nhiều dòng hoặc chỉnh sửa nhỏ trở nên cồng kềnh hơn để nhập.
Hãy chắc chắn rằng bạn không có bất kỳ thay đổi bản sao nào được thực hiện trước khi thực hiện việc này nếu không chúng cũng sẽ được cam kết. ( Những thay đổi chưa được thực hiện sẽ không được cam kết.)
Nếu bạn đã đẩy cam kết của mình lên chi nhánh từ xa, thì - sau khi sửa đổi cam kết của bạn cục bộ (như được mô tả ở trên) - bạn cũng sẽ cần phải đẩy 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ủa địa phương . 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 mình, bạn sẽ mất các cam kết đó.
Cảnh báo: thận trọng về việc sửa đổi các cam kết mà bạn đã chia sẻ với người khác. Sửa đổi các cam kết về cơ bản viết lại chúng để có các ID SHA khác nhau , điều này đặt ra một vấn đề nếu người khác có các bản sao của cam kết cũ mà bạn đã viết lại. Bất cứ ai có một bản sao của 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ều này đô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ử cam kết được chia sẻ hoặc chỉ cần tránh viết lại các cam kết được chia sẻ hoàn toàn.
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.
Để thực hiện bí đao Git, hãy làm theo các bước sau:
// n is the number of commits up to the last commit you want to be able to edit
git rebase -i HEAD~n
Khi bạn thực hiện các cam kết của mình - chọn phần e/r
chỉnh sửa tin nhắn:
Khi bạn sử dụng git rebase -i HEAD~n
có thể có nhiều hơn n cam kết. Git sẽ "thu thập" tất cả các cam kết trong n lần xác nhận cuối cùng và nếu có một sự hợp nhất ở đâu đó trong phạm vi đó, bạn cũng sẽ thấy tất cả các cam kết, vì vậy kết quả sẽ là n +.
Nếu bạn phải làm điều đó cho nhiều hơn một chi nhánh 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 tự động giải quyết những xung đột đó cho bạn.
git commit --amend
không mạnh mẽ như git rebase -i
.
git commit --amend
có thể sửa lỗi (a?) Cam kết chính.
git push -f origin branchname
git push -f
nguy hiểm một chút nếu người khác đang sử dụng cùng một kho lưu trữ?
git commit --amend -c HEAD
. Điều này sẽ mở trình soạn thảo được điền trước bằng thông điệp cam kết cũ của bạn, vì vậy bạn có thể thay đổi nó.
git commit --amend -m "your new message"
Nếu cam kết bạn muốn sửa không phải là cam kết gần đây nhất:
git rebase --interactive $parent_of_flawed_commit
Nếu bạn muốn sửa một số cam kết thiếu sót, hãy vượt qua cha mẹ của người già nhất trong số họ.
Một biên tập viên sẽ đưa ra, với một danh sách tất cả các cam kết kể từ khi bạn đưa ra.
pick
thành reword
(hoặc trên các phiên bản cũ của Git, thành edit
) trước bất kỳ cam kết nào bạn muốn sửa.Đối với mỗi cam kết bạn muốn điều chỉnh lại , Git sẽ đưa bạn trở lại trình chỉnh sửa của mình. Đối với mỗi cam kết bạn muốn chỉnh sửa , Git thả bạn vào trình bao. Nếu bạn đang ở trong vỏ:
git commit --amend
git rebase --continue
Hầu hết các chuỗi này sẽ được giải thích cho bạn bằng đầu ra của các lệnh khác nhau khi bạn đi. Nó rất dễ; 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 lỗi cho dù chúng đã tồn tại bao lâu.
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 hết sức cẩn thận để liên lạc với tất cả những người có thể đã thực hiện 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 / đồng bộ hóa lại sau khi ai đó đẩy rebase hoặc thiết lập lại thành một nhánh được xuất bản?
reword
thay thế pick
thông báo nhật ký.
$parent_of_flawed_commit
tương đương với $flawed_commit^
.
-p
( --preserve-merges
) nếu có một sự hợp nhất sau khi cam kết thiếu sót.
Để sửa đổi cam kết trước đó, hãy thực hiện các thay đổi bạn muốn và thực hiện các thay đổi đó, rồi chạy
git commit --amend
Điều này sẽ mở một tệp trong trình soạn thảo văn bản của bạn đại diện cho thông điệp cam kết mới của bạn. Nó bắt đầu được điền 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 chỉnh sửa 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
Để sửa lỗi 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 tin nhắn cam kết, hãy chạy
git rebase -i HEAD~commit_count
(Thay thế commit_count bằng số lần xác nhận mà bạn muốn chỉnh sửa.) Lệnh này khởi chạy trình soạn thảo của bạn. Đánh dấu cam kết đầu tiên (cam kết mà bạn muốn thay đổi) là bản chỉnh sửa trực tuyến thay vì chọn Pick, 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ũng có thể "Thực hiện thay đổi bạn muốn" từ trình chỉnh sửa được mở bởi git commit --amend
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 nhiều cam kết mà bạn chọn. Chỉ cần đánh dấu các cam kết đã chọn là "tua lại" thay vì "chọn".
git reset --hard
hủy bỏ những thay đổi không cam kết Hãy thay thế --hard
bằng --soft
.
git reset --hard
là một mệnh lệnh hoàn toàn hợp pháp, nhưng nó gây hiểu lầm cho câu hỏi. Bạn sử dụng --hard
nếu bạn đã cam kết những thay đổi bạn muốn vứt đi, chứ không phải nếu bạn mắc lỗi đánh máy trong thông điệp cam kết!
Như đã đề cập, git commit --amend
là cách ghi đè lên cam kết cuối cùng. Một lưu ý: nếu bạn muốn ghi đè lên các tệp , lệnh sẽ là
git commit -a --amend -m "My new commit message"
git add file.ext
sau đó chỉ cầngit commit --amend
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ễ như một thứ tầm thường git commit --amend
, nhưng nó đặc biệt hữu ích, nếu bạn đã có một số 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 thiếu sót, vì vậy bạn nên chọn msg-filter
lệnh của mình thật khôn ngoan ;-)
$flawed_commit^..HEAD
, không $flawed_commit..HEAD
. như đã nêu trong trang man: « Lệnh sẽ chỉ viết lại các ref 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). »
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 ID cam kết mới.
-c
này có một vài điều. Nó sử dụng tin nhắn 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
thực hiện đ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.
fatal: Option -m cannot be combined with -c/-C/-F/--fixup.
Nếu bạn đang sử dụng công cụ Git GUI, có một nút có tên Sửa đổi lần 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 và cam kết 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 nó với một tin nhắn cam kết mới.
Hoặc sử dụng lệnh này từ bàn điều khiển / thiết bị đầu cuối:
git commit -a --amend -m "My new commit message"
Bạn có thể sử dụng Git rebasing . Ví dụ: nếu bạn muốn sửa đổi trở lại để xác nhận bbc643cd, hãy chạy
$ git rebase bbc643cd^ --interactive
Trong trình chỉnh sửa mặc định, 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 đó thực hiện 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
để trở lại cam kết đầu trước.
git commit --amend
đã ảnh hưởng đến bạn có thể sử dụng git show
và nó sẽ hiển thị thông báo mới.
Nếu bạn chỉ muốn sửa đổi thông điệp cam kết cuối cùng của mình, thì hãy làm:
git commit --amend
Điều đó sẽ thả bạn vào trình soạn thảo 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.
Nếu bạn muốn thay đổi ba thông điệp cam kết cuối cùng hoặc bất kỳ thông điệp cam kết nào cho đến thời điểm đó, hãy cung cấp HEAD~3
cho git rebase -i
lệnh:
git rebase -i HEAD~3
git commit --amend
, và nó cũng nói rằng bạn có thể sử dụng git rebase -i HEAD~commit_count
, tất cả các bạn đã làm là cắm 3
cho commit_count
.
Nếu bạn phải thay đổi một thông điệp cam kết cũ trên nhiều chi nhánh (nghĩa là, cam kết với thông báo sai có mặt trong nhiều chi nhánh) bạn có thể muốn sử dụng:
git filter-branch -f --msg-filter \
'sed "s/<old message>/<new message>/g"' -- --all
Git sẽ tạo một thư mục tạm thời để viết lại và sao lưu thêm các tham chiếu cũ trong refs/original/
.
-f
sẽ thực thi việc thực hiện các hoạt động. Điều này là cần thiết nếu thư mục tạm thời đã có hoặc nếu đã có tài liệu tham khảo được lưu trữ bên dưới refs/original
. Nếu đó không phải là trường hợp, bạn có thể thả cờ này.
--
tách các tùy chọn nhánh lọc khỏi các tùy chọn sửa đổi.
--all
sẽ đảm bảo rằng tất cả các nhánh và thẻ được viết lại.
Do sao lưu các tham chiếu cũ của bạn, bạn có thể dễ dàng quay lại trạng thái trước khi thực hiện lệnh.
Giả sử, bạn muốn khôi phục chủ của mình và truy cập vào chi nhánh old_master
:
git checkout -b old_master refs/original/refs/heads/master
git commit --amend
để sửa chữa lên ý kiến hoặc thêm các tập tin tôi quên git add
, nhưng chỉ từng trước khi tôi đã git push
ed. Tôi cũng sử dụng git filter-branch
khi tôi muốn hoàn toàn lộn xộn với lịch sử phiên bản, nhưng OP không muốn điều này, vì vậy câu trả lời này cần một cảnh báo lớn về sức khỏe - đừng thử điều này ở nhà, nhìn trộm !!
Sử dụng
git commit --amend
Để hiểu chi tiết, một bài viết xuất sắc là 4. Viết lại Lịch sử Git . Nó cũng nói về khi không sử dụng git commit --amend
.
git commit --amend
trả lời đã được đưa ra (nhiều lần) trước khi bạn viết. Tại sao bạn lại đăng nó? Nếu bạn muốn thêm một liên kết đến "Viết lại lịch sử Git", bạn có thể chỉnh sửa một trong những câu trả lời hiện có hoặc để lại nhận xét.
Bạn có một vài lựa chọn ở đây. Bạn có thể làm
git commit --amend
miễn là đó là cam kết cuối cùng của bạn.
Mặt khác, nếu đó không phải là cam kết cuối cùng của bạn, bạn có thể thực hiện một cuộc nổi loạn tương tác,
git rebase -i [branched_from] [hash before commit]
Sau đó, bên trong rebase tương tác, bạn chỉ cần thêm chỉnh sửa cho cam kết đó. Khi nó xuất hiện, làm một git commit --amend
và sửa đổi thông điệp cam kết. Nếu bạn muốn quay lại trước điểm cam kết đó, bạn cũng có thể sử dụng git reflog
và chỉ cần xóa cam kết đó. Sau đó, bạn chỉ cần làm git commit
lại.
Nếu đó là cam kết cuối cùng của bạn, chỉ cần sửa đổi cam kết:
git commit --amend -o -m "New commit message"
(Sử dụng cờ -o
( --only
) để đảm bảo bạn chỉ thay đổi thông điệp cam kết)
Nếu đó là một cam kết bị chôn vùi, hãy sử dụng rebase tương tác tuyệt vời :
git rebase -i @~9 # Show the last 9 commits in a text editor
Tìm cam kết bạn muốn, thay đổi pick
thành r
( reword
), lưu và đóng tệp. Làm xong!
Hướng dẫn thu nhỏ Vim (hoặc, cách khởi động lại chỉ với 8 lần nhấn phím 3j
cw
r
EscZZ
):
vimtutor
nếu bạn có thời gianh
j
k
l
tương ứng với các phím di chuyển ←↓↑→3j
di chuyển xuống ba dòngi
để vào chế độ chèn - văn bản bạn nhập sẽ xuất hiện trong tệpc
để thoát chế độ chèn và trở về chế độ "bình thường"u
trở lạir
làm lạidd
, dw
, dl
Xóa một dòng, văn bản, hoặc lá thư, tương ứngcc
, cw
, cl
Để thay đổi một dòng, văn bản, hoặc lá thư, tương ứng (giống như dd
i
)yy
, yw
, yl
Sao chép ( "yank") một dòng, văn bản, hoặc lá thư, tương ứngp
hoặc P
để dán sau, hoặc trước vị trí hiện tại, tương ứng:w
Enter để lưu (ghi) một tập tin:q!
Enter bỏ mà không tiết kiệm:wq
Enterhoặc ZZ
để lưu và thoátNếu bạn chỉnh sửa văn bản nhiều, sau đó chuyển sang bố trí bàn phím Dvorak , tìm hiểu kiểu chạm và tìm hiểu Vim. Có đáng nỗ lực không? Đúng.
ProTip ™: Đừng ngại thử nghiệm các lệnh "nguy hiểm" viết lại lịch sử * - Git không xóa các cam kết của bạn trong 90 ngày theo mặc định; bạn có thể tìm thấy chúng trong reflog:
$ git reset @~3 # Go back three commits
$ git reflog
c4f708b HEAD@{0}: reset: moving to @~3
2c52489 HEAD@{1}: commit: more changes
4a5246d HEAD@{2}: commit: make important changes
e8571e4 HEAD@{3}: commit: make some changes
... earlier commits ...
$ git reset 2c52489
... and you're back where you started
* Coi chừng các tùy chọn như --hard
và --force
mặc dù - họ có thể loại bỏ dữ liệu.
* Ngoài ra, không viết lại lịch sử trên bất kỳ chi nhánh nào bạn cộng tác.
nano
? Chúng ta đang nói về những sửa đổi tầm thường cần được thực hiện đối với một tệp văn bản, chứ không phải mã hóa cứng sẽ tạo ra một cuộc chiến rực lửa về trình soạn thảo văn bản "tốt nhất".
ddjjpZZ
di chuyển một cam kết xuống 2. Không có gì phức tạp về kiến thức Vim cơ bản; phải mất 10 phút để trở nên thoải mái hơn với Vim so với nano.
Tôi sử dụng GUI Git nhiều nhất có thể và điều đó cho bạn tùy chọn sửa đổi cam kết cuối cùng:
Ngoài ra, git rebase -i origin/master
là một câu thần chú hay sẽ luôn mang đến cho bạn những cam kết bạn đã thực hiện trên đỉnh chính và cung cấp cho bạn tùy chọn để sửa đổi, xóa, sắp xếp lại hoặc squash. Không cần phải giữ băm đó trước.
Wow, vì vậy có rất nhiều cách để làm điều này.
Tuy nhiên, một cách khác để làm điều này là xóa cam kết cuối cùng, nhưng hãy giữ các thay đổi của nó để bạn không bị mất việc. Sau đó, bạn có thể thực hiện một cam kết khác với thông báo đã sửa. Điều này sẽ trông giống như thế này:
git reset --soft HEAD~1
git commit -m 'New and corrected commit message'
Tôi luôn luôn làm điều này nếu tôi quên thêm một tập tin hoặc thay đổi.
Hãy nhớ chỉ định --soft
thay vì --hard
, nếu không bạn mất hoàn toàn cam kết đó.
git commit --amend
ngoại trừ đó là một quá trình 2 bước.
--amend
sẽ giữ thông tin tác giả, nhưng câu hỏi chỉ yêu cầu thay đổi tin nhắn.
Đối với bất kỳ ai đang tìm kiếm GUI Windows / Mac để giúp chỉnh sửa các tin nhắn cũ hơn (không chỉ là tin nhắn mới nhất), tôi khuyên bạn nên sử dụng Sourcetree . Các bước để làm theo dưới đây.
Đối với các cam kết chưa được đẩy đến một điều khiển từ xa:
Unable to create 'project_path/.git/index.lock': File exists.
khi cố gắng sửa đổi nhiều thông điệp cam kết cùng một lúc. Không chắc chắn chính xác vấn đề là gì, hoặc liệu nó sẽ được khắc phục trong phiên bản tương lai của Sourcetree, nhưng nếu điều này xảy ra sẽ khuyên bạn nên loại bỏ chúng cùng một lúc (chậm hơn nhưng có vẻ đáng tin cậy hơn).... Hoặc ... cho các cam kết đã được đẩy:
Thực hiện theo các bước trong câu trả lời này , tương tự như trên, nhưng yêu cầu một lệnh tiếp theo được chạy từ dòng lệnh ( git push origin <branch> -f
) để buộc đẩy nhánh. Tôi khuyên bạn nên đọc tất cả và áp dụng sự thận trọng cần thiết!
Nếu bạn chỉ muốn chỉnh sửa cam kết mới nhất, hãy sử dụng:
git commit --amend
hoặc là
git commit --amend -m 'one line message'
Nhưng nếu bạn muốn chỉnh sửa một số cam kết liên tiếp, bạn nên sử dụng rebasing thay thế:
git rebase -i <hash of one commit before the wrong commit>
Trong một tệp, như ở trên, viết edit/e
hoặc một trong các tùy chọn khác, và nhấn lưu và thoát.
Bây giờ bạn sẽ ở cam kết sai đầu tiên. Thực hiện thay đổi trong các tệp và chúng sẽ được tự động dàn dựng cho bạn. Kiểu
git commit --amend
Lưu và thoát khỏi đó và gõ
git rebase --continue
để chuyển sang lựa chọn tiếp theo cho đến khi hoàn thành với tất cả các lựa chọn của bạn.
Lưu ý rằng những điều này thay đổi tất cả băm SHA của bạn sau cam kết cụ thể đó.
Nếu bạn chỉ muốn thay đổi tin nhắn cuối cùng của mình, bạn nên sử dụng --only
cờ hoặc lối tắt của nó -o
với commit --amend
:
git commit --amend -o -m "New commit message"
Điều này đảm bảo rằng bạn không vô tình nâng cao cam kết của mình với các công cụ được dàn dựng. Tất nhiên tốt nhất là có một $EDITOR
cấu hình phù hợp . Sau đó, bạn có thể bỏ -m
tùy chọn này và Git sẽ điền trước thông điệp cam kết với thông báo cũ. Bằng cách này, nó có thể dễ dàng chỉnh sửa.
git commit --amend
. Câu hỏi rất cụ thể, do đó lâu hơn! = Tốt hơn. Việc đề cập quyết định đến -o
cờ có lẽ sẽ bị chôn vùi trong phần còn lại của thông tin. Tôi cũng không thoải mái khi chỉnh sửa một câu trả lời đã có rất nhiều phiếu bầu.
--only
tùy chọn có --amend
sẵn từ git 1.3.0 nhưng nó không hoạt động chính xác cho đến khi nó được sửa trong 1.7.11.3 ( ea2d4ed35902ce15959965ab86d80527731a177c ). Vì vậy, câu trả lời đúng trong năm 2008 có lẽ sẽ giống như : git stash; git commit --amend; git stash pop
.
Cập nhật thông báo cam kết sai cuối cùng của bạn với thông báo cam kết mới trong một dòng:
git commit --amend -m "your new commit message"
Hoặc, hãy thử thiết lập lại Git như dưới đây:
# You can reset your head to n number of commit
# NOT a good idea for changing last commit message,
# but you can get an idea to split commit into multiple commits
git reset --soft HEAD^
# It will reset you last commit. Now, you
# can re-commit it with new commit message.
git reset
cũng có thể giúp bạn chia một cam kết thành nhiều cam kết:
# Reset your head. I am resetting to last commits:
git reset --soft HEAD^
# (You can reset multiple commit by doing HEAD~2(no. of commits)
# Now, reset your head for splitting it to multiple commits
git reset HEAD
# Add and commit your files separately to make multiple commits: e.g
git add app/
git commit -m "add all files in app directory"
git add config/
git commit -m "add all files in config directory"
Ở đây bạn đã chia thành công cam kết cuối cùng của bạn thành hai lần cam kết.
git commit --amend
, chính xác như cách nó nói trong câu trả lời được bình chọn hàng đầu . Ngoài ra, git reset --soft HEAD^
hoạt động giống hệt với thiết lập lại mềm trong câu trả lời trước đó , bởi vì cả hai đều đặt lại về cam kết cha mẹ đầu tiên.
git reset
vào giải pháp chỉ để đưa ra một ý tưởng để chia một thông điệp cam kết thành nhiều thông điệp cam kết. Bởi vì, tôi đã phải đối mặt với vấn đề đó khi tôi bắt đầu sử dụng git
. Đôi khi, điều này có thể thực sự hữu ích. :)
Về câu hỏi này có rất nhiều câu trả lời, nhưng không ai trong số họ giải thích siêu chi tiết về cách thay đổi các thông điệp cam kết cũ hơn bằng Vim . Tôi đã bị mắc kẹt khi cố gắng tự làm điều này, vì vậy ở đây tôi sẽ viết chi tiết về cách tôi đã làm điều này đặc biệt đối với những người không có kinh nghiệm về Vim!
Tôi muốn thay đổi năm cam kết mới nhất của mình mà tôi đã đẩy lên máy chủ. Điều này khá 'nguy hiểm' bởi vì nếu ai đó đã rút từ điều này, bạn có thể làm mọi thứ rối tung lên bằng cách thay đổi các thông điệp cam kết. Tuy nhiên, khi bạn đang làm việc trên chi nhánh nhỏ của mình và chắc chắn không ai kéo nó, bạn có thể thay đổi nó như thế này:
Giả sử bạn muốn thay đổi năm cam kết mới nhất của mình và sau đó bạn nhập mã này vào thiết bị đầu cuối:
git rebase -i HEAD~5
* Trong đó 5 là số lượng tin nhắn cam kết bạn muốn thay đổi (vì vậy nếu bạn muốn thay đổi cam kết thứ 10 thành cam kết cuối cùng, bạn nhập 10).
Lệnh này sẽ đưa bạn vào Vim ở đó bạn có thể 'chỉnh sửa' lịch sử cam kết của mình. Bạn sẽ thấy năm cam kết cuối cùng của bạn ở đầu như thế này:
pick <commit hash> commit message
Thay vì pick
bạn cần viết reword
. Bạn có thể làm điều này trong Vim bằng cách gõ vào i
. Điều đó làm cho bạn đi vào chế độ chèn . (Bạn thấy rằng bạn đang ở chế độ chèn bởi từ INSERT ở phía dưới.) Đối với các cam kết bạn muốn thay đổi, hãy nhập reword
thay vì pick
.
Sau đó, bạn cần lưu và thoát khỏi màn hình này. Bạn làm điều đó bằng cách trước tiên vào 'chế độ lệnh' bằng cách nhấn Escnút (bạn có thể kiểm tra xem bạn đang ở chế độ lệnh nếu từ INSERT ở phía dưới đã biến mất). Sau đó, bạn có thể gõ một lệnh bằng cách gõ :
. Lệnh để lưu và thoát là wq
. Vì vậy, nếu bạn gõ :wq
bạn đang đi đúng hướng.
Sau đó, Vim sẽ chuyển qua mọi thông điệp cam kết bạn muốn điều chỉnh lại và ở đây bạn thực sự có thể thay đổi các thông điệp cam kết. Bạn sẽ làm điều này bằng cách chuyển sang chế độ chèn, thay đổi thông báo cam kết, chuyển sang chế độ lệnh và lưu và thoát. Làm điều này năm lần và bạn ra khỏi Vim!
Sau đó, nếu bạn đã đẩy các cam kết sai của mình, bạn cần git push --force
ghi đè lên chúng. Hãy nhớ rằng đó git push --force
là một điều khá nguy hiểm để làm, vì vậy hãy chắc chắn rằng không ai rút khỏi máy chủ kể từ khi bạn đẩy sai phạm!
Bây giờ bạn đã thay đổi tin nhắn cam kết của bạn!
(Như bạn thấy, tôi không có kinh nghiệm về Vim, vì vậy nếu tôi sử dụng sai 'biệt ngữ' để giải thích những gì đang xảy ra, vui lòng sửa tôi!)
<nitpick>
Không có "chủ đề" nào trên Stack Overflow, vì đây không phải là một diễn đàn thảo luận, chỉ có "câu hỏi", "câu trả lời" và "bài viết". </nitpick>
. Ngoài ra, không phải tất cả các phiên bản của Vim đều giống nhau, không phải tất cả chúng đều cho phép bạn xóa các ký tự trong chế độ chèn (có ý nghĩa theo một cách nào đó, phải không?). Nếu bạn muốn luôn có thể xóa các ký tự trong Vim X
và x
sẽ làm điều đó (một ít x
xóa các ký tự ở phía trước con trỏ, X
sẽ xóa phía sau). Nếu bạn mắc lỗi, bạn có thể sử dụng u
nhiều lần để hoàn tác. Cuối cùng, r
là tốc ký reword
trong trình soạn thảo rebase tương tác.
cw
gõ vào đầu của nó (mặc dù câu hỏi không phải là về vim, tôi đồng ý).
nano
mcedit Midnight Commander.
Bạn có thể sử dụng git-rebase-tuaord
Nó được thiết kế để chỉnh sửa bất kỳ cam kết nào (không chỉ cuối cùng) theo cách tương tự như commit --amend
$ git rebase-reword <commit-or-refname>
Nó được đặt tên theo hành động tương tác rebase để sửa đổi một cam kết: "tua lại". Xem bài đăng này và chế độ tương tác người đàn ông-
Ví dụ:
$ git rebase-reword b68f560
$ git rebase-reword HEAD^
g c; g rb -i @~9
(cam kết và rebase), di chuyển cam kết mới đến nơi tôi muốn, thay đổi commit
thành f
( fixup
) và lưu. Nếu bạn muốn một cái gì đó nhanh hơn thế, bạn có thể bí danh git commit --fixup=<commit>; git rebase -i --autosquash <commit>^
Tôi nhận ra rằng tôi đã đẩy một cam kết với một lỗi đánh máy trong đó. Để hoàn tác, tôi đã làm như sau:
git commit --amend -m "T-1000, advanced prototype"
git push --force
Cảnh báo: buộc đẩy các thay đổi của bạn sẽ ghi đè lên nhánh từ xa bằng nhánh cục bộ của bạn. Hãy chắc chắn rằng bạn sẽ không ghi đè lên bất cứ thứ gì bạn muốn giữ. Ngoài ra, hãy thận trọng về việc buộc một cam kết sửa đổi (viết lại) nếu có ai khác chia sẻ chi nhánh với bạn, bởi vì họ sẽ cần phải viết lại lịch sử của chính họ nếu họ có bản sao cũ của cam kết mà bạn vừa viết lại.
Tôi thích sử dụng như sau:
git status
git add --all
git commit -am "message goes here about the change"
git pull <origin master>
git push <origin master>
Nếu bạn chưa đẩy mã đến chi nhánh từ xa ( GitHub / Bitbucket ), bạn có thể thay đổi thông báo cam kết trên dòng lệnh như dưới đây.
git commit --amend -m "Your new message"
Nếu bạn đang làm việc trên một chi nhánh cụ thể, hãy làm điều này:
git commit --amend -m "BRANCH-NAME: new message"
Nếu bạn đã đẩy mã với thông báo sai và bạn cần cẩn thận khi thay đổi tin nhắn. Đó là, sau khi bạn thay đổi thông điệp cam kết và thử đẩy nó một lần nữa, bạn sẽ gặp vấn đề. Để làm cho nó trơn tru, hãy làm theo các bước sau.
Xin vui lòng đọc toàn bộ câu trả lời của tôi trước khi làm điều đó.
git commit --amend -m "BRANCH-NAME : your new message"
git push -f origin BRANCH-NAME # Not a best practice. Read below why?
Lưu ý quan trọng: Khi bạn sử dụng lực đẩy trực tiếp, bạn có thể gặp phải các vấn đề về mã mà các nhà phát triển khác đang làm việc trên cùng một chi nhánh. Vì vậy, để tránh những xung đột đó, bạn cần phải rút mã từ chi nhánh của mình trước khi thực hiện lực đẩy :
git commit --amend -m "BRANCH-NAME : your new message"
git pull origin BRANCH-NAME
git push -f origin BRANCH-NAME
Đây là cách tốt nhất khi thay đổi thông điệp cam kết, nếu nó đã được đẩy.