Phân Nhánh và Tích Hợp trong Git (phần 1)
Hãy cùng xem qua một ví dụ đơn giản về phân nhánh và tích hợp với một quy trình làm việc mà có thể bạn sẽ sử dụng nó vào thực tế. Bạn sẽ thực hiện theo các bước sau:
- Làm việc trên một web site
- Tạo nhánh cho một câu chuyện mới mà bạn đang làm.
- Làm việc trên nhánh đó.
Đến lúc này, bạn nhận được thông báo rằng có một vấn đề nghiêm trọng cần được khắc phục ngay. Bạn sẽ làm theo các bước sau:
- Chuyển lại về nhánh sản xuất (production)
- Tạo mới một nhánh khác để khắc phục lỗi
- Sau khi đã kiểm tra ổn định, tích hợp nhánh đó lại và đưa vào hoạt động.
- Chuyển ngược lại với câu chuyện của bạn và tiếp tục làm việc.
Phân nhánh trong Git
Đầu tiên, giả sử bạn đang làm việc trên một dự án đã có một số commit từ trước.
Bạn quyết định sẽ giải quyết vấn đề số #53 sử dụng bất kỳ hệ thống giám sát vấn đề (issue-tracking) nào mà công ty bạn đang dùng. Để cho rõ ràng, Git không cung cấp kèm bất kỳ hệ thống giám sát vấn đề nào; nhưng bởi vì vấn đề số #53 là cái mà bạn sẽ tập trung vào nên bạn sẽ tạo một nhánh mới để làm việc trên đó. Để tạo một nhánh và chuyển sang nhánh đó đồng thời, bạn có thể chạy lệnh git checkout với tham số -b:
Tham khảo thêm: Khóa nền tảng lập trình với JavaScipt online
$ git checkout -b iss53
Switched to a new branch "iss53"
Code language: JavaScript (javascript)
Đây là cách sử dụng vắn tắt của:
$ git branch iss53
$ git checkout iss53
Bạn làm việc trên đó và sau đó thực hiện một số commit. Làm như vậy sẽ khiến nhánh iss53 di chuyển tiến lên, vì bạn đã checkout nó (hay, HEAD đang trỏ đến nó;
$ vim index.html
$ git commit -a -m 'added a new footer [issue 53]'
Code language: JavaScript (javascript)
Bây giờ bạn nhận được thông báo rằng có một vấn đề với trang web, và bạn cần khắc phục nó ngay lập tức. Với Git, bạn không phải triển khai bản vá lỗi cùng với các thay đổi bạn đã thực hiện trên nhánh iss53, và bạn không phải tốn quá nhiều công sức để khôi phục lại các thay đổi đó trước khi áp dụng bản vá vào sản xuất. Tất cả những gì bạn cần phải làm là chuyển lại nhánh master.
Tham Khảo thêm: Lập trình Front-end và Back-end là gì?
Tuy nhiên, trước khi làm điều này, bạn nên lưu ý rằng nếu thư mục làm việc hoặc khu vực tổ chức có chứa các thay đổi chưa được commit mà xung đột với nhánh bạn đang làm việc, Git sẽ không cho phép bạn chuyển nhánh. Tốt nhất là bạn nên ở trạng thái làm việc “sạch” (đã commit hết) trước khi chuyển nhánh. Có các cách khác để khắc phục vấn đề này (đó là stashing và sửa commit) mà chúng ta sẽ bàn tới sau. Hiện tại, bạn đã commit hết các thay đổi, vì vậy bạn có thể chuyển lại nhánh master:
$ git checkout master
Switched to branch "master"
Code language: JavaScript (javascript)
Tại thời điểm này, thư mục làm việc của dự án giống hệt như trước khi bạn bắt đầu giải quyết vấn đề #53, và bạn có thể tập trung vào việc sửa lỗi. Điểm quan trọng cần ghi nhớ: Git khôi phục lại thư mục làm việc của bạn để nó giống như snapshot của commit mà nhánh bạn đang làm việc trỏ tới. Nó thêm, xóa, và sửa các tập tin một cách tự động để đảm bảo rằng thư mục làm việc của bạn giống như lần commit cuối cùng.
Tiếp theo, bạn có mỗi lỗi cần phải sửa. Hãy tạo mỗi nhánh để làm việc này cho tới khi nó được hoàn thành
$ git checkout -b hotfix
Switched to a new branch "hotfix"
$ vim index.html
$ git commit -a -m 'fixed the broken email address'
[hotfix]: created 3a0874c: "fixed the broken email address"
1 files changed, 0 insertions(+), 1 deletions(-)
Code language: JavaScript (javascript)
Bạn có thể chạy để kiểm tra, để chắc chắn rằng bản vá lỗi hoạt động đúng theo ý bạn muốn, và sau đó tích hợp nó lại nhánh chính để triển khai. Ta có thể làm sử dụng lệnh git merge để làm việc này:
$ git checkout master
$ git merge hotfix
Updating f42c576..3a0874c
Fast forward
README | 1 -
1 files changed, 0 insertions(+), 1 deletions(-)
Bạn sẽ nhận thấy rằng cụm từ “Fast forward” trong lần tích hợp đó. Bởi vì commit được trở tới bởi nhánh mà bạn tích hợp vào lại trực tiếp là upstream của commit hiện tại, vì vậy Git di chuyển con trỏ về phía trước. Nói cách khác, khi bạn cố gắng tích hợp một commit với một commit khác mà có thể truy cập được từ lịch sử của commit trước thì Git sẽ đơn giản hóa bằng cách di chuyển con trỏ về phía trước vì không có sự rẽ nhánh nào để tích hợp – đây được gọi là “fast forward”.
Thay đổi của bạn bây giờ ở trong snapshot của commit được trỏ tới bởi nhánh master, và bạn có thể triển khai thay đổi này (xem Hình 3-14).
Sau khi triển khai xong bản vá lỗi quan trọng đó, bạn đã sẵn sàng để quay lại với công việc bị gián đoạn trước đó. Tuy nhiên, việc đầu tiên cần làm là xóa nhánh hotfix đi, vì bạn không còn cần tới nó nữa – nhánh master trỏ tới cùng một điểm. Bạn có thể xóa nó đi bằng cách sử dụng tham số -d cho lệnh git branch:
$ git branch -d hotfix
Deleted branch hotfix (3a0874c).
Bây giờ bạn đã có thể chuyển lại nhánh mà bạn đang làm việc trước đó về vấn đề #53 và tiếp tục làm việc
$ git checkout iss53
Switched to branch "iss53"
$ vim index.html
$ git commit -a -m 'finished the new footer [issue 53]'
[iss53]: created ad82d7a: "finished the new footer [issue 53]"
1 files changed, 1 insertions(+), 0 deletions(-)
Code language: JavaScript (javascript)
Điều đáng chú ý ở đây là những công việc bạn đã thực hiện ở nhánh hotfix không bao gồm trong nhánh iss53. Nếu bạn muốn đưa chúng vào, bạn có thể tích hợp nhánh master vào nhánh iss53 bằng cách chạy lệnh git merge master, hoặc bạn có thể chờ đợi đến khi bạn quyết định tích hợp nhánh iss53 ngược trở lại nhánh master về sau.
Leave a Reply