Hướng dẫn tự học Git và Github từ cơ bản đến nâng cao
Hướng dẫn sử dụng Git   Các lệnh cơ bản cần phải biết   Aptech buôn ma thuột

Bài 4: Hướng dẫn sử dụng Git - Các lệnh cơ bản cần phải biết

Học Git có dễ như Github không? Tôi chắc chắn là có vì với bài viết hướng dẫn về Git này, bạn sẽ được học các khái niệm và thuật ngữ cơ bản của Git. Kết thúc bài này chắc chắn bạn sẽ tự quản lý được phiên bản code của mình ở local bằng giao diện dòng lệnh rất chuyên nghiệp ^^.

Trong bài Hướng dẫn sử dụng Git này, bạn sẽ học:

Các lệnh cơ bản trong Git
Hoạt động nâng cao khi làm việc với Git
Và một số mẹo và thủ thuật để quản lý dự án của bạn hiệu quả với Git.


Trước khi bắt đầu với các lệnh và hoạt động, trước tiên chúng ta hãy hiểu mục tiêu chính của Git.

Git ghi lại trạng thái hiện tại của dự án bằng cách tạo một biểu đồ cây từ chỉ mục. Nó thường ở dạng Đồ thị chu kỳ có hướng (Directed Acyclic Graph - DAG).

Trong Git các trạng thái được ghi lại thành những node và được gắn với nhau bằng mỗi mũi tên chỉ về phía trước theo thời gian
Trong Git các trạng thái được ghi lại thành những node và được gắn với nhau bằng mỗi mũi tên chỉ về phía trước theo thời gian.

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:

Git lưu trữ dữ liệu - Hướng dẫn sử dụng Git - Aptech Buôn Ma Thuột

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à:

1. Branch
2. Merge
3. Rebase 

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:

Kiến trúc Git - Hướng dẫn sử dụng Git - Aptech Buôn Ma Thuột

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.

Trong Hướng dẫn sử dụng Git này, để làm quen với các dòng lệnh tôi sẽ chỉ cho bạn làm việc với Git Bash. Git Bash là giao diện dòng lệnh (CLI) chỉ có văn bản để sử dụng Git trên Windows, cung cấp các tính năng để chạy các tập lệnh tự động.  Sau khi cài đặt Git trong hệ thống Windows của bạn, chỉ cần mở thư mục của bạn nơi mà bạn muốn lưu trữ tất cả các tệp dự án của mình; nhấp chuột phải và chọn 'Git Bash here '.

Mở Git bash - Hướng dẫn sử dụng Git - Aptech Buôn Ma Thuột

Đ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. 

Giao diện Git Bash - Hướng dẫn sử dụng Git - Aptech Buôn Ma Thuột

Bây giờ, nhiệm vụ tiếp theo là khởi tạo kho lưu trữ của bạn. 

Lệnh Git Init: git init tạo một kho Git trống hoặc khởi tạo lại một kho hiện có. Về cơ bản, nó tạo ra một  thư mục .git  với các thư mục con và các tệp mẫu. Chạy lệnh git init trong kho lưu trữ hiện tại sẽ không ghi đè lên những thứ đã có. Bây giờ để khởi tạo kho lưu trữ, bạn hãy gõ dòng lệnh tại cửa sổ Git bash vừa được mở ở trên:

git init
Git init - hướng dẫn sử dụng Git - Aptech Buôn Ma Thuột

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

Lệnh touch - Hướng dẫn sử dụng Git - Aptech Buôn Ma Thuột

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) đó. ^^

Lệnh Git Status : Lệnh git status  liệt kê tất cả các tệp đã bị sửa đổi, sẵn sàng để thêm vào kho lưu trữ cục bộ. Bạn hãy thử gõ:

git status
Git status - Hướng dẫn sử dụng Git - Aptech Buôn Ma Thuột

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.

Lệnh Git Add: Lệnh này giúp chúng ta cập nhật chỉ mục nội dung bằng cách sử dụng nội dung hiện tại được tìm thấy trong thư mục làm việc hiện hành "working directory" để lập chỉ mục nội dung mới, và sau đó sẵn sàng chuyển chỉ mục nội dung được lập này sang một khu vực khác được tổ chức cho lần cam kết "commit" tiếp theo gọi là "staging area". 

Quay trở lại sơ đồ mô tả quy trình làm việc của Git, rõ ràng là trước khi chúng ta thực hiện commit, thì nội dung chỉ mục của sự thay đổi trong kho được lưu trữ và luân chuyển từ khu vực working directory sang khu vực stagging area.

