Tôi có 2 lần cam kết, A rồi B, sẵn sàng để được đẩy. Tôi nhận ra tôi đã quên thêm một cái gì đó vào A.
Làm cách nào tôi có thể thêm thay đổi này vào A bằng Magit? Tôi thậm chí không biết phần nào trong tài liệu Git mà tôi nên xem.
Tôi có 2 lần cam kết, A rồi B, sẵn sàng để được đẩy. Tôi nhận ra tôi đã quên thêm một cái gì đó vào A.
Làm cách nào tôi có thể thêm thay đổi này vào A bằng Magit? Tôi thậm chí không biết phần nào trong tài liệu Git mà tôi nên xem.
Câu trả lời:
Hãy giả vờ một lúc rằng bạn muốn thêm một cái gì đó vào HEAD
cam kết, tức là "cam kết thứ hai B" trong ví dụ của bạn.
Cửa sổ bật lên cam kết trên ctính năng ràng buộc " aSửa đổi". Nhấn phím đó sẽ "sửa đổi" các thay đổi theo giai đoạn đối với HEAD
cam kết. Vì các xác nhận không thể thay đổi trong Git, nên điều này thực sự sẽ thay thế các cam kết cũ bằng một cam kết mới. Một bộ đệm với thông báo cam kết cũ sẽ bật lên, để bạn có thể sửa đổi nó trong trường hợp thay đổi được thêm vào cũng yêu cầu bạn điều chỉnh thông báo. Như mọi khi, nhấn C-c C-ckhi bạn hoàn thành chỉnh sửa tin nhắn. Điều này tương đương với việc chạy git commit --amend
trên dòng lệnh.
HEAD
và chỉnh sửa thông điệp cam kết của nóVì thường xảy ra việc bạn chỉ phải điều chỉnh thay đổi hoặc tin nhắn, Magit cung cấp hai biến thể bổ sung:
HEAD
mà không chỉnh sửa thông điệp cam kếtHEAD
mà không cần thêm các thay đổi theo giai đoạn cho nóKhi bạn muốn chỉnh sửa một cam kết không HEAD
, thì những điều trên sẽ không hoạt động. Các lệnh này luôn "sửa đổi" (tức là thay thế) HEAD
cam kết. Git không cung cấp một lệnh duy nhất để sửa đổi một cam kết nào khác ngoài HEAD
việc này có liên quan nhiều hơn một chút.
Magit không cung cấp một lệnh như vậy, nhưng vì có những tình huống mà trong đó nó là thích hợp hơn để làm điều này trong nhiều bước, chúng tôi sẽ thảo luận rằng đầu tiên.
Sửa đổi một cam kết khác hơn HEAD
có thể được chia thành ba bước:
A
) các HEAD
.HEAD
(như được mô tả ở trên), dẫn đến cam kết A'
.A
, nhưng trên đầu trang A'
.Điều này có thể được thực hiện bằng cách sử dụng một rebase tương tác. Nhập rđể hiển thị cửa sổ bật lên rebase. Sau đó gõ mđể gọi biến thể rebase "chỉnh sửa cam kết". Một bộ đệm với các cam kết gần đây xuất hiện. Di chuyển đến cam kết bạn muốn sửa đổi và gõ C-c C-cđể chọn nó. Git sau đó tua lại lịch sử với cam kết đó và hiển thị thông tin về cuộc nổi loạn đang diễn ra trong bộ đệm trạng thái.
Sửa đổi HEAD
như mô tả ở trên. Sau đó nói với Git rằng bạn đã hoàn thành bằng cách gõ r r. Nếu A'
và B
xung đột thì rebase sẽ dừng lại B
và bạn phải giải quyết xung đột. Sau khi bạn đã làm như vậy nhấn r rđể tiếp tục.
Nếu bạn biết rằng những thay đổi của bạn A
sẽ dẫn đến xung đột với B
, thì hãy tiếp tục như mô tả ở trên, nếu không hãy sử dụng phương pháp sau.
Git cho phép tạo "cam kết sửa lỗi" bằng cách sử dụng git commit --fixup A
. Điều này tạo ra một cam kết mới , ghi lại những thay đổi "đáng lẽ phải được thực hiện trong một cam kết khác". Cam kết đó trở thành mới HEAD
. Cũng tồn tại một --squash
biến thể. Để biết thông tin về sự khác biệt xem git-commit
trang người đàn ông.
Để thực sự kết hợp các A
cam kết và cam kết mới A'
và sau đó áp dụng lại B
trên đầu trang, bạn phải sử dụng rebase. Magit cung cấp một lệnh thuận tiện để làm như vậy trên r f.
Sự khác biệt chính của cách tiếp cận ở trên là ở đây trước tiên chúng tôi tạo một cam kết mới và sau đó chúng tôi khởi động lại để kết hợp điều đó với "mục tiêu" và áp dụng lại B
. Ở trên chúng tôi bắt đầu với việc nổi loạn thay vì cam kết.
Trong Magit cả --fixup
và các --squash
biến thể đều có sẵn từ cửa sổ bật lên cam kết, trên fvà s. Nhưng Magit cũng cung cấp các biến thể "tức thời" của các lệnh sửa lỗi và squash trên Fvà S. Các biến thể này tạo ra một cam kết mới như các biến thể "không tức thời", nhưng sau đó chúng ngay lập tức kết hợp cam kết sửa lỗi với cam kết đích bằng cách sử dụng rebase mà không cần bạn phải gọi lệnh khác.
"Sửa lỗi tức thì" ( c F) về cơ bản giống như "mở rộng HEAD
" ( c e), ngoại trừ việc nó hoạt động cho bất kỳ cam kết nào, không chỉ HEAD
.
Đọc thêm:
git-commit(1)
git-rebase(1)
git-commit
trang man chuyển hướng git-rebase(1)
có các dòng này: 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ó lệnh "squash", nhưng bỏ qua các thông báo cam kết cam kết với "sửa lỗi" chỉ huy. IOW, sử dụng fixup nếu bạn chỉ muốn sửa mã trong lần xác nhận trước, sử dụng squash nếu bạn cũng muốn sửa thông báo cam kết.
git commit --amend –C HEAD
là lệnh Git mà bạn muốn tìm kiếm và bạn có thể sửa đổi trong Magit với C-c C-a
.
C-c C-a
là từ phiên bản cũ hơn (tôi nghĩ). Hơn nữa, tôi thấy không có dấu vết của "sửa đổi" trong bộ đệm trợ giúp ( ?
).
Vì vậy, một quy trình công việc là:
Sau đó
Tự động điền sẽ tự động di chuyển tất cả! Fixup cam kết đến đúng nơi và đặt chúng bị đè bẹp trên cơ sở lại.
i
sản lượng cho tôi Cannot rebase: Your index contains uncommitted changes. Please commit or stash them.
. Ngoại trừ tôi không có bất kỳ thay đổi không cam kết nào. : /
Proceed despite merge in rebase range? [c]ontinue, [s]elect other, [a]bort
. Có phải nó đang cố nói với tôi rằng bản sửa lỗi của tôi có thể gặp sự cố trong lần hợp nhất sắp tới không?
merge in rebase
, xem BUGS dưới git help rebase
. Tôi đề nghị làm việc sửa chữa trước khi kéo ngược dòng.
Để thực hiện cam kết cuối cùng, đó là "c a". Fixup là để tăng cường một số cam kết cũ.