Sử dụng git
19-11-2020
Git có thể không đi kèm với hệ điều hành của bạn. Nhưng nếu bạn đang sử dụng một hệ điều hành thuộc họ Linux, có thể máy bạn đã có sẵn git
Đối với Mac và Windows, bạn cần cài đặt nó. Chỉ cần truy cập trang chủ của git (https://git-scm.com) và tải trực tiếp các phiên bản được dựng sẵn cho hệ điều hành của mình. Bạn có thể cài đặt phiên bản command line của git và bắt đầu sử dụng và thực hành các lệnh được thảo luận trong phần này. Ngoài ra còn có các gui-based git clients (ứng dụng git với giao diện đồ họa), nhưng với mục đích hoàn thành kỳ thi DEVASC, bạn nên tập trung vào việc dùng git với dòng lệnh.
Các lệnh git có hai loại khác nhau. Các lệnh tiêu chuẩn thân thiện với người dùng được gọi là "porcelain" và hoạt động bên trong phức tạp hơn của lệnh thao tác git được gọi là "plumbing". Về cốt lõi, git là một file system có nội dung được đánh địa chỉ. Phần hệ thống quản lý phiên bản đã được xếp ở lớp trên cùng để dễ sử dụng hơn. Đối với kỳ thi DEVASC, bạn cần biết cách sử dụng git ở cấp độ chức năng (bằng cách sử dụng porcelain). Có rất nhiều thao tác bạn có thể thực hiện với git ở cấp độ plumbing. Hầu hết các lệnh và công cụ về plumbing không phải là những lệnh bạn sẽ sử dụng thường xuyên và không được đề cập trong bài kiểm tra.
Clone / Khởi tạo một kho lưu trữ
Git hoạt động trên một số quy trình cho phép nó thực hiện điều kỳ diệu của nó. Quá trình đầu tiên của quy trình này liên quan đến việc xác định một kho lưu trữ cục bộ bằng cách sử dụng git clone hoặc git init. Lệnh git clone có cú pháp sau:
Ví dụ 2-3 : cloning một github repository: Để tạo một kho lưu trữ hoàn toàn mới, bạn cần tạo một thư mục. May mắn thay, git init có thể được cung cấp với một tên thư mục như một tùy chọn để thực hiện tất cả trong một lệnh:
Những gì bạn vừa tạo là một kho lưu trữ trống và bạn cần thêm một số tệp vào đó. Bằng cách sử dụng lệnh touch, bạn có thể tạo một tệp trống. Ví dụ sau cho thấy cách xem tệp mới tạo trong kho lưu trữ bằng lệnh liệt kê thư mục (ls):
Sau khi tệp được thêm vào, git thấy rằng có một cái gì đó mới, nhưng nó không làm được gì với nó vào thời điểm này. Nếu bạn nhập git status, bạn có thể thấy rằng git đã xác định tệp mới, nhưng bạn phải đưa ra một command khác để thêm nó vào chỉ mục để git thực hiện kiểm soát phiên bản trên đó. Đây là một ví dụ:
Git rất hữu ích và cho bạn biết rằng nó nhìn thấy tệp mới, nhưng bạn cần làm điều gì đó nữa để bật kiểm soát phiên bản trên file này và cho git biết để bắt đầu theo dõi nó.
Thêm và xóa files
Khi bạn đã hoàn tất thực hiện thay đổi đối với tệp, bạn có thể thêm chúng vào index. Sau khi file đã được thêm vào index, git sẽ biết nó cần bắt đầu theo dõi các thay đổi cho các tập tin này ngay sau đó. Bạn có thể sử dụng các lệnh sau để thêm tệp vào index:
git add . hoặc -A: thêm tất cả mọi thứ trong toàn bộ thư mục đang làm việc vào
git add (tên file): thêm 1 file bất kỳ vào
Lệnh git add sẽ thêm tất cả các tệp và thư mục được tạo mới hoặc đã bị xóa đi vào chỉ mục. Tại sao lại chọn có lệnh để thêm một tệp riêng lẻ khi ta đã có lệnh để thêm tất cả mọi thứ vào bằng git add . hoặc git add -A? Nó giúp bạn xác định chắc chắn những thay đổi mà bạn sẽ commit. Nếu bạn vô tình thực hiện thay đổi đối với tệp khác và commit mọi thứ, bạn có thể vô tình thực hiện những thay đổi không mong muốn đối với mã của mình và sau đó phải thực hiện khôi phục. Cụ thể luôn là an toàn nhất. Bạn có thể sử dụng lệnh sau để thêm một tệp mới tên là “newfile” vào index của git (trong một quá trình được gọi là staging):
Xóa tệp và thư mục ra khỏi git không đơn giản như việc chỉ xóa chúng khỏi chính thư mục đang chứa nó. Nếu bạn chỉ sử dụng các lệnh trên hệ thống để xóa tệp, bạn có thể gây đau đầu vì index có thể bị nhầm lẫn. Khi xóa các tệp và thư mục khỏi git, bạn phải làm thêm một bước là thêm tên các tệp mới bị xóa vào chỉ mục (nghe có vẻ phản trực giác, phải không?). Cách tốt nhất là sử dụng lệnh git rm, cú pháp như sau:
Lệnh này sẽ xóa một tệp hoặc thư mục rồi đồng bộ hóa nó với index của git chỉ trong một bước. Nếu bạn muốn xóa một thư mục không trống hoặc có các thư mục con, bạn có thể gắn thêm cờ -r để thực hiện xóa đệ quy. Ngoài ra, nếu bạn thêm một tệp vào git và sau đó quyết định rằng bạn muốn xóa nó, bạn phải gắn thêm cờ -f để buộc xóa nó khỏi index. Điều này chỉ bắt buộc nếu bạn chưa commit các thay đổi vào kho lưu trữ cục bộ. Đây là một ví dụ:
Git mv là lệnh mà bạn có thể sử dụng để di chuyển hoặc đổi tên tệp, thư mục hoặc symbolic link (symbolic link là một cấu trúc đặc biệt trong Linux hoạt động như shortcut trong Windows). Nó có cú pháp sau:
Đối với lệnh này, bạn cung cấp tham số nguồn và tham số đích để cho biết tệp hoặc thư mục nào bạn muốn thay đổi và nơi bạn muốn di chuyển nó (di chuyển trong trường hợp này có thể xem như đổi tên). Hãy nhớ rằng khi bạn sử dụng lệnh này, nó cũng cập nhật index cùng một lúc, vì vậy không cần chạy thêm lệnh git add để thêm thay đổi vào git. Bạn có thể sử dụng cờ -f nếu bạn đang cố gắng ghi đè các tệp hoặc thư mục đã tồn tại. Ví dụ sau cho thấy cách thay đổi tên tệp trong cùng một thư mục:
Commit files
Khi commit một tệp, tệp đó sẽ được di chuyển từ index hoặc vùng staging sang bản sao cục bộ của kho lưu trữ. Git không gửi đi toàn bộ những file được cập nhật; nó chỉ gửi những thay đổi. Lệnh commit được sử dụng để đóng gói những thay đổi đó để được đồng bộ hóa với kho lưu trữ cục bộ. Lệnh này rất đơn giản nhưng bạn có thể chỉ định rất nhiều tùy chọn và option. Ở dạng đơn giản nhất, bạn chỉ cần gõ git commit. Lệnh này có cú pháp sau:
Option -a yêu cầu git thêm bất kỳ thay đổi nào đã thực hiện đối với tệp của mình vào index. Đó là một phím tắt nhanh thay vì sử dụng git add -A, nhưng nó chỉ hoạt động với các tệp đã được thêm vào một thời điểm nào đó trước đó trong lịch sử của chúng; các tệp mới cần được thêm vào một cách rõ ràng để git có thể theo dõi. Đối với mỗi commit, bạn sẽ phải nhập vài chữ để mô tả về những gì đã thay đổi. Nếu bạn bỏ qua option -m, git sẽ tự động khởi chạy một trình soạn thảo văn bản (chẳng hạn như vi, là mặc định trên Linux và Mac) để cho phép bạn nhập văn bản cho thông báo commit của mình. Đây là cơ hội để mô tả những thay đổi mà bạn đã thực hiện để người khác biết bạn đã làm gì. Thật hấp dẫn khi gõ một cái gì đó ngớ ngẩn như “update” hoặc “new change for a quick commit”, nhưng đừng rơi vào cái bẫy đó. Hãy nghĩ về những người còn lại trong nhóm của bạn. Đây là một ví dụ về việc sử dụng lệnh commit trên thực tế:
Ghi chú
Như một thói quen tốt, dùng 50 ký tự đầu của commit làm tựa đề cho commit, tiếp theo đó là một dòng trống và sau đó là một đoạn thân bài chi tiết hơn về commit. Tựa đề này có thể được git sử dụng xuyên suốt trong các quá trình để tự động thông báo đến những thành viên khác, ví dụ như gởi một email mỗi khi có commit mới với tiêu đề là đường chủ đề và thông điệp chi tiết như phần thân bài.
Đẩy và kéo files (push and pull)
Cho đến thời điểm này của chapter, bạn đã thấy cách git hoạt động trên máy tính nội bộ của bạn. Nhiều người chỉ sử dụng git theo cách này, như một hệ thống kiểm soát phiên bản cục bộ để theo dõi tài liệu và tệp. Tuy nhiên, sức mạnh thực sự của nó nằm ở kiến trúc phân tán, cho phép các nhóm từ khắp nơi trên thế giới đến với nhau và cộng tác trong các project.
Để cho phép git sử dụng kho lưu trữ từ xa, bạn phải cấu hình git với một số thông tin để nó có thể tìm thấy những kho lưu trữ này. Khi bạn sử dụng lệnh git clone trên một kho lưu trữ, git sẽ tự động thêm thông tin kết nối kho lưu trữ từ xa thông qua url được nhập bằng lệnh clone.
Tuy nhiên, khi sử dụng lệnh git init, bạn cần bổ sung thông tin về kho lưu trữ từ xa để git có thể tìm được vị trí máy chủ bằng lệnh git remote add, có cú pháp sau
Git remote -v có thể được sử dụng để hiển thị các kho lưu trữ từ xa nào đã được cấu hình. Ví dụ sau cho thấy cách thêm một kho lưu trữ từ xa và sau đó hiển thị những gì được cấu hình
Điều gì sẽ xảy ra nếu bạn mắc lỗi hoặc muốn xóa kho lưu trữ từ xa ra khỏi repository của mình? Điều này có thể dễ dàng được thực hiện với lệnh git remote rm, có cú pháp sau:
Đây là một ví dụ về cách sử dụng lệnh này trên thực tế:
Để code của bạn có thể được chia sẻ với phần còn lại của nhóm của bạn hoặc với phần còn lại của thế giới, bạn phải yêu cầu git đồng bộ hóa kho lưu trữ cục bộ của bạn với kho lưu trữ từ xa (trên một máy chủ dùng chung hoặc một dịch vụ như github). Lệnh git push, có cú pháp sau, rất hữu ích trong trường hợp này:
Lệnh này cần một remote name, đó là một bí danh (alias) được sử dụng để xác định kho lưu trữ từ xa. Người ta thường sử dụng alias “origin”, là tên mặc định nếu tên khác không được cung cấp. Ngoài ra, bạn có thể thêm tên nhánh với git push để lưu trữ các tệp của bạn trong một nhánh khác, nhánh này sẽ được theo dõi riêng biệt so với kho lưu trữ chính (bạn có thể coi đây là một kho lưu trữ trong kho lưu trữ). Mục đích duy nhất của lệnh git push là chuyển các tệp của bạn và mọi bản cập nhật đến máy chủ git của bạn. Sau đây là một ví dụ về cách sử dụng lệnh git push:
Lệnh git pull đồng bộ hóa bất kỳ thay đổi nào trên kho lưu trữ từ xa và đưa kho lưu trữ cục bộ của bạn lên cùng cấp với kho lưu trữ từ xa. Nó có cú pháp sau:
Bất cứ khi nào bạn bắt đầu làm việc với git, một trong những lệnh đầu tiên bạn thường chạy là git pull để bạn có thể lấy mã mới nhất từ kho lưu trữ từ xa và làm việc với phiên bản mã mới nhất từ kho lưu trữ chính. Git pull thực hiện hai việc: tìm nạp phiên bản mới nhất của kho lưu trữ chính từ xa và kết hợp nó vào kho lưu trữ cục bộ. Nếu có xung đột, chúng sẽ được xử lý giống như khi bạn chạy lệnh git merge, sẽ được đề cập ngay sau đây. Ví dụ 2-4 cho thấy một ví dụ về việc sử dụng lệnh git pull.