Như vậy, sau khi bạn thực hiện thay đổi bất kỳ đối với thư mục làm việc working directory và trước khi chạy lệnh cam kết "commit", bạn phải sử dụng lệnh add nhằm thêm file và lập chỉ mục nội dung thay đổi cho nó để tiếp tục chuyển sang lưu trữ tại stagging area chuẩn bị sẵn sàng cho commit. Để thực hiện hãy sử dụng các lệnh dưới đây:

git add <đường dẫn thư mục>

hoặc là

git add <đường dẫn file>

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. 

Lệnh Git add - Hướng dẫn sử dụng Git - Aptech Buôn Ma Thuột

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.

Lệnh Git Commit: Lệnh này được hiểu như là việc ghi lại các ảnh chụp nhanh "snapshot" của kho lưu trữ tại một thời điểm nhất định. Ảnh chụp nhanh đã được commit sẽ không bao giờ thay đổi trừ khi chúng ta có sự thay đổi trong kho lưu trữ một cách rõ ràng. Hãy để tôi giải thích cách commit hoạt động với sơ đồ dưới đây:

Git commit sơ đồ - Hướng dẫn sử dụng Git - Aptech Buôn Ma Thuột

Ở đâ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.

Bây giờ, khi tôi cam kết một lần nữa, một ảnh chụp nhanh C3 khác được tạo và bây giờ, bản gốc trỏ đến C3 thay vì C2.

Git nhằm mục đích giữ cho cam kết càng nhẹ càng tốt. Vì vậy, nó không sao chép một cách mù quáng toàn bộ thư mục mỗi khi bạn commit; nó lưu trữ bao gồm các commit như một tập hợp các thay đổi hoặc nó chuyển phiên bản của kho lưu trữ từ phiên bản này sang phiên bản khác mới hơn. Nói một cách dễ hiểu, nó chỉ sao chép những thay đổi được thực hiện trong kho lưu trữ. Bạn có thể commit bằng cách sử dụng lệnh dưới đây:

git commit

Hoặc bạn có thể sử dụng:

git commit -m <nội dung thông điệp cần lưu trữ>

Thử xem sao nhé

Lệnh Git commit - Hướng dẫn sử dụng Git - Aptech Buôn Ma Thuột

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ờ, nếu bạn muốn thực hiện một commit ảnh chụp nhanh tất cả các thay đổi trong thư mục làm việc cùng một lúc, bạn có thể sử dụng lệnh dưới đây:

git commit -a

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.

Tôi sẽ thêm file aptechbmt-3.txt bằng lệnh:

git add aptechbmt-3.txt

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.

git commit - Hướng dẫn sử dụng Git - Aptech Buôn Ma Thuột

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. 

Lưu ý rằng trước khi bạn tác động đối với kho lưu trữ trung tâm bằng cách thực hiện các thay đổi trong kho lưu trữ, bạn phải luôn luôn nhớ rằng nên thay đổi từ kho lưu trữ trung tâm sang kho lưu trữ cục bộ của mình trước, để kho lưu trữ cục bộ của mình được cập nhật mới nhất với kho lưu trữ cộng tác viên khác đã đóng góp trong kho lưu trữ trung tâm. Để luôn cập nhật kho lưu trữ cục bộ của mình từ kho lưu trữ trung tâm (ở đây là kho lưu trữ Git Hub) tôi sẽ sử dụng lệnh pull .

Lệnh Pull: Lệnh git pull tìm nạp các thay đổi từ kho lưu trữ từ xa sang kho lưu trữ cục bộ. Nó hợp nhất các thay đổi ở nguồn trong kho lưu trữ cục bộ của bạn, đây là một nhiệm vụ phổ biến trong việc cộng tác dựa trên Git.

Để làm được điều này, trước tiên bạn cần đặt kho lưu trữ trung tâm của mình làm gốc "origin" hay có thể hiểu là thiết lập kết nối giữa kho lưu trữ từ xa và kho lưu trữ cục bộ bằng lệnh:

git remote add origin <đường dẫn liên kết đến kho lưu trữ trung tâm của bạn>

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

Git Remote - Hướng dẫn sử dụng Git - Aptech Buôn Ma Thuột

Đầ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

Sau khi đã làm xong các bước chuẩn bị, bây giờ chỉ việc sử dụng dòng lệnh sau:

git pull origin master

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.

