Bài viết này là phần thứ ba trong chuỗi “Sử Dụng Git”. Nó giả định rằng bạn đã đọc bài cài đặt Git và bài hướng dẫn Cách Sử Dụng Git Hiệu Quả.
Trong thế giới của các hệ thống quản lý phiên bản, GIT có thể được xem là một trong những công cụ linh hoạt nhất. Cú pháp của Git rất dễ học và bạn sẽ nhanh chóng tìm ra cách Git phục vụ tối ưu cho quy trình làm việc cũng như môi trường của mình.
DataOnline sẽ dạy bạn cách tạo hai nhánh (master và develop) và cách hợp nhất (merge) mã từ giai đoạn phát triển sang sản xuất.
Một nhánh, về cơ bản, là một chuỗi các thay đổi trong mã có tên riêng biệt. Mỗi kho lưu trữ có thể có một hoặc nhiều nhánh.
Theo mặc định, nhánh đầu tiên được tạo ra có tên là “master”.
Xem các nhánh
Trước khi tạo nhánh mới, ta cần xem tất cả các nhánh đã tồn tại. Bạn có thể xem tất cả các nhánh hiện có bằng cách gõ:
git branch -a
Việc thêm tham số -a vào cuối lệnh cho Git biết rằng bạn muốn hiển thị tất cả các nhánh, kể cả những nhánh không có trong workspace cục bộ của bạn.
Kết quả đầu ra sẽ trông tương tự như sau:
* master remotes/origin/master
Dấu sao bên cạnh “master” ở dòng đầu tiên cho biết rằng bạn đang đứng trên nhánh đó. Dòng thứ hai cho biết trên remote (được đặt tên là origin) chỉ có một nhánh duy nhất, cũng có tên là master.
Bây giờ, khi đã biết cách xem nhánh, đến lúc tạo nhánh đầu tiên của chúng ta.
Tạo nhánh
Như đã nêu ở đầu bài viết, chúng ta muốn có một môi trường phát triển và sản xuất cho quy trình code của mình.
Chúng ta sẽ sử dụng nhánh “master” mặc định như môi trường sản xuất và do đó cần tạo một nhánh duy nhất cho phát triển (pre-production).
Để tạo một nhánh mới có tên develop, gõ lệnh sau:
git checkout -b develop
Nếu bạn chưa có nhánh nào có tên “develop”, đầu ra sẽ như sau:
Switched to a new branch 'develop'
Nếu nhánh có tên đó đã tồn tại, Git sẽ thông báo:
fatal: A branch named 'develop' already exists.
Bạn có thể chuyển đổi qua lại giữa hai nhánh của mình bằng cách sử dụng lệnh git checkout:
git checkout master
hoặc
git checkout develop
Nếu nhánh mà bạn muốn chuyển sang đã tồn tại, bạn sẽ thấy đầu ra tương tự như sau:
Switched to branch 'master'
Nếu bạn cố gắng chuyển sang một nhánh không tồn tại, chẳng hạn:
git checkout nosuchbranch
Git sẽ thông báo:
error: pathspec 'nosuchbranch' did not match any file(s) known to git.
Giờ đây, khi đã có nhiều nhánh, ta cần sử dụng chúng một cách hiệu quả. Trong kịch bản của chúng ta, nhánh develop sẽ dùng để kiểm thử các thay đổi, trong khi nhánh master dùng để phát hành chúng ra công chúng.
Để minh họa quá trình này, ta cần chuyển về nhánh develop:
git checkout develop
Thực hiện thay đổi trên nhánh Develop
Trên nhánh này, ta sẽ tạo một tập tin rỗng mới có tên “develop”. Cho đến khi hợp nhất vào nhánh master (trong bước sau), tập tin này sẽ không xuất hiện trên nhánh master.
touch develop
Giống như bài hướng dẫn trước, bạn cần báo cho Git biết rằng bạn muốn theo dõi tập tin mới này. Bạn có thể thêm tập tin “develop” bằng lệnh:
git add develop
Những lệnh trên sẽ tạo ra một tập tin rỗng có tên “develop” và thêm nó vào Git.
Chúng ta cũng cần commit tập tin này, để gắn nó vào nhánh hiện tại (nhánh develop):
git commit -m "develop file" develop
Tập tin này bây giờ đã tồn tại trên nhánh develop; như bạn sẽ thấy, nó chưa có trên nhánh master.
Đầu tiên, ta sẽ xác nhận rằng mình đang ở trên nhánh develop. Bạn có thể kiểm tra bằng cách gõ:
git branch
Kết quả đầu ra sẽ giống như sau:
* develop master
Chúng ta đã học trước đó rằng dấu sao bên cạnh tên nhánh cho biết nhánh đó đang được sử dụng.
Lệnh ls sẽ cho bạn thấy rằng cả hai tập tin có tên “file” và “develop” đều tồn tại:
ls
Kết quả đầu ra sẽ hiển thị:
develop file
Hợp nhất mã giữa các nhánh
Phần thú vị bắt đầu sau khi chúng ta chuyển trở lại nhánh master bằng lệnh:
git checkout master
Để đảm bảo rằng bạn đang ở trên nhánh master, hãy gõ:
git branch
Kết quả đầu ra sẽ cho biết nhánh hiện tại, được đánh dấu bằng dấu sao:
develop * master
Khi chạy lệnh ls lần nữa, bạn sẽ thấy tập tin mới không xuất hiện:
file
Điều này không có nghĩa là tập tin đã bị mất – mà là nó chỉ tồn tại trên nhánh develop trong khi bạn đang ở trên nhánh master.
Trong kịch bản của chúng ta, tập tin này đại diện cho bất kỳ thay đổi nào (hoặc một tập tin mới) đã được kiểm thử trên nhánh phát triển và đã sẵn sàng chuyển sang sản xuất. Quá trình chuyển mã giữa các nhánh (thường từ phát triển sang sản xuất) được gọi là merging.
Điều quan trọng cần nhớ khi hợp nhất là bạn cần đứng trên nhánh mà bạn muốn hợp nhất vào.
Trong trường hợp này, chúng ta muốn hợp nhất từ nhánh develop (nơi tập tin “develop” tồn tại) sang nhánh master.
Vì vậy, khi đã ở trên nhánh master, ta chỉ cần chạy lệnh merge:
Một trong những tùy chọn mà ta có thể truyền cho lệnh merge, cụ thể là –no-ff, có nghĩa là chúng ta muốn Git giữ lại tất cả các commit message trước khi hợp nhất. Điều này giúp việc theo dõi các thay đổi trở nên dễ dàng hơn trong tương lai.
Để hợp nhất các thay đổi từ nhánh develop sang nhánh master, gõ:
git merge develop --no-ff
Kết quả đầu ra của lệnh sẽ trông tương tự như sau:
Merge made by the 'recursive' strategy. 0 files changed create mode 100644 develop
Khi chạy lệnh ls lại, bạn sẽ thấy tập tin “develop” đã có mặt trên nhánh master:
develop file
Bước cuối cùng là đẩy các thay đổi này lên máy chủ từ xa, điều mà bạn có thể thực hiện bằng lệnh git push:
git push
Bạn sẽ thấy đầu ra tương tự như sau, xác nhận việc hợp nhất từ nhánh develop sang master trên máy chủ từ xa:
Counting objects: 4, done. Delta compression using up to 2 threads. Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 332 bytes, done. Total 3 (delta 1), reused 0 (delta 0) To ssh://git@git.domain.tld/repository 9af2dcb..53649cf master -> master