15 lệnh Git cứu nguy khi lỡ tay
bởi supermandev

Git có một đặc tính siêu đáng yêu mà cũng cực kỳ "hú hồn": gần như không có gì thật sự mất đi hoàn toàn. Cái đoạn code bạn lỡ tay ấn xóa sạch sành sanh hóa ra vẫn đang nằm ẩn nấp đâu đó trong hệ thống, chỉ là lúc hoảng quá bạn chưa biết cách thò tay vào để bới nó lên thôi.
Bài viết này không bắt mấy ông ngồi tụng kinh từ điển lệnh Git theo bảng chữ cái ABC làm gì cho nặng đầu. Chúng ta sẽ gom chúng lại theo đúng mấy cái tình huống "cười ra nước mắt" mà anh em dev hay gặp lúc mặt cắt không còn giọt máu bên bàn phím.
Nhưng trước khi bấm nút cứu nguy, nhớ kỹ một nguyên tắc vàng: Khi không chắc chắn điều gì, hãy chạy lệnh xem trạng thái hiện tại trước, rồi hẵng múa tay thay đổi sau.
Nhóm 1: "Mình đang lạc trôi ở cái xó xỉnh nào thế này?" (Check status)
git status– Câu thần chú phải gõ đầu tiên trong mọi tình huống. Nó sẽ khai báo thật thà là bạn đang tá túc ở nhánh nào, file nào vừa bị chọc ngoáy, và file nào đã được nhét vào vùng chờ.git log --oneline --graph -15– Chụp lại bức tranh toàn cảnh 15 commit gần nhất dưới dạng một sơ đồ cây gọn gàng. Nhìn phát biết ngay mình vừa làm gì với dòng thời gian của dự án.git diffvàgit diff --staged– Lệnh đầu soi xem nãy giờ bạn đã sửa bậy bạ những gì chưa add. Lệnh thứ hai soi xem chuẩn bị đem cái gì đi commit. Tập thói quen ngó lệnh thứ hai trước khi ấn Enter sẽ cứu bạn khỏi hàng trăm pha lỡ tay nhầm file cấu hình hoặc lòi mấy dòng code test dơ bẩn lên server.
Nhóm 2: "Chưa kịp commit mà đã thấy hối hận"
git restore <file>– Xóa sạch mọi thay đổi chưa commit của một file, trả nó về zin như lúc mới lấy về. Cảnh báo: Đã bóp cò lệnh này là xác định mất trắng chỗ code vừa ngồi gõ đấy nhé!git restore --staged <file>– Lỡ taygit addnhầm một đống file rác nhưng chưa kịp commit? Lệnh này sẽ lôi chúng ra khỏi vùng chờ, nhưng tuyệt đối an toàn vì không làm sứt mẻ một chữ code nào của bạn.git stashvàgit stash pop– Đang cắm đầu code tính năng ngon trớn thì sếp gọi vào sửa bug gấp ở nhánh khác. Bấmgit stashđể nhét mọi thứ vào kho tạm cất đi, xử lý xong xuôi quay lại bấmgit stash popđể hốt nó ra code tiếp. Nhớ đèo thêm-unếu muốn cất cả mấy file mới tinh chưa được track nhé.git clean -nrồi mới tớigit clean -fd– Dọn rác mấy file lạ hoắc chưa được quản lý. Luôn luôn chạy bản-ntrước để xem nó định xóa những gì, vì lệnh này không có nút "Undo" đâu đấy!
Nhóm 3: "Ấn commit xong mới nhận ra mình vừa làm chuyện dại dột"
git commit --amend– Quên nhét một file quan trọng hoặc viết sai chính tả ở cú commit vừa rồi? Cứ fix code đi,git addlại rồi gõ lệnh này để gộp chung vào commit cũ cho đẹp đội hình. Lưu ý: Chỉ xài khi chưa push lên server thôi nhé.git reset --soft HEAD~1– Hủy ngay cái commit gần nhất nhưng vẫn nâng niu giữ lại toàn bộ đống code trong vùng staging. Quá tuyệt vời khi bạn lỡ tay commit sớm quá và muốn xào nấu lại cho gọn gàng.git reset --hard HEAD~1– Hủy commit cuối và vứt xó luôn cả code. Đây là chiếc nút đỏ hay bị bấm nhầm nhất lịch sử nhân loại. Nếu lỡ tay dại dột, đừng vội khóc thét, ngó ngay xuống Nhóm 5 để cứu vãn cuộc đời.
Nhóm 4: "Lỡ tay push rác lên server chung rồi, cứu tôi với!"
git revert <mã-commit>– Lệnh này chơi kiểu "quay xe cực gắt": nó tự đẻ ra một commit mới tinh tươm có nhiệm vụ đảo ngược toàn bộ những gì cái commit sai lầm kia vừa gây ra. Đây là cách văn minh và an toàn nhất vũ trụ khi bạn muốn bôi xóa tội lỗi trên nhánh chung mà không làm đồng nghiệp phải khổ sở.Mẹo sống sót: Đừng bao giờ dại dột dùng
resettrên nhánh chung tập thể. Nếu buộc phải ghi đè lịch sử trên nhánh cá nhân, hãy xàigit push --force-with-leasethay vì--forcethuần túy. Lệnh này khôn ở chỗ nếu phát hiện có người khác vừa đẩy code lên trước, nó sẽ từ chối đè ngay để tránh việc bạn vô tình xóa sổ công sức của người ta.
Nhóm 5: "Tưởng mất xác hóa ra vẫn nằm lù lù" (Vị thần Reflog cứu thế)
git reflog– Đây chính là vị cứu tinh quyền năng nhất của anh em lập trình viên. Nó ghi lại tường tận từng bước chân dịch chuyển của con trỏHEAD, kể cả mấy cái commit đã bị bạn dại dộtreset --hardhay cái nhánh vừa bị xóa bay màu.
Bash
git reflog
# a1b2c3d HEAD@{0}: reset: moving to HEAD~1
# e4f5g6h HEAD@{1}: commit: thêm tính năng thanh toán
git reset --hard e4f5g6h # Quay ngược thời gian về trước lúc lỡ tay
Nhắc nhẹ: Reflog chỉ nằm lưu trú trên máy tính cá nhân của bạn thôi và Git cũng sẽ tự dọn rác sau một thời gian, thế nên có hoảng loạn thì cũng phải chui vào cứu sớm đi nhé.
git branch <tên-nhánh> <mã-commit>– Lỡ tay xóa bụp một cái nhánh chưa kịp merge mà tim đập chân run? Lội cổ vàogit reflogbới tìm mã commit cuối cùng của nó rồi dựng lại một nhánh mới bám chặt vào đấy là xong phim.
Nhóm 6: "Gửi nhầm địa chỉ" (Commit nhầm nhánh)
git cherry-pick <mã-commit>– Lỡ tay commit nhầm một đống code tâm huyết sang nhánh A trong khi lẽ ra nó phải nằm ở nhánh B? Đơn giản vô cùng: nhảy sang nhánh B, gọi lệnhcherry-pickbế cái mã commit đó sang, rồi quay lại nhánh A dọn dẹp bãi chiến trường là xong chuyện.git switch -c <nhánh-mới>– Tình huống kinh điển mà ai đi làm cũng dính ít nhất một lần: cặm cụi code cả buổi chiều xong táng thẳng một phát commit lên thẳng nhánhmaincủa công ty. Cách gỡ gạc gọn gàng nhất khi chưa trót dạipushlên trời:
Bash
git switch -c tinh-nang-moi # Bế nguyên đống code vừa rồi sang một nhánh mới tinh
git switch main # Quay lại nhánh chính
git reset --hard origin/main # Đưa nhánh main về đúng chuẩn sạch sẽ như chưa có gì xảy ra
Toàn bộ tinh hoa code lách của bạn đã nằm an toàn bên nhánh mới, còn nhánh main lại tinh tươm sạch sẽ như chưa từng có cuộc chia ly.
Ba thói quen sinh tồn giúp bạn đỡ phải khốc liệt với Git
Chia nhỏ và commit liên tục: Commit càng bé, lúc gỡ rối càng bớt đẫm nước mắt. Đừng ôm cả đống code rồi commit một cục to tướng.
Tập trân trọng
git diff --stagedtrước khi gõ chữ Enter: Mười giây check lại hàng họ lúc nào cũng rẻ hơn mười tiếng ngồi khóc thét fix bug ngoài production.Nói KHÔNG với các lệnh có
--hardhay--forcekhi đang vội vã: Đó luôn là khoảnh khắc đôi tay nhanh hơn bộ脳 và thảm họa bắt đầu gõ cửa.
Nhớ lại thời còn là "newbie", tôi từng hí hửng gõ nhầm một lệnh
reset --hardbay toi công sức code cày cuốc suốt hai ngày cuối tuần, ngồi trân trân nhìn màn hình đen ngòm mà mồ hôi hột vã ra. May sao có ông anh đi ngang qua, lạnh lùng gõ chữgit reflogrồi cứu tôi về từ cõi chết. Kể từ đấy, tôi thành tín đồ trung thành của reflog luôn!
Lời kết: Chẳng ai nhớ nổi mấy trăm cái câu lệnh lắt léo của Git làm gì cho mệt não cả. Chỉ cần ghim chặt vào đầu một chân lý: gần như không có gì chết hẳn trong Git cả, và git reflog luôn là trạm cứu hộ đầu tiên khi bạn cần tìm lại ánh sáng cuộc đời. Cứ lưu ngay bài này lại, thế nào đến lúc hốt hoảng cũng sẽ phải lôi ra đọc đấy!
Bình luận (0)
Chưa có bình luận nào. Comment đầu tiên đi!
