git commit --amend
có lẽ đã quá quen thuộc, nhưng với --amend
chỉ commit hay sửa được commit cuối cùng mà thôi.
I. Đặt vấn đề
Đây là git log
hiện tại:
2869a6b (HEAD->main) feat: add forgot page (7 hours ago)
b6f6b90 feat: add sign up page (1 day ago)
768caf4 feat: add sign in page (2 days ago)
aac33b7 Initial commit (3 days ago)
Tôi đang làm một feature mới là trang reset.tsx
page, và bỗng phát hiện SignIn.tsx
bị sai chính tả và rất khó chịu, tôi quyết định sửa và commit nó vào chung với:
768caf4 feat: add sign in page
Khó là không thể dùng --amend
bởi vì 768caf4
không phải là commit cuối cùng.
II. Giải quyết
Cùng xem git diff
hiện tại:
diff --git a/Reset.tsx b/Reset.tsx
new file mode 100644
index 0000000..c9e7d74
--- /dev/null
+++ b/Reset.tsx
@@ -0,0 +1,5 @@
+const Reset = () => {
+ return <div>Reset page</div>;
+};
+
+export default Reset;
diff --git a/SignIn.tsx b/SignIn.tsx
index f387d14..c541661 100644
--- a/SignIn.tsx
+++ b/SignIn.tsx
@@ -1,5 +1,5 @@
const SignIn = () => {
- return <div>Wellcome, please sign in.</div>;
+ return <div>Welcome, please sign in.</div>;
}; export default SignIn;
Nhìn qua diff ta thấy working directory hiện tại có tạo mới Reset.tsx
và sửa đổi chính tả chữ "Wellcome" thành "Welcome" trong SignIn.tsx
.
Tất nhiên chúng ta chỉ quan tâm đến SignIn.tsx
và cố gắng commit thay đổi vào 768caf4 feat: add sign in page
là xong bài toán.
B1: Chỉ thêm SignIn.tsx
vào staged changes
$ git add SignIn.tsx
B2: commit với --fixup=<SHA>
mà chúng ta muốn amend vào.
$ git commit --fixup=768caf4
B3: Dọn dẹp với rebase -i --autosquash <SHA>~1
$ git rebase -i --autosquash --autostash 768caf4~1
And bùmmmm! Xem thành quả như chưa hề có một lỗi lầm nào ở SignIn.tsx
III. Tổng kết
- Bước cuối cùng
--autostash
có ỹ nghĩa quan trọng nó giúp việc rebase diễn ra suông sẽ hơn, nó đưa các changes hiện tại vào stash và trả lại như cũ sau khi hoàn thành, cụ thể ở đây làReset.tsx
- Sửa commit cũ chỉ khuyến khích khi chưa push to remote, mọi hành động
push --force
đều không được khuyến khích 😇