post-image

Một số các tình huống hay gặp khi làm việc với Git

Tổng quan

Mình đã giới thiệu tới mọi người Git là gì và một số các câu lệnh Git hay dùng và phù hợp cho người mới học. Ở bài viết này mình sẽ nêu lên một số các tình huống thường gặp khi làm việc với Git khiến chúng ta tốn rất nhiều thời gian để chỉnh sửa.

Các tính huống liên quan đến branch

1. Xóa một branch

  • Ví dụ chúng ta muốn xóa một branch có tên là dev ở trên local thì có một số các lưu ý như sau:
    • Nếu bạn đang ở nhánh dev thì cần phải checkout sang nhánh khác để xóa ví dụ checkout sang nhánh master bằng câu lệnh git checkout master
    • Nếu bạn không ở nhánh dev hay đã chuyển sang nhánh khác thì thực hiện câu lệnh git branch -D dev để xóa nhánh dev
  • Còn nếu như bạn muốn xóa một branch trên remote thì chúng ta sẽ sử dụng câu lệnh quen thuộc là git push những với cấu trúc như sau: git push origin –delete dev
  • Để xóa tất cả các branch ở local chúng ta sử dụng câu lệnh như sau: git branch | grep -v “master” | xargs git branch -D

2. Khôi phục một branch đã bị xóa

  • Giả sử chúng ta có một nhánh tên là dev và không may xóa mất nó khi chưa merge vào master. Vậy làm thế nào để có thể khôi phục lại nhánh này ?
  • Chúng ta có 2 cách để có thể khôi phục một branch đã bị xóa đi nhưng trước tiên các bạn cần phải sử dụng lệnh: git reflog để kiểm tra lịch sử reflog:
    • Quay lại thời điểm mà chúng ta mong muốn (trước khi xóa một branch) bằng câu lệnh git hard reset
    • Lấy lại lịch sử commit dựa trên reflog bằng câu lệnh cherry-pick <id-commit>

3. Đặt sai tên branch

  • Nếu bạn đặt sai tên branch và muốn đổi lại tên branch đó ví dụ như bạn muốn tạo một branch là dev và đặt nhầm thành sev và muốn đổi lại thì cấu trúc câu lệnh sẽ như sau:
    • Ví dụ nếu bạn đang ở một branch khác giả sử là master thì chúng ta chỉ cần sử dụng câu lệnh sau: git branch -m sev dev
    • Nếu bạn đang ở nhánh sev và muốn đối thành dev thì câu lệnh sẽ như sau: git branch -m dev
  • Đó là cách sửa dưới local, còn nếu như các bạn muốn sửa trực tiếp trên remote thì câu lệnh sẽ như sau: git push <remote> <remote>/<old_name>:refs/heads/<new_name> :<old_name>

4. Tìm kiếm branch

  • Khi bạn phát hiện ra một id commit lỗi, bạn cũng có thể muốn biết tất cả các branch chứa commit này trên chúng từ đó bạn tìm và sửa tất cả chúng. Nếu kiểm tra lịch sử của mỗi branch là không thực tế trong một dự án lớn có nhiều branch.
  • Để liệt kê các nhánh có id commit đó bạn sử dụng lệnh như sau: git branch –contains <commit-id>

5. Không checkout được sang nhánh khác

Nhiều trường hợp, có những file chẳng biết nó từ đâu, hoặc lúc mới đầu import project sẽ thấy rất nhiều file mà mình không làm cách nào có thể xử lý được cũng như không thể checkout được sang nhánh khác.

Các tình huống liên quan đến commit

1. Chỉnh sửa commit cuối cùng

Khi bạn thực hiện commit xong, nhưng nội dung commit sai hoặc bạn muốn thay đổi nội dung khác. Bạn thực hiện lệch sau: git commit –amend

2. Thay thế commit mới nhất bằng một commit khác

Khác với tùy chọn ‘mixed’ tùy chọn ‘–soft’ chỉ cần xóa các tệp đã commit khỏi kho lưu trữ cục bộ “local repository” trong khi chúng vẫn được giữ lại trong chỉ mục “stagging area” và bạn có thể thực hiện cam kết lại chúng sau khi xem xét.

Tương tự <commit-id> là sha-1 của ảnh chụp nhanh mà bạn muốn xóa khỏi local repo và <HEAD ~ n> trong đó n là số thứ tự commit như đã nói ở trên.

Ví dụ: Bạn tạo ra 2 file mới là demo1.txt và demo2.txt, lúc đầu bạn thực hiện commit cho cả 2 file cùng lúc. Nhưng sau đó bạn lại muốn thực hiện commit lại cho từng file mà không thay đổi nội dung file, thì bạn làm theo cách sau: git reset –soft [<commit-id>/HEAD~n>]

3. Revert commit hiện tại

Sử dụng cho việc ghi lại một số commit để đảo ngược tác dụng của một số commit trước đó: git revert

Xóa một file đã được push lên remote

  • Làm thế nào để xoá tận gốc file mà nó đã từng commit và push lên server, file đó lại ở nhiều nhánh nữa.
  • Ví dụ: Chúng ta có 2 branch: master, dev và file readme.MD. File này đều có ở cả 2 branch và đã được commit push lên remote vậy làm thế nào để xóa được nó ở các branch. Chúng ta sẽ thực hiện như sau:
    • Để xóa ở local chúng ta sẽ sử dụng lệnh: git filter-branch –force –index-filter \
      “git rm –cached –ignore-unmatch <path_of_file>” \
      –prune-empty –tag-name-filter cat — –all
    • Để xóa ở remote chúng ta sẽ sử dụng lệnh sau: 
      git push origin –force –all

Xóa nhiều file trong một nhánh

Giả sử chúng ta muốn xóa một folder của dự án trên nhánh master chúng ta sẽ sử dụng lệnh sau các lệnh như sau:

  • git checkout master: để chắc chắn bạn đang ở nhánh master
  • git rm -r folder-name: để xóa một folder
  • git commit -m “Remove duplicated directory”: commit lại thao tác xóa vừa thực hiện
  • git push origin master: push những thay đổi lên trên remote

Xảy ra conflict khi làm việc nhóm

Khi bạn làm việc teamwork thì việc xảy ra conflict là khá thường xuyên. Nó xảy khi khi bạn rebase code từ một branch khác.

Các bước để thực hiện sửa conflict như sau: Ví dụ: bạn có branch developer_conflict, bạn thực hiện rebase một branch khác sau khi thực hiện lệnh này đã xảy ra conflict

  • Bạn kiểm tra các file bị conflict:git status
  • Tìm đến từng file bị conflict và sửa chúng. Lưu ý rằng, khi làm việc teamwork bạn cần phải hỏi những người có liên quan đến phần đó để thực hiện chỉnh sửa cho đúng, tránh việc xóa nhầm gây mất code.
  • Thêm lại các file sửa đổi vào commit: git add .
  • Tiếp theo thực hiện lệnh: git rebase –continue

Nếu có vấn đề gì xảy ra trong quá trình rebase thì bạn có thể hủy quá trình rebase bằng lệnh: git rebase –abort

Hoặc có những file thay đổi chưa được thêm trong branch đó, bạn cần thêm lệnh sau để tránh mất code: git rebase –skip

  • Sau đó thực hiện commit: git commit –amend
  • Cuối cùng là push lên server: git push origin <tên branch> -f

Leave a Reply

Your email address will not be published.