git pull - Hướng dẫn sử dụng git - Aptech Buôn Ma Thuột

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:
- Một là, bạn đã sao chép một dự án và bằng cách nào đó, thư mục .git đã bị xóa hoặc bị hỏng. Điều này dẫn đến việc Git không biết về lịch sử commit tại kho cục bộ của bạn và do đó sẽ khiến gây ra lỗi này khi bạn cố gắng đẩy hoặc kéo từ kho lưu trữ từ xa.
- Hai là, bạn đã tạo một kho lưu trữ mới và đã thêm một vài commit (từ đầu bài đến giờ ^^ mình thêm khá khá rồi nhỉ) và bây giờ bạn đang cố gắng lấy từ một kho lưu trữ từ xa đã có một số commit của riêng nó. Git cũng sẽ đưa ra lỗi trong trường hợp này, vì nó không biết hai dự án có liên quan như thế nào. Đây là trường hợp trong ví dụ này. Để khắc phục, rất đơn giản, bạn chỉ cần gõ lại lệnh sau:

git pull origin master --allow-unrellated-histories

Lệ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é.

Git pull 2 - Hướng dẫn sử dụng Git - Aptech Buôn Ma Thuột

Kết quả:

Git pull allow - Hướng dẫn sử dụng Git - Aptech Buôn Ma Thuột

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

git log - hướng dẫn sử dụng Git - Aptech Buôn Ma Thuột

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é.

Git pull 3 - hướng dẫn sử dụng Git - Aptech Buôn Ma Thuột

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:

git pull origin <tên nhánh cần pull>

Như 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.

Lệnh push: Lệnh này chuyển commit từ kho lưu trữ cục bộ của bạn sang kho lưu trữ từ xa. Nó là đối nghịch của lệnh pull.

Pull là để kéo các cam kết vào kho lưu trữ cục bộ trong khi Push là đẩy các cam kết vào kho lưu trữ từ xa.

Việc sử dụng git push là để xuất bản các thay đổi cục bộ của bạn lên một kho lưu trữ từ xa. Sau khi bạn tích lũy được một số cam kết cục bộ và sẵn sàng chia sẻ chúng với các thành viên còn lại trong nhóm, bạn có thể đẩy chúng vào kho lưu trữ từ xa bằng cách sử dụng lệnh sau:

git push <tên remote> 

Lư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.

Tôi sẽ sử dụng lệnh git push origin master để đẩy kho lưu trữ cục bộ này lên nhánh master của kho lưu trữ từ xa của tôi. Khi kết thúc dòng lệnh trên, Git sẽ xuất hiện cửa sổ thông báo bạn phải đăng nhập vào tài khoản Git Hub nếu như bạn chưa từng đăng nhập trước đây. Tài khoản này phải là chủ sở hữu kho lưu trữ từ xa hoặc phải được cấp quyền truy cập kho lưu trữ. Sau khi đăng nhập, kết quả sẽ như bên dưới:

Git push - Hướng dẫn sử dụng Git - Aptech Buôn Ma Thuột

Lưu ý: Nếu khi bạn thực hiện mà mắc lỗi như bên dưới.
 
Lỗi 403 khi push - Hướng dẫn sử dụng Git - Aptech Buôn Ma Thuột

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 Panel\All Control Panel Items\Credential 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.

Sau khi thực hiện lệnh git push thì các thay đổi từ kho lưu trữ cục bộ sang kho lưu trữ từ xa cùng với tất cả các commit cần thiết và các đối tượng bên trong. Điều này tạo ra một nhánh cục bộ trong kho đích. Bây giờ hãy kiểm tra trên kho lưu trữ từ có gì nhé!

Github sau khi push - Hướng dẫn sử dụng Git - Aptech Buôn Ma Thuột

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.

Để ngăn việc ghi đè, Git không cho phép push khi kết quả là hợp nhất chuyển tiếp không nhanh trong kho đích.

Lưu ý : Hợp nhất chuyển tiếp không nhanh có nghĩa là hợp nhất ngược dòng tức là hợp nhất với các nhánh tổ tiên hoặc các nhánh cha từ một nhánh con.

Để kích hoạt hợp nhất như vậy, sử dụng lệnh dưới đây:

git push <tên remote> -force

Lệ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.

Đến đây, với các lệnh cơ bản của Git chắc các bạn cũng đã hình dung được quy trình làm việc của git và github theo sơ đồ ở đầu bài này. Bây giờ, chúng ta hãy tiếp tục thực hiện các hành động nâng cao hơn.

Hướng dẫn các hoạt động nâng cao với Git

Git 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.

Local branch (nhánh cục bộ) chỉ là một nhánh rẽ khác trên cây làm việc của bạn. Mặt khác, các remote tracking branches (nhánh theo dõi từ xa) có các mục đích đặc biệt. Một số trong số chúng là:

  • - Chúng liên kết công việc của bạn từ kho lưu trữ cục bộ với công việc trên kho lưu trữ từ xa.
  • - Chúng tự động phát hiện các nhánh từ xa để nhận thay đổi, khi bạn sử dụng git pull .

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:

