Trong bài viết này mình muốn chia sẻ một ít kinh nghiệm về những vấn đề gặp phải khi thao tác với GIT
Bắt đầu thôi nào (go) !!
Nhiều bạn có thể gặp trường hợp khi dùng một số thao tác với git như git reset
, git gì gì đó
làm cho mất commit ở nhánh hiện tại. Ví dụ như trong trường hợp này : Mình mới commit xong, git log --oneline
sẽ ra như thế này:
Nhưng sau khi đi vệ sinh một chút thì có thằng bạn nghịch dại và khi git log --oneline
lại thì nó như thế này:
Việc đầu tiên mình làm cho thằng bạn đó một trận rồi mở các bí kíp về git ra xem có khôi phục lại được code không?? (TT) Sau khi tìm hiểu thì mình đã biết được, một khi đã commit rồi thì sẽ không bị mất code nữa Khi commit thì github sẽ lưu lại commit, kể cả khi xóa nhánh chứa commit đó thì cũng không bị mất (Đây là một câu hỏi trong phỏng vẫn đó, bạn nào chưa biết thì lưu lại nhé, ắt sẽ có lúc dùng =))) Bạn có thể tưởng tượng là commit
giống như những gói tin, còn branch
có nhiệm vụ xâu chuỗi các gói tin đó theo một trật tự nhất định
Đầu tiên, hãy xem lịch sử thay đổi github local của bạn bằng git reflog
hoặc git reflog | grep some_thing
, phần some_thing
sẽ là những gì liên quan đến commit mà bạn muốn xem ví dụ như mã ticket.
Copy phần commit_hash(mã commit)
bạn muốn quay trở lại; trong trường hợp này là mã abe794a
có commit Fixed #013
.
Cuối cùng kết liễu bằng lệnh git reset --hard commit_hash
, sử dụng git log --oneline
để kiểm tra kết quả nhé. git reset --hard abe794a
Tèn tén ten, kết quả cuối cùng là vừa được đấm thằng bạn, vừa bá git.
Bạn đã bao giờ gặp trường hợp ticket của mình đang trong phiên bản ví dụ như tháng 12, nhưng do spec của khách hàng thay đổi nên đấy sang version tháng 1,…. Và khi base với nhánh tháng 1 thì có chuyện xảy ra (TT). Khi base với nhánh branch_122017
Khi base với nhánh branch_012018
Do có quá nhiều commit không trùng nhau nên (TT)
Sơ đồ mô tả:
Tư tưởng của việc này là chuyển commit của bạn sang base với một nhánh mới. Thật ra số commit bị conflict
kia phần lớn là của 2 nhánh base bị conflict với nhau; việc cần làm bây giờ là chuyển commit của bạn lên trên cùng của nhánh base mới Trong trường hợp này, mình có 2 cách giải quyết. Nhưng trước hết, bạn phải lưu lại commit_hash
cần chèn vào đã đã, nó là 9e05cab
Cách 1: Sử dụng branch hiện tại
branch
hiện tại, mình reset --hard
về commit cũ cũ từ ngày trước, commit này là commit chung của cả 2 nhánh mà bạn muốn thay đổi. Nhìn trên hình đó là commit c1664c2
hoặc có thể cũ hơn . git reset --hard c1664c2
conflict
về code giữa hai 2 nhánh. git rebase branch_0118
cherry-pick commit_hash
để lấy commit đó. git cherry-pick 9e05cab
git log --oneline
xempush -f
lại lên github là OKCách 2: Sử dụng nhánh mới trùng tên
git branch -D branch_name
. git branch -D fix_021
checkout
về nhánh muốn base (branch_012018
), tạo một nhánh mới trùng tên với branch
vừa xóa. git checkout -b branch_name
. git checkout -b fix_021
cherry-pick commit_hash
. git cherry-pick 9e05cab
git log --oneline
push -f
lên là lại OK ngayBạn lại có khi nào gặp trường hợp khi pull của mình có nhiều hơn 1 commit, mà đại ca leader yêu cầu chỉ được 1 pull 1 commit (TT), vào lúc đó “người nông dân” biết phải làm sao ???
git log --oneline
Sau khi ôn luyện vài khóa mastering GIT (len) thì có 2 cách để giải quyết
Cách 1: Sử dụng rebase -i
Đầu tiên, sử dụng git rebase -i HEAD~n
cũng với n
là số commit bạn muốn tổng hợp, trong trương hợp này n = 3
.
Sau đó đổi pick
thành s
với s
là squash
:
Sau khi save lại sẽ hiển thị cửa sổ tên commit
Tiếp theo bạn chỉ việc thêm dấu # vào trước commit bạn không muốn giữ tên, save lại
Kiểm tra lại bằng git log --oneline
push -f
rồi kiểm tra lại trên github
Very ez =))
Cách 2: Sử dụng reset
Sử dụng git reset --soft HEAD~n
với n
là số commit bạn muốn tổng hợp (n = 3
), kiểm tra lại bằng git log --oneline
Kiểm tra trạng thái git status
, file thay đổi đã nằm trong staging
Sau đó bạn chỉ việc git commit -m "commit name"
lại là được. Commit này là commit mới của branch, không liên quan gì đến các commit trước Kiểm tra bằng git log --oneline
tiếp nào
Dùng push -f
rồi kiểm tra trên github thi sao ??
BÁ RỒI (y) Nhìn 2 cách trên thì bạn có thể thấy là cách nào nhanh hơn rồi đấy, mình thì minh chọn cách 1 =))
commit --amend
: nạp chồng commit sau lên commit trước (Dùng để đổi tên commit)git stash
: lưu việc đang làm vào 1 stash, khi cần lấy ra dùng lệnh git stash pop
git diff
: kiểm tra sự thay đổi so với commit trước (kiểm tra khi chưa commit)git show
: kiểm tra sư thay đổi so với commit trước (kiểm tra sau khi commit mới)git checkout -f
: loại bỏ các file đã thay đổi, giống như git stash nhưng sẽ không lưu vào đâugit blame file_name
: kiểm tra người cuối cùng đã thay đổi trong file theo từng dònggit config --list
: kiểm tra thông tin local của người dùngCó thể tham khảo thêm ở Đến cả con khỉ cũng biết GIT
conflict
codeappprove
thì bạn có hãy sử dụng 2 cách tổng hợp commit trên của mình để trở thành 1 pull nhéBug...
, Fixed ...
hoặc làm tính năng mới thì Task ...
, Feature...
; còn tiếp theo là mã ticket
, cuối cùng là nội dung chỉnh sửa
-> Giúp quản lý pull về sau dễ dàng hơn khi sử dụng git log --oneline
sẽ theo dõi được sự thay đổi cũng như nội dung thay đổiNguồn: DEVMASTER sưu tầm từ internet via Viblo