Sự khác biệt giữa “bí” và “sửa lỗi” trong Git / Git Extension là gì?


111

Tôi đã sử dụng Tiện ích mở rộng Git được một lúc rồi (thật tuyệt vời!) Nhưng tôi chưa tìm thấy câu trả lời đơn giản cho những điều sau:

Đôi khi, khi nhập một thông báo cam kết, bạn mắc lỗi đánh máy. Bạn tôi đã chỉ cho tôi cách sửa nó theo cách sau (trong Git Extentions):

Nhấp chuột phải vào cam kết> Nâng cao> Cam kết sửa lỗi

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

Sau đó, tôi chỉ cần chọn hộp "Sửa đổi" và viết lại tin nhắn của tôi và thì đấy! Thông báo cam kết của tôi đã được sửa.

Tuy nhiên, tùy chọn khác "Squash commit" ... Tôi đã luôn tự hỏi nó làm gì ?!

Câu hỏi của tôi là:

Ai đó có thể giải thích cho tôi sự khác biệt chính xác giữa Squash commitFixup commit trong Git / Git Extentions không? Họ trông giống như ... "tương tự" với tôi: nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

Câu trả lời:


153

Tôi không biết cụ thể Phần mở rộng Git làm gì với nó, nhưng git rebasecó một tùy chọn để tự động xóa hoặc sửa lỗi cam kết với bí! hoặc sửa chữa! tiền tố, tương ứng:

   --autosquash, --no-autosquash
       When the commit log message begins with "squash! ..." (or "fixup!
       ..."), and there is a commit whose title begins with the same ...,
       automatically modify the todo list of rebase -i so that the commit
       marked for squashing comes right after the commit to be modified,
       and change the action of the moved commit from pick to squash (or
       fixup).

Sự khác biệt giữa bản sửa lỗi và bản sửa lỗi là trong quá trình rebase, squashhoạt động sẽ nhắc bạn kết hợp các thông báo của bản gốc và bản cam kết bí mật, trong khi fixupthao tác này sẽ giữ lại bản tin gốc và loại bỏ thông báo khỏi bản cam kết sửa chữa.


6
Bạn có thể đọc thêm về rebasevà giải quyết / sửa lỗi tại tài liệu Git .

Đây là một câu trả lời tuyệt vời. Luôn tự hỏi tại sao tôi nhận được thông báo cam kết kết hợp.
jedd.ahyoung

66

Nói một cách đơn giản, khi khôi phục một loạt các cam kết, mỗi cam kết được đánh dấu là a squash, sẽ cho bạn cơ hội sử dụng thông điệp của nó như một phần của một pickhoặc rewordthông báo cam kết.

Khi bạn sử dụng fixupthông báo từ cam kết đó sẽ bị loại bỏ.


Thông điệp nào được giữ cho fixupsau đó?
IgorGanapolsky

2
@IgorGanapolsky Thông báo từ lần cam kết tiếp theo trong cây git. Về cơ bản, bạn "hợp nhất" cam kết của mình vào nó.
Alexander Haroldo da Rocha

15

Từ git-rebase doc, phần "chế độ tương tác" :

Nếu bạn muốn gấp hai hoặc nhiều cam kết thành một, hãy thay thế lệnh "pick" cho lần cam kết thứ hai và các lần tiếp theo bằng "bí" hoặc "sửa lỗi". Nếu các cam kết có tác giả khác nhau, cam kết gấp 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 gấp là sự kết hợp của các thông điệp cam kết của cam kết đầu tiên và của những thông điệp có lệnh "bí", nhưng bỏ qua thông báo cam kết của các cam kết bằng lệnh "fixup".


13

Nếu câu hỏi là sự khác biệt giữa squashfixuptrong git khi thực hiện git rebase --interactive , thì câu trả lời là thông báo cam kết .

s, squash <commit> = sử dụng cam kết, nhưng kết hợp với cam kết trước đó

f, fixup <commit>= giống như "bí", nhưng hủy thông báo nhật ký của cam kết này


Ví dụ:

pick 22a4667 father commit message
squash 46d7c0d child commit message # case 1
# fixup 46d7c0d child commit message # case 2

Các cam kết thông báo sau rebasing trong trường hợp 1 sẽ là:

father commit message

child commit message

trong khi thông báo cam kết trong trường hợp 2 là:

father commit message
# no sub messages

1

Tôi đã mày mò với các tiện ích mở rộng git và không thể làm cho nó biến nhiều cam kết thành một. Để làm điều đó, tôi phải dùng đến dòng lệnh và thấy bài đăng này hữu ích

git rebase -i Head~2

Đây là rebase tương tác và lưu ý những điều sau:

  • ~ 2 ở đây đề cập đến số lượng cam kết bạn muốn tham gia vào hoạt động này, bao gồm cả người đứng đầu hiện tại
  • Bạn phải chỉnh sửa cửa sổ chỉnh sửa tương tác phụ, để mục đầu tiên là "chọn" và thay thế các dòng tiếp theo bằng "bí". Hướng dẫn trong liên kết ở trên rõ ràng hơn nhiều nếu điều này không rõ ràng.

Bài đăng mà bạn liên kết đến là về lời giải thích rõ ràng nhất mà tôi đã thấy về bí và sửa chữa. Cảm ơn!
Simon Tewsi

0

Tại sao không hỏi chính git? Khi bạn rebase với git-bash, nó nói:

pick 512b1d7 (some comment)
# Rebase 621b2e4..512b1d7 onto 621b2e4 (1 command)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# .       create a merge commit using the original merge commit's
# .       message (or the oneline, if no original merge commit was
# .       specified). Use -c <commit> to reword the commit message.
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
D:/code/fenixito-legacy-api/.git/rebase-merge/git-rebase-todo [unix] (11:57 23/10/2019)                                         1,1 start
"D:/code/xxx/.git/rebase-merge/git-rebase-todo" [UNIX] 27L, 1170C

Bạn thấy đó:

s, squash = sử dụng cam kết, nhưng kết hợp với cam kết trước đó

f, fixup = like "squash", nhưng hủy thông báo nhật ký của cam kết này

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.