git branch

Một câu thần chú mà bạn nên luôn luôn tụng trong khi phân nhánh ^^

Để tạo một nhánh mới, tôi sử dụng lệnh sau:

git branch <tên chi nhánh>

Sơ đồ 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

Git Branch sơ đồ phân nhánh - Hướng dẫn sử dụng Git - Aptech Buôn Ma Thuột


Việc tạo nhánh sẽ giúp bạn phân chia và quản lý công việc được dễ dàng hơn. Thay vì, phải tạo một kho lưu trữ mới để phát triển một tính năng mới cho dự án đã có thì bạn có thể phân nhánh ngay trong kho lưu trữ dự án để thực hiện công việc này mà không ảnh hưởng gì tới nhánh chính master.

Bây giờ, chúng ta hãy xem làm thế nào để commit khi sử dụng các nhánh.

Commit phân nhánh - Hướng dẫn sử dụng Git - Aptech Buôn Ma Thuột

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.

git checkout <tên nhánh>

Lệ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.

Một phím tắt cho các lệnh trên là:

git checkout -b <tên nhánh>

Lệ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é.

Tạo branch - Hướng dẫn sử dụng Git - Aptech Buôn Ma Thuột

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:

git add aptechbmt-4.txt
git commit -m "Thêm aptechbmt-4.txt" 

Kiểm tra lịch sử commit bằng lệnh dưới để xem kết quả:

git log --all --oneline
Git log branch - Hướng dẫn sử dụng Git - Aptech Buôn Ma Thuột

Nhì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.

Git checkout branch - Hướng dẫn sử dụng Git - Aptech Buôn Ma Thuột

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.

Công việc tiếp theo của chúng ta là Push thay đổi vừa rồi lên kho lưu trữ từ xa. Đơn giản bằng cách thực hiện lệnh

git push origin aptechbmtdev

Lệ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.

push branch - Hướng dẫn sử dụng Git - Aptech Buôn Ma Thuột

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é!

Git merge: Hợp nhất "Merge" là cách kết hợp công việc của các nhánh khác nhau lại với nhau. Điều này sẽ cho phép chúng ta phân nhánh, phát triển một tính năng mới và sau đó kết hợp lại với nhánh gốc.

Git merge branch - Hướng dẫn sử dụng Git - Aptech Buôn Ma Thuột

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: 

git merge <tên nhánh cần hợp nhất vào>

Lư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.

Bây giờ, chúng ta hãy hợp nhất tất cả các công việc của nhánh aptechbmtdev vào nhánh master. Vì vậy, trước tiên tôi sẽ kiểm tra nhánh master bằng lệnh git checkout master và hợp nhất với aptechbmtdev với lệnh  git merge aptechbmtdev

git checkout master
git merge aptechbmtdev
Merge 2 branch - Hướng dẫn sử dụng Git - Aptech Buôn Ma Thuột

Sử dụng lệnh git log --oneline --all để kiểm tra lịch sử commit

Kiểm tra lịch sử commit - Hướng dẫn sử dụng Git - Aptech Buôn Ma Thuột

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.

Lệnh Rebase: Đây cũng là một cách kết hợp công việc giữa các nhánh khác nhau. Rebasing tạo một tập hợp các cam kết, sao chép chúng và lưu trữ chúng vào phía sau commit mới nhất trên nhánh đích như biểu đồ bên dưới. Ưu điểm của rebasing là nó có thể được sử dụng để tạo các chuỗi commit có trình tự.

Sơ đồ Git Rebase - Hướng dẫn sử dụng Git - Aptech Buôn Ma Thuột

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.

Bây giờ, để rebase master, hãy gõ lệnh bên dưới trong Git Bash của bạn:

git rebase master

Lệ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. 

Ví dụ: Trên dự án sẵn có của chúng ta, tôi tạo thêm một nhánh aptechbmthotfix và thực hiện một vài commit cho nó.

git branch aptechbmthotfix
git checkout aptechbmthotfix
touch aptechbmt-5.txt
git add aptechbmt-5.txt
git commit -m "Thêm file aptechbmt-5.txt"

Tiế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

git checkout master
touch aptechbmt-6.txt
git add aptechbmt-6.txt
git commit -m "Thêm file aptechbmt-6.txt"

Sau 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.

