Hướng dẫn git cơ bản
Mục tiêu chính của Git là quản lý một dự án hoặc một tập hợp các tệp khi chúng được người dùng thay đổi theo thời gian. Git lưu trữ thông tin này trong cấu trúc dữ liệu gọi là kho Git. Kho lưu trữ là cốt lõi của Git. Bạn có thể hiểu rằng kho lưu trữ Git là thư mục chứa tất cả các file dự án của bạn và các kiểu dữ liệu khác liên quan. Git ghi nhận tất cả các thay đổi của dự án (các hành động thêm, xóa, sửa), mỗi khi có bất kỳ sự thay đổi nào Git sẽ tự động ghi vào kho lưu trữ của mình dưới dạng các thông tin theo cây thời gian thời gian đối với mỗi file và đánh dấu cho mỗi thay đổi là một phiên bản. Từ đó bạn có thể quản lý các phiên bản code của mình, có thể chuyển đổi giữa các phiên bản theo nhu cầu. Bạn có thể xem hình minh họa bên dưới để hiểu rõ hơn về Git: Bây giờ bạn đã hiểu sử dụng Git nhằm mục đích gì, chúng ta hãy tiếp tục với thao tác làm việc với Git bằng các lệnh phổ biến Hướng dẫn sử dụng Git - Thao tác cơ bản bằng dòng lệnh và hành động nâng cao trong Git:Một số thao tác cơ bản trong Git là: 1. Init 2. Add 3. Commit 4. Pull 5. Push Một số hành động nâng cao trong Git là: Trước tiên khi đi vào từng nội dung, chúng ta hãy tìm hiểu về kiến trúc và cách thức hoạt động của kho Git. Hãy xem sơ đồ của Git dưới đây: Dựa vào các hướng dẫn dưới đây khi sử dụng từng dòng lệnh cơ bản của git và sơ đồ trên tôi sẽ giải thích để bạn có thể nắm được nguyên lý hoạt động cơ bản của Git. Nhưng trước hết, bạn cần cài đặt Git trên hệ thống của mình trước. Nếu bạn cần hướng dẫn với việc cài đặt, để xem lại kiến thức bài trước nha. Điều này sẽ mở ra một cửa sổ dòng lệnh Git Bash nơi bạn có thể nhập các lệnh bắt đầu từ dấu $ để thực hiện các hoạt động Git khác nhau. Bây giờ, nhiệm vụ tiếp theo là khởi tạo kho lưu trữ của bạn.
Khi kết thúc dòng lệnh kho lưu trữ của bạn đã được khởi tạo, việc tiếp theo chúng ta hãy tạo một số tệp trong thư mục / kho lưu trữ. Ví dụ: tôi đã tạo hai tệp văn bản là aptechbmt-1.txt và aptechbmt-2.txt bằng cách sử dụng lệnh touch sau đó liệt kê danh sách các tệp trong thư mục hiện hành bằng lệnh dir Bây giờ hãy xem liệu các tệp này đã có trong chỉ mục của tôi hay không bằng cách sử dụng lệnh git status . Chỉ mục ở đây là gì? Chỉ mục giữ một ảnh chụp nhanh "snapshot" nội dung của cây / thư mục làm việc và ảnh chụp nhanh này được lấy làm nội dung cho phiên bản tiếp theo được thực hiện trong kho lưu trữ cục bộ. Để dễ hình dung, sau khi khởi tạo kho lưu trữ git, phiên bản đầu tiên của chúng ta chưa có gì đúng không? Khi chúng ta thêm 2 tập tin mới như trên, nghĩa là kho lưu trữ của chúng ta đã có sự thay đổi. Do đó phiên bản thứ 2 sẽ chứa ảnh chụp nội dung thay đổi (thêm 2 file mới) đó. ^^
Kết quả cho thấy kho lưu trữ của tôi hiện có hai tệp chưa được thêm vào để lập chỉ mục nội dung. Điều này có nghĩa là tôi không thể cam kết "commit" các thay đổi với các tệp này.
hoặc là
Hãy để tôi chứng minh lệnh git add cho bạn để bạn có thể hiểu nó tốt hơn. Tôi sẽ lập chỉ mục nội dung thay đổi của kho cho các tập tin bằng lệnh git add -A . Lệnh này sẽ thêm tất cả các tệp vào chỉ mục trong thư mục nhưng chưa được cập nhật trong chỉ mục. Bây giờ các tệp mới được thêm vào và lập chỉ mục nội dung, bạn đã sẵn sàng để commit chúng. Ở đây, C1 là commit ban đầu, tức là ảnh chụp nhanh của thay đổi đầu tiên mà từ đó một ảnh chụp nhanh khác được tạo với các thay đổi có tên là C2. Lưu ý rằng bản gốc master (Head) sẽ trỏ đến commit mới nhất.
Hoặc bạn có thể sử dụng:
Thử xem sao nhé Như bạn có thể thấy ở trên, lệnh git commit đã cam kết các thay đổi trong hai tệp trong kho lưu trữ cục bộ.
Bây giờ tôi sẽ tạo thêm hai tệp văn bản trong thư mục làm việc của tôi là aptechbmt-3.txt và aptechbmt-4.txt và chỉnh sửa một chút đối với file aptechbmt-1.txt bằng cách thêm nội dung cho nó. Lưu ý: tất cả các file này đều chưa được thêm vào để lập chỉ mục nội dung.
Lúc này tôi chỉ thêm aptechbmt-3.txt vào chỉ mục còn aptechbmt-4.txt thì không. Bây giờ, tôi muốn commit tất cả các thay đổi trong thư mục cùng một lúc. Tham khảo cách làm bên dưới. Lệnh này sẽ commit một ảnh chụp nhanh về tất cả các thay đổi trong thư mục làm việc nhưng chỉ bao gồm các sửa đổi đối với các tệp được theo dõi, tức là các tệp đã được thêm bằng git add tại một số điểm trong lịch sử của chúng. Do đó, aptechbmt-4.txt không được commit vì nó chưa được thêm vào chỉ mục. Nhưng những thay đổi trong tất cả các tệp trước đó trong kho lưu trữ đã được cam kết. Ví dụ: aptechbmt-1.txt, aptechbmt-2txt, aptechbmt-3.txt. Bây giờ tôi đã thực hiện các commit mong muốn của mình trong kho lưu trữ cục bộ của tôi.
Trong đó để có đường dẫn liên kết đến kho lưu trữ trung tâm thì trên GitHub bạn phải tạo cho mình một kho lưu trữ (Cách tạo xem lại bài này nhé). Ở đây: tôi sử dụng kho lưu trữ từ xa tại địa chỉ này: https://github.com/aptechbuonmathuot/tu-hoc-git Đầu tiên tôi sử dụng lệnh git remote -v để kiểm tra xem mình đã cấu hình tới các máy chủ từ xa nào, nó sẽ liệt kê tên của mỗi máy chủ từ xa kèm theo đường dẫn. Nếu bạn đã thực hiện sao chép từ một kho chứa có sẵn về kho lưu trữ cục bộ của mình, thì ít nhất bạn sẽ thấy bản gốc (origin) - đây là tên gọi mặc định mà Git đặt cho phiên bản trên máy chủ mà bạn đã sao chép từ đó bạn có thể đặt tên khác cho nó để dễ nhớ hơn. Ở ví dụ này, trước đây tôi chưa từng thực hiện việc kết nối tới một kho lưu trữ từ xa nào, nên để thực hiện thì việc đầu tiên tôi phải thiết lập kết nối với kho lưu trữ từ xa bằng lệnh git remote add
Lệnh này sẽ sao chép tất cả các tệp từ nhánh chính master của kho lưu trữ từ xa vào kho lưu trữ cục bộ của bạn. Việc này sẽ hoàn toàn diễn ra suôn sẻ nếu kho lưu trữ cục bộ của bạn và kho lưu trữ từ xa có lịch sử cam kết khớp nhau. Còn trong trường hợp này Git báo lỗi "fatal: refusing to merge unrelated histories" . Để tôi giải thích lỗi này cho bạn hiểu: Lỗi này thường xảy ra do 2 nguyên nhân: 0Lệnh này được hiểu như chúng ta sẽ hợp nhất tất cả các commit trên kho lưu trữ từ xa về kho lưu trữ cục bộ một cách bắt buộc (Nhiều khi ép mới chịu làm ^^) và mặc định Git sẽ tạo ra một commit thông báo về việc hợp nhất này, nên sau khi bạn kết thúc dòng lệnh trên Git sẽ hiển thị cửa sổ cho phép chúng ta chỉnh sửa nội dung commit. Bạn có thể chỉnh sửa chỗ dòng chữ màu vàng nhé. Kết quả: Sử dụng lệnh git log --oneline để xem nhanh lịch sử commit trên máy tính cục bộ đã thay đổi thế nào Như bạn thấy, các commit của kho lưu trữ từ xa đều được ghép vào kho lưu trữ cục bộ của mình. Trong đó, có 1 commit trên cùng "Merge branch 'master' ... " được tạo thêm. Ngoài ra, bạn có thể kiểm tra lại ngoài Windows Explorer để thấy các file trên kho lưu trữ từ xa cũng sẽ được tải về lưu trữ tại máy tính nhé. Lưu ý: Bạn chỉ thực hiện điều này, khi thực sự hiểu rõ về lịch sử commit của 2 kho lưu trữ nhé. Ngoài ra, chúng ta cũng có thể thử kéo các tệp từ một nhánh khác bằng lệnh sau: 1Như vậy, chúng ta vừa lấy các nội dung từ kho lưu trữ từ xa về thành công. Vậy làm cách nào để đẩy ngược lại dự án của mình ở cục bộ lên kho lưu trữ từ xa? Hãy tiếp tục bằng cách sử dụng lệnh Push dưới đây. 2Lưu ý : Điều khiển từ xa này đề cập đến kho lưu trữ từ xa đã được cấu hình ở trên trước khi sử dụng lệnh pull. Lưu ý: Nếu khi bạn thực hiện mà mắc lỗi như bên dưới. Lỗi này xảy ra khi quyền truy cập kho lưu trữ từ xa của bạn chưa được cấp do tài khoản đang sử dụng không được truy cập vào kho lưu trữ này. Để khắc phục bạn nên đăng nhập lại bằng cách, truy cập vào Control PanelAll Control Panel ItemsCredential Manager tại tab Windows Credential tìm tài khoản GitHub đã được lưu trước đây và xóa nó đi. Sau đó chạy lại lệnh git push,tiến hành làm theo hướng dẫn bên trên là được. Như vậy, file aptechbmt-4.txt ở dưới kho lưu trữ cục bộ sẽ không được đẩy lên kho lưu trữ từ xa vì nó chưa được thêm vào để lập chỉ mục nội dung bằng git add. Các file và lịch sử commit đều đã được đẩy lên thành công. 3Lệnh trên buộc phải push ngay cả khi nó dẫn đến kết hợp chuyển tiếp không nhanh. Hướng dẫn các hoạt động nâng cao với GitGit branch: Các nhánh trong Git không có gì ngoài con trỏ đến một cam kết cụ thể. Git thường thích giữ các nhánh của nó càng nhẹ càng tốt. Về cơ bản có hai loại là local branches và remote tracking branches.
Bạn có thể kiểm tra nhánh hiện tại của bạn bằng cách sử dụng lệnh: 4Một câu thần chú mà bạn nên luôn luôn tụng trong khi phân nhánh ^^ 5Sơ đồ dưới đây cho thấy quy trình làm việc khi một nhánh mới được tạo. Khi chúng ta tạo một nhánh mới, nó sẽ bắt nguồn từ nhánh chính. Ghi chú: dấu * để chỉ Head đang trỏ tới commit tương ứng của nhánh đó, trên sơ đồ Head của nhánh master đang trở tới commit C2, khi tạo nhánh newBranch thì Head của 2 nhánh master và newBranch đều trỏ đến commit C3
Bây giờ, chúng ta hãy xem làm thế nào để commit khi sử dụng các nhánh. Sự phân nhánh bao gồm một cam kết cụ thể cùng với tất cả các cam kết cha. Như bạn có thể thấy trong sơ đồ trên, newBranch đã tách ra khỏi bản gốc và do đó sẽ tạo ra một đường dẫn khác. 6Lệnh này giúp chuyển đổi sang một nhánh khác, mặc định chúng ta đang ở master. Ở đây, tôi đã tạo ra một chi nhánh mới có tên là aptechbmtdev, và chuyển sang nhánh mới bằng cách sử dụng lệnh git checkout. 7Lệnh này sẽ tạo ra một nhánh mới và chuyển sang nhánh đó cùng một lúc. Tuy nhiên tại phiên bản tôi đang sử dụng là git version 2.24.0.windows.2 thì lệnh này không hoạt động nhé T T. Hình ảnh dưới đây mô tả quá trình tạo branch và checkout branch, hãy để ý các ô màu đỏ và trắng để nhận ra sự khác biệt nhé. Bây giờ trong khi chúng ta đang ở trong nhánh aptechbmtdev, hãy commit tệp văn bản aptechbmt-4.txt bằng các lệnh sau: 8Kiểm tra lịch sử commit bằng lệnh dưới để xem kết quả: 9Nhìn ảnh trên, bạn sẽ thấy mình đang ở branch aptechbmtdev để kiểm tra lịch sử commit, con trỏ Head (hiểu nôm na là ngọn ^^) của nhánh này đang trỏ tới commit cuối cùng của nhánh. Hình ảnh trên mô tả quá trình checkout qua lại giữa các branch, tương ứng phần hiển thị bên tay trái là thư mục làm việc cũng có sự thay đổi về số lượng file. 0Lệnh này sẽ đẩy toàn bộ nhánh aptechbmtdev (bao gồm các file và commit của nhánh) lên kho lưu trữ từ xa mà chúng ta đã thực hiện bên trên. Bạn hãy kiểm tra lại trên kho lưu trữ của mình đã có thêm file aptechbmt-4.txt và commit của nó không nhé! Biểu đồ trên cho chúng ta thấy hai nhánh khác nhau giữa newBranch và master. Bây giờ, khi chúng ta hợp nhất công việc của nhánh newBranch (C3) sang nhánh master (C1,C2,C4) nó sao chép tất cả công việc (commit) của newBranch vào master (C1,C2,C3,C4) và tạo ra một commit mới (C5) trên cùng cây. Lúc này, con trỏ Head Master sẽ trỏ đến C5. Câu lệnh hợp nhất 2 nhánh như sau: 1Lưu ý: Bạn phải checkout nhánh đích (là nhánh mà bạn muốn hợp nhất vào) như sơ đồ trên khi hợp nhất newBranch vào master bạn phải checkout master. 2Sử dụng lệnh git log --oneline --all để kiểm tra lịch sử commit Như bạn có thể thấy ở trên, tất cả dữ liệu từ nhánh aptechbmtdev được hợp nhất với nhánh master. Bây giờ, tệp văn bản aptechbmt-4.txt đã được thêm vào nhánh master. Bây giờ, các commit từ newBranch được đặt ngay sau nhánh chính và chúng ta có một chuỗi các cam kết tuyến tính nhìn đẹp hơn ^^ là merge. 3Lệnh này sẽ chuyển tất cả commit từ nhánh hiện tại sang nhánh master. Chúng trông như thể được phát triển một cách tuần tự, nhưng thực tế chúng lại được phát triển song song. 4Tiếp tục tôi lại checkout master và tạo mới 1 commit cho master. Mục đích là để trên nhánh master này có một commit mới hơn trên nhánh aptechbmthotfix 5Sau khi thực hiện các lệnh trên tôi sử dụng lệnh git log để kiểm tra lịch sử commit (dạng cây) bao gồm tất cả các branch từ đầu đến giờ. Lưu ý: Head sẽ trỏ đến commit mới nhất của nhánh hiện tại bạn đang checkout. 6Bạn để ý hiện tại commit của nhánh master có số hiệu d739a1c đang đúng trên cùng và commit của nhánh aptechbmthotfix có số hiệu 4e5b0a0 đang ở ngay bên dưới. Bây giờ, tôi sẽ checkout aptechbmthotfix và thực hiện rebase master bằng lệnh: |