19 Bí Kíp Bạn Có Thể Dùng Khi Phạm Sai Lầm Với Git
19 Bí Kíp Bạn Có Thể Dùng Khi Phạm Sai Lầm Với Git
Những nội dung sau rất nguy hiểm, nếu bạn làm theo, xin hãy chịu trách nhiệm về bản thân mình.
Nếu có gì sai sót, mong bạn hãy chỉ ra để tôi được biết
Ở trên local
Có hiệu quả khi làm việc trên môi truờng phát triển của bản thân, không làm ảnh hưởng đến người khác. Khi làm việc trên remote sẽ phát sinh ảnh hưởng đến người khác nên rất nguy hiểm.
Sự cố 1: Khi trong commit message lỡ có những từ cấm kị khiến bạn chỉ muốn chết đi cho xong
Để sửa lại nội dung commit thì rất đơn giản. Cũng có thể thêm được cả file vào trong commit1
2$ git commit --amend
# Sau lệnh này ta có thể thay đổi nội dung commit message một cách tuỳ ý
Sự cố 2: Khi lỡ tay commit dưới tên của môt user khác
Khi làm việc ở nhà và khi làm việc trên công ty thì hẳn sẽ có lúc sử dung git config khác nhau và cũng có lúc bị nhầm thiết lập.
Ở đây chúng ta đang nói về việc thay đổi tác giả (Author) Hãy đổi Commiter ở .gitconfig
hoặc .git/config
Khi muốn đổi tên user hoặc email của HEAD
1 | # Hãy sửa lại user.name và user.email |
Trường hợp muốn sửa lại commit từ lâu rồi
1 | $ git rebase -i <commit> |
(NGUY HIỂM) Viết lại toàn bộ lịch sử commit
Khi muốn sửa các commit của người dùng (committer) nhất định thì có thể dùng cách sau để sửa
Lịch sử commit sẽ bị thay đổi hoàn toàn
1 |
|
Sự cố 3: Khi đã lỡ tay commit một số file thừa nhưng sau khi nghĩ lại thì nên ignore thì hơn
Trường hợp commit xoá
Nếu có những phần thừa thì ta xoá đi rồi thêm vào ignore
1 | # Đầu tiên là xoá các file đã commit khỏi repository |
Trường hợp muốn coi như là chưa từng có file đó
Khi mà bạn muốn: “Hả, file nào cơ, là gì có file nào như thế ?”
1 | # Trường hợp chỉ xoá khỏi lịch sử commit (để lại ở working tree) |
Sự cố 4: Khi mà tên branh bạn đặt quá là “chuối”
Nếu không ai nhìn thấy thì ta “bí mật” sửa lại tên branch thôi nào !1
$ git branch -m <tên branch sau khi đổi>
Sự cố 5: Khi trong phút nông nổi bạn lỡ commit và giờ muốn commit đó biến mất
Không để cho ai biết (= người khác vẫn chưa pull về)
Sửa lại phần lịch sử commit ngay trước đó1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17# Tuỳ vào từng trường hợp mà ta có 3 cách sau để đưa lịch sử commit về như cũ
# 1. Chỉ đưa HEAD về như cũ
$ git reset --soft HEAD~
# 2. Đưa HEAD và index về như cũ
$ git reset HEAD~
# 3. Đưa cả index, working tree về 1 commit trước đó
$ git reset --hard HEAD~
```
Trường hợp đã bị ai đó phát hiện(= người khác đã pull về)
Nếu thay đổi lịch sử commit sẽ dẫn đến tình trạng lộn xộn nên ta cầm dùng commit xoá để giải quyết
``` bash
$ git revert <commit>
Sự cố 6: Khi muốn tổng hợp những commit vụn vặt trước đây thành một commit
Sử dụng rebase + squash (or fixup) để tổng hợp lại các commit cũ
1 | # Rebase về n commit trước (có bao gồm cả HEAD) |
Thay vì dùng squash có thể dùng fixup nhưng khi đó commit message của những commit được fixup sẽ bị mất
Sự cố 7: Khi bạn muốn chia commit to thành những commit nhỏ hơn một cách thông minh
Ở mục 6, tuy tổng hợp lại là tốt nhưng khi tổng hợp quá nhiều cũng sẽ trở thành vấn đề Rất tiện khi mà những commit chức năng bị lẫn vào những commit sửa bug
1 | # Đây là việc không làm sau khi đã push code lên remote |
Sự cố 8: Khi lỡ tay commit nhầm sang một branch khác
Có những lúc ta sơ suất lỡ tay commit thẳng vào master trong khi thực ra là muốn commit vào một branch khác
1 | # Đầu tiên là tạo một branch khác chứa trạng thái mà ta đã commit |
Sự cố 9: Khi muốn xoá hoàn toàn các file không cần thiết
Có những lúc ta muốn 1 phát xoá tất tần tật những file tự động sinh ra hoặc những file tự động back up. Nếu không phải là những file cần git quản lý hoặc những file sẽ commit thì xoá đi thôi. Ơ mà cái này cũng ko phải là sự cố nhỉ…
1 | # Đầu tiên là add&commit tất cả những thứ cần thiết lại |
Tiện đây thì trong trường hợp chỉ là những file mà git không quản lý thì chỉ như sau là OK
1 | # Kiểm tra lại các file sẽ xoá cho chắc |
Sự cố 10: Khi tạm thời cần tạm dừng công việc hiện tại và chuyển sang một branch khác
Tuy mình không xấu nhưng có những lúc cần phải tạm dừng công việc để làm việc khác
1 | # Tạm thời lưu lại các phần công việc còn đang làm dở |
Sự cố 11:Khi lỡ tay xoá mất một commit cực kì cực kì quan trọng
Đây hẳn là sự cố khủng khiếp nhất. Có thể xảy ra khi lỡ tay git reset –hard Tuy nhiên, commit nào cũng có thể hồi phục được
1 | # Đầu tiên là xem lại toàn bộ lịch sử commit |
Sự cố 12: Khi lỡ tay xoá mất branch và muốn lấy lại
Nếu vẫn còn reflog thì không có sao. Vẫn có thể hồi phục lại được Nếu commit lên một branch không tên, sau đó check out sang một branch khác bị xoá mất thì cũng tương tự
Tương tự giống như sự cố 13 dưới đây1
2
3
4
5
6# Đầu tiên là xem lại toàn bộ lịch sử commit
$ git reflog
# Từ các commit này, chọn rồi tạo branch mới
# ví dụ)git branch new-branch HEAD@{2}
$ git branch <tên branch> <commit>
Sự cố 13: Khi muốn thay đổi một phần nội dung commit
Khi có những typo nhỏ và muốn chỉnh sửa thì ko cần thiết phải tạo commit mới để sửa mà hãy tiến hành sửa lại luôn
1 | # Chỉ định commit muốn sửa lại |
Sự cố 14: Khi có conflict trong quá trình rebase
Khi không merge mà tiến hành rebase thì nếu có conflict, chắc hẳn là hoảng loạn rồi
1 | # Khi đang ở branch1 rồi rebase từ branch2 vào |
Sự cố 15: Khi đã merge nhưng lại muốn trở lại như lúc trước
Chỉ cho trường hợp mà người khác vẫn chưa pull code về1
2
3
4
5
6
7# tiến hành merge
$ git checkout <tên brach nguồn>
$ git merge <tên branch muốn merge>
# Sau khi merge, nhưng lại muốn trở lại như trước thì làm như sau
# Nếu chỉ định là ORIG_HEAD thì có thể trở lại trạng thái trước khi merge
$ git reset --hard ORIG_HEAD
Ở trên Remote
Sự cố 16: Khi pull từ remote về thì có quá nhiều conflict nên tạm thời muốn trở lại như cũ
Sau khi pull code về cập nhật nhưng thấy conflict nhiều như núi thì quả là muốn trở lại như cũ Gần giống như sự cố 15
1 | # Lấy từ code mới remote |
Sự cố 17: Lỡ tay push force lên master trên remote
Việc push -f lên origin/master là việc bị cấm Tuy nhiên thì thỉnh thoảng vẫn có một số người làm…
Ta sẽ sửa lại như sau
Trường hợp chỉ cần push về 1 commit trước đó
1 | # Cái này ko được làm đâu nhé, push force |
Nếu trên local cũng muốn như vậy thì tiến hành reset cũng tốt1
2$ git reset HEAD~
$ git push -f origin master
Nếu muốn xoá đi vài commit trước đó
1 | # Cái này ko được làm đâu nhé, push force |
Sự cố 18: Sau khi release phát hiện thấy có bug và muốn trở về như cũ
Do phát sinh thiệt hại nên những thứ đã merge và maste cần phải chuyển tạm thời về như cũ Tuy nhiên không thể revert từng commit 1 nếu có nhiều commit1
2
3
4
5
6
7
8
9
10
11
12
13
14
15# Kiểm tra commit log
$ git log --oneline --graph
====
* 1x3y5z7 - Merge pull request #4 from develop
|\
| * a2b45c7 - (develop) commit 3
* | dbc65f4 - commit 2
* | f0b0a91 - commit 1
# Chỉ định điểm muốn revert về (Cơ bản 1 là OK)
====
# Nếu merge develop vào master thì chỉ định master sẽ là 1、develop là 2 rồi revert
# Ví dụ)git revert -m 1 1x3y5z7
$ git revert -m 1 commit merge>
Nếu vẫn chưa có ai kéo phần code này về thì có thể làm đươc cả những việc sau nữa(Cái này nguy hiểm)
1 | # Trở về trạng thái trước khi merge |
Sự cố 19:Khi sau khi chuyển lại và đã commit thêm một số commit mới nhưng không thể merge lại được
Ở sự cố 18, khi đã xoá bỏ merge, tiến hành chỉnh sửa nhưng merge lại không được
commit revert không có nghĩa là sẽ ko còn commit merge nữa mà là làm ngược lại những việc mà commit merge làm
Thế nên, khi merge lại thì cần phải revert lại commit revert
1 |
|
Đây là bài viết được copy từ: techtalk với mục đích note nhai dần không có ý ăn cắp! :D