git log --oneline --graph --color --decorate --all
Git log kiểm tra commit tất cả branch - Hướng dẫn sử dụng Git - Aptech Buôn Ma Thuột

Bạ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:

git rebase master
Git rebase master - Hướng dẫn sử dụng Git - Aptech Buôn Ma Thuột

Kết quả sau khi rebase

Kết quả sau khi rebase - Hướng dẫn sử dụng Git - Aptech Buôn Ma Thuột

Bạn sẽ thấy rằng sau khi rebase commit của nhánh aptechbmthotfix có số hiệu 4e5b0a0 lúc đầu đã được git đổi sang số hiệu khác là e5dec9e và đặt nó ngay trên commit của nhánh master có số hiệu d739a1c.

Tổng kết lại:
- Để hợp nhất các nhánh chúng ta có thể sử dụng Rebase và Merge đều được.
- Điểm khác nhau dễ thấy nhất của Rebase và Merge là trình tự sắp xếp các commit vào nhánh đích. Đối với Rebase nó sẽ tạo ra phiên bản commit mới (được sao chép từ commit của nhánh nguồn) và hợp nhất vào sau commit cuối cùng của nhánh đích. Còn đối với Merge thì nó sẽ giữ nguyên các commit của nguồn và hợp nhất vào nhánh đích theo trình tự thời gian commit chung của kho.

Hướng dẫn Git - Mẹo và thủ thuật

Bây giờ bạn đã trải qua tất cả các hoạt động trong bài viết Hướng dẫn sử dụng Git này, đây là một số mẹo và thủ thuật bạn nên biết. :-)

Lưu trữ kho lưu trữ của bạn

git archive master | gzip > <tên file>.tgz

Nó lưu trữ tất cả các file và dữ liệu trong một file gzip chứ không phải là thư mục .git .

Lưu ý: điều này đơn giản chỉ tạo ra một phiên bản sao lưu của kho lưu trữ và nó hoàn toàn bỏ qua việc kểm soát phiên bản. Bạn làm điều này khi bạn muốn gửi các file cho khách hàng không cài đặt Git trong máy tính của họ để xem xét.

Gói kho của bạn

Nó sẽ biến một kho lưu trữ thành một tập tin duy nhất.

Sử dụng lệnh sau-

git bundle create <tên file>.bundle master

Điều này đẩy nhánh master đến một nhánh từ xa, chỉ được chứa trong một tệp thay vì một kho lưu trữ.

Một cách khác để làm điều đó là:

cd <đường dẫn>
git clone repo.bundle repo-copy -b master
cd repo-copy
git log
cd.. /my-git-repo

Git stash - không thực hiện commit ngay

Khi chúng ta muốn hoàn tác tạm thời việc thêm một tính năng hoặc bất kỳ loại dữ liệu được thêm nào, chúng ta có thể tạm thời bỏ qua chúng.

Sử dụng lệnh dưới đây:

git status
git stash
git status

Và khi bạn muốn áp dụng lại các thay đổi mà bạn sử dụng, hãy sử dụng lệnh bên dưới:

git stash apply

Bài viết khá dài và tôi hy vọng bạn đã thích bài viết Hướng dẫn sử dụng Git này và học các lệnh và thao tác trong Git. Hãy cho tôi biết nếu bạn muốn biết thêm về Git trong phần bình luận bên dưới :-)
 

Tác giả bài viết: Aptech Buôn Ma Thuột

aptech buon ma thuot dao tap lap trinh vien quoc te

 

Ý kiến bạn đọc

Tham gia thảo luận

Mã an toàn Mã bảo mật   

Theo dòng sự kiện

Bài 6: Gitignore là gì? Sử dụng .gitignore sao cho hiệu quả nhất?
Bài 5:Một số vấn đề thường gặp khi sử dụng Git và cách khắc phục
Bài 3: Cách sử dụng Github và làm việc nhóm bằng GitHub
Bài 2: Hướng dẫn cài đặt Git trên Windows và Linux
Bài 1: Git là gì? Cùng khám phá công cụ kiểm soát phiên bản phân tán.

Những tin mới hơn

Bài 7: Git conflicts? Cách xử lý conflict trong khi merge.
Bài 6: Gitignore là gì? Sử dụng .gitignore sao cho hiệu quả nhất?
Bài 5:Một số vấn đề thường gặp khi sử dụng Git và cách khắc phục

Những tin cũ hơn

Bài 3: Cách sử dụng Github và làm việc nhóm bằng GitHub
Bài 2: Hướng dẫn cài đặt Git trên Windows và Linux
Bài 1: Git là gì? Cùng khám phá công cụ kiểm soát phiên bản phân tán.