Cách sử dụng branch trong Git

Trong bài này chúng ta sẽ đi vào ví dụ cụ thể cách sử dụng branch trong Git. Các bạn sẽ học được cách tạo branch, chuyển sang branch khác, merge branch (gộp branch), xóa branch sau khi sử dụng xong, xử lý conflict khi merge giữa các branch.

0/ Chuẩn bị repository
– Đầu tiên chúng ta sẽ khởi tạo 1 repository như sau (trong thư mục laptrinhinfo)

– Tiếp theo chúng ta tạo 1 file test.txt với nội dung như bên dưới

– Kế đến hãy commit những lịch sử thay đổi của file txt bên trên

1/ Tạo branch mới

– Chúng ta tạo 1 branch tên là “feature” bằng dòng lệnh sau

– Sau khi tạo xong chúng ta sẽ kiểm tra lại bằng cách hiển thị ra toàn bộ branch đang có trong repository

– Danh sách các branch đang có sẽ hiện ra, hiện tại bạn đang ở branch master nên sẽ có dấu * phía trước tên branch master

2/ Chuyển branch

– Bây giờ chúng ta sẽ chuyển qua branch feature bằng lệnh sau

*** Chúng ta có thể gộp 2 bước tạo branch mới và chuyển ngay sang branch mới bằng cách sau

– Lúc này các bạn thử thêm nội dung vào file test.txt, ví dụ

– Sau đó hãy commit lên, lúc này những commit của bạn sau khi chuyển sang branch feature chỉ được ghi nhận trong lịch sử của branch feature, branch master hoàn toàn không lưu lại những thay đổi này

3/ Merge branch (gộp branch)

– Bây giờ mục tiêu của chúng ta là merge branch feature vào branch master. Để merge branch, chúng ta cần chuyển sang branch cần merge vào, đó là branch master

– Kế đến ta sẽ merge branch feature vào branch master bằng lệnh sau

– Nếu merge thành công không bị lỗi hay conflict, kết quả sẽ hiện lên màn hình như bên trên. Bây giờ bạn hãy kiểm tra nội dung file test.txt ở branch master, những gì bạn đã chỉnh sửa ở branch feature đã được cập nhật.

4/ Xóa branch

– Sau khi tạo branch mới và làm việc trên branch đó, sau khi đã merge branch đã tạo vào 1 branch khác, nếu bạn không cần sử dụng branch đó nữa thì có thể xóa nó bằng lệnh sau (trong ví dụ này tôi sẽ xóa branch feature)

– Bạn có thể kiểm tra xem branch đã được xóa thành công chưa bằng lệnh hiển thị toàn bộ branch: git branch

5/ Làm việc song song trên nhiều branch và xử lý conflict khi merge branch

– Bây giờ chúng ta sẽ giả định tình huống 2 người trong cùng 1 team làm việc trên 2 branch khác nhau. Ví dụ user A làm việc trên branch feature1, user B làm việc trên branch feature2. Lúc này 2 user sẽ sửa cùng chung 1 file trên 2 branch khác nhau và conflict sẽ xảy ra khi merge 2 branch này vào branch master. Đầu tiên chúng ta sẽ tạo 2 branch feature1 và feature2 sau đó sẽ chuyển qua branch feature1 (đóng vai trò là user A)

– User A lúc này sửa nội dung file test.txt như sau

– Ở đây ta đã thấy user A thêm mới vào nội dung ở dòng 3 đoạn text “User A da them vao 1 dong nay” và chỉnh sửa nội dung ở dòng 1 từ “su dung Git branch” sang “[su dung Git branch]” . Bây giờ chúng ta sẽ lưu thay đổi ở branch feature1 bằng lệnh commit

– Tiếp theo chúng ta chuyển qua branch feature2 (đóng vai trò là user B).

– Lúc này user B sẽ thêm 1 đoạn text mới ở dòng 3 và chỉnh sửa dòng 1, thao tác có vẻ tương tự user A nhưng nội dung thêm mới và chỉnh sửa hoàn toàn khác nhau

– Và user B cũng commit để lưu lại thay đổi của mình ở branch feature2

– Vậy là chúng ta đã thấy user A và user B đã làm việc song song trên 2 branch khác nhau và đã lưu lại những gì họ đã làm tại 2 branch trên. Bây giờ tôi sẽ đóng vai trò 1 user khác (user C) quản lý branch master và hoàn toàn không biết những gì user A và user B đã thay đổi trên branch của họ. Nhiệm vụ của tôi là merge 2 branch trên vào branch master để đồng bộ code lại. Đầu tiên tôi sẽ chuyển sang branch master và merge branch feature1 vào

– Mọi thứ có vẻ ổn không có vấn đề gì sau khi merge branch feature1 vào master, file test.txt đã hiển thị đúng những gì user A đã làm. Bây giờ chúng ta hãy merge branch feature2 vào master

– Lần này thì mọi việc có vẻ không ổn như khi merge lần đầu. Đã có lỗi conflict xảy ra. Bây giờ chúng ta sẽ kiểm tra nội dung file test.txt để xem nó đã bị conflict như thế nào

– Lúc này ta thấy từ đoạn <<<<<<< HEAD cho đến ======= là nội dung file test.txt ở branch master sau khi đã merge branch feature1 vào. Còn đoạn ======= cho đến >>>>>>> feature2 là nội dung file test.txt của user B đã sửa ở feature2 do bị conflict với đoạn trên nên không thể merge vào. Bây giờ tôi (user C) sẽ sửa nội dung file test.txt bằng cách hợp nhất kết quả của user A và user B đã làm

(Lưu ý: cách sửa conflict trên chỉ là ví dụ, trong trường hợp thực tế có thể user A và user B sẽ họp chung lại với nhau để thống nhất kết quả theo 1 cách khác. Cách sửa conflict của tôi ở đây là giữ lại toàn bộ những gì user A và user B đã thêm vào và đã sửa)

– Và khi đã sửa xong conflict, đừng quên commit ở branch master

– Vậy là conflict đã được xử lý xong xuôi. Đương nhiên trên thực tế khi làm việc, conflict thường phức tạp hơn vậy nhiều và có thể xảy ra trên rất nhiều file. Và dĩ nhiên sẽ tốn thời gian ngồi so sánh 2 kết quả để để sửa lại file theo cách tối ưu nhất.

 

Tổng quan về branch trong Git

Branch là gì?

Nói đơn giản dễ hiểu branch là phân nhánh, là nhiều version của 1 repository. Hay nói dễ hiểu hơn trong lĩnh vực lập trình là nhiều version khác nhau của 1 phần mềm (web, phone app, game …). Bạn có bao giờ thắc mắc khi sử dụng phần mềm của các hãng lớn khi họ có rất nhiều phiên bản như alpha, beta, … rồi mới đến bản final? Một phần mềm khi phát triển bao gồm rất nhiều công đoạn và nhiều thành viên tham gia vào lập trình. Có thể kể ra như: phát triển frontend, phát triển backend, sửa lỗi … , rồi trong mỗi công đoạn to lại có những công đoạn nhỏ hơn như phát triển tính năng A, phát triển tính năng B, …..

Tại sao branch lại rất quan trọng trong Git?

Thông thường trong Git, branch master là branch để release sản phẩm chạy hoàn hảo nhất, không lỗi, là sản phẩm gọi là chạy ổn định của phần mềm đó. Vậy nên chức năng branch giúp chúng ta chia nhánh ra để giúp đội ngũ phát triển có thể phát triển thêm những tính năng mới, fix bug những tính năng đang phát triển và có thể của tính năng cũ … mà không ảnh hưởng đến branch chính đang release sản phẩm.

Sơ đồ dưới đây sẽ giúp bạn hiểu rõ hơn tại sao lại phải tạo branch (phân nhánh) trong Git

Sau khi đã phát triển xong những tính năng mới, và fix bugs. Việc kế đến là làm sao để những thay đổi đó có hiệu lực trên phiên bản phần mềm đang release (nhánh master). Lúc này chúng ta sử dụng đến tính năng merge branch của Git, gọi là gộp nhánh (theo nghĩa tiếng Việt). Sau khi merge branch, tất cả những thay đổi của các branch sẽ được gộp chung vào branch master để chúng ta có thể release phiên bản mới của phần mềm.

Các branch được tạo ra có thể phát triển 1 cách song song, nghĩa là chúng ta có thể giao cho nhiều người làm việc trên nhiều branch. Cách chia branch này vô cùng hiệu quả để có thể quản lý được công việc, quản lý được task, mà không gây ảnh hưởng giữa các thành viên trong team.

Để dễ hiểu hơn quy trình chia branch và merge branch, bạn có thể tham khảo sơ đồ dưới đây

Cài đặt Git

1/ Cài đặt Git trên Windows

– Đầu tiên bạn cần tải về file cài đặt Git cho Windows tại https://gitforwindows.org/

– Nhấp đúp vào file exe cài đặt và làm theo hướng dẫn để quá trình cài đặt được hoàn tất



– Mở command line của Windows (cmd) hoặc GitBash (Git sẽ tự động cài đặt GitBash) và chạy đoạn lệnh sau để thiết lập ban đầu cho Git (bao gồm username và email)

*** Đối với ai đang sử TortoiseGit trên Windows thì có thể thiết lập username và email nhanh chóng thông qua giao diện GUI rất trực quan của TortoiseGit. Click phải chuột và chọn TortoiseGit > Settings



– Chọn mục Git bên tay trái, sau đó điền vào Name & Email, sau đó bấm OK để hoàn thành thiết lập ban đầu cho Git



2/ Cài đặt Git trên Linux


Đối với Linux phiên bản Debian/Ubuntu (apt-get)

Chạy dòng lệnh dưới đây

Sau khi hoàn tất cài đặt bạn có thể kiểm tra mình đã cài đặt thành công Git chưa bằng cách

Nếu kết quả trả về là tên version của Git nghĩa là bạn đã cài đặt thành công. Bước tiếp theo là bạn cấu hình username và email cho Git (tương tự như trên Windows)

Đối với Linux phiên bản Fedora/CentOS (dnf/yum)

Bạn chạy dòng lệnh sau

Hoặc

Sau đó bạn kiểm tra cài đặt hoàn tất chưa tương tự như trên Linux phiên bản Ubuntu, và kế đó thiết lập username và email tương tự như trên (xem lại phần cài đặt trên Windows hoặc Linux phiên bản Ubuntu)


 

Tìm kiếm và thay thế text nhanh chóng trong WordPress database với plugin Better Search & Replace

Better Search & Replace là plugin vô cùng hữu dụng khi bạn cần tìm kiếm và thay thế nhanh chóng nội dung trong database của WordPress mà không cần phải truy cập vào MySQL command line hay PHPMyAdmin. Một số trường hợp bạn có thể gặp phải và cần đến plugin này là khi bạn chuyển website từ http sang https, tuy bạn đã đổi site url sang https tuy nhiên những link cũ của media như hình ảnh vẫn còn là link http. Lúc này việc sử dụng plugin “Better Search & Replace” là cách tối ưu và tiết kiệm công sức nhất cho bạn.

Dưới đây là cách sử dụng Better Search & Replace

– Để cho an toàn, bạn cần backup database của bạn trước khi thao tác để có thể khôi phục lại nếu có sự cố xảy ra
– Cài đặt plugin “Better Search & Replace” thông qua menu Plugins > Add New
– Sau khi cài đặt thành công và activate plugin, bạn truy cập vào menu Tools > Better Search Replace. Giao diện sẽ tương tự như hình bên dưới

–Wordpress Better Search & Replace plugin

– Bây giờ bạn bật tab “Search/Replace”, phần “Search for” điền vào text tìm kiếm, “Replace with” điền vào text cần thay thế, chọn những table trong database cho phép replace text trong phần “Select tables”, đánh dấu check vào “Run as dry run?” nếu bạn muốn chạy thử để preview trước. Sau đó bấm “Run Search/Replace”

– Better Search & Replace sẽ thông báo cho bạn kết quả tương ứng sau khi chạy, khi bạn muốn chạy thật sự thì bỏ dấu check ở “Run as dry run” rồi bấm lại “Run Search/Replace”

Cài đặt Package Control cho Sublime Text

Sublime Text là code editor khá quen thuộc đối với dân lập trình bởi vì tính gọn nhẹ, tiện dụng và cũng không kém phần mạnh mẽ. Package Control là phần quản lý các gói plugin cho Sublime Text. Đối với 1 developer chuyên nghiệp thì code editor chỉ hỗ trợ để code không thôi là chưa đủ, ngoài ra phải hỗ trợ FTP/SFTP, Git, … v.v… Với Package Control bạn có thể dễ dàng làm điều này. Để cài đặt nó cho Sublime Text bạn làm theo các bước sau.

– Mở Sublime Text và nhấn Ctrl + ~ để mở cửa sổ console như hình bên dưới

– Tùy vào phiên bản Sublime của bạn và copy + paste đoạn code bên dưới vào console rồi nhấn Enter để cài Package Control

Sublime 2

Sublime 3

– Đợi chờ trong chốc lát và truy cập vào menu Preferences, nếu bạn thấy kết quả như hình bên dưới nghĩa là bạn đã làm thành công

Tạo standalone script để chạy Magento 1

Magento 1 có thể được tích hợp dễ dàng vào các đoạn script PHP thuần, hoặc được nhúng vào các hệ thống CMS khác (WordPress, …) hay PHP Framework.

Dưới đây là 1 đoạn code đơn giản để sử dụng Magento 1 trên file PHP script:

 

Tự động submit sitemap lên Google

Đoạn code PHP nhỏ sau đây giúp bạn có thể tự động submit sitemap XML lên Google mà không cần phải thực hiện bằng tay, nếu cần submit sitemap 5 phút/lần hoặc theo 1 thời gian quy định sẵn bạn có thể sử dụng chức năng cronjob trên Linux để tùy biến thêm

 

Tạo custom settings (cấu hình) trong backend của Magento 1

Đầu tiên bạn cần tạo file etc/config.xml để cấu hình cho extension mới của bạn, ở đây tôi lấy ví dụ là Laptrinhinfo_CustomConfig

Tiếp theo bạn định nghĩa các custom settings trong extension, ở đây các cấu hình cần lưu sẽ được hiển thị trong admin dưới dạng các input được nhập dữ liệu vào như textfield, textarea, select box, ….. Để làm điều này, bạn cần định nghĩa chúng dưới dạng XML trong file etc/system.xml

Để phần quản lý các custom settings này có thể được phân quyền cho các role của user, bạn cần tạo file etc/adminhtml.xml và tạo cấu trúc XML như bên dưới

Sau cùng để trả về kết quả cho kiểu dữ liệu dropdown và multiple_dropdown mà chúng ta đã định nghĩa ở phần sourcemodel, chúng ta cần tạo file Model/System/Config/Source/Dropdown/Values.php

 

Tạo shipping method (phương thức thanh toán) mới cho Magento 2

Mặc định, Magento 2 có sẵn một số shipping method như Free Shipping, Table Rates, Flat Rate. Nếu bạn muốn tạo 1 shipping method mới thì trong bài viết này tôi sẽ hướng dẫn các bạn cách để thực hiện.

– Đầu tiên bạn cần tạo 1 extension mới, ở đây tôi lấy ví dụ là Laptrinhinfo_Customshipping. Tiếp theo bạn tạo file cấu hình cho extension của bạn

app/code/Laptrinhinfo/Customshipping/etc/config.xml

– Tiếp tục bạn cần tạo file model được định nghĩa trong config.xml. File model này sẽ tính toán cho phí shipping cho website.

app/code/Laptrinhinfo/Customshipping/Model/Carrier.php

– Sau cùng để tạo những custom settings (cấu hình) cho shipping method mới của bạn (như Ship to Applicable Countries, Ship to Specific Countries … ), bạn cần phải tạo file system.xml để làm điều đó

app/code/Laptrinhinfo/Customshipping/etc/adminhtml/system.xml

 

Lấy tweets từ Twitter sử dụng Python Selenium

Selenium là công cụ khá quen thuộc được sử dụng trong việc test các sản phẩm web hoặc có thể làm công cụ để tự động hóa các thao tác trên website. Selenium hỗ trợ rất nhiều ngôn ngữ lập trình (như Java, C#, Python, Ruby, PHP, Perl, Javascript) cũng như hỗ trợ rất nhiều trình duyệt web (như Firefox, Opera, Chrome, Microsoft Edge, Safari …)

Trong bài viết này, chúng ta sẽ sử dụng Python Selenium để lấy các dữ liệu tweet từ trang web Twitter. Quy trình hoạt động của nó sẽ như sau:

– Mở trình duyệt web (ở đây tôi sử dụng Firefox) để vào trang Twitter search advanced
– Điền vào các tiêu chí để tìm kiếm tweet như: từ ngày, đến ngày, hashtag, …. (Bạn có thể tham khảo form tìm kiếm của Twitter tại đây => https://twitter.com/search-advanced)
– Submit form tìm kiếm, sau đó scroll màn hình web cho đến khi không còn tweet nào được load tiếp nữa.
– Bóc tách HTML từ trang web Twitter và lưu danh sách các tweets vào file .txt hoặc .html

Đoạn code dưới đây sẽ thực hiện các bước trên, do trong code đã comment khá kỹ nên tôi sẽ không giải thích thêm nữa. 😀  . Một số library Python quan trọng được sử dụng trong code là:

Lxml để bóc tách HTML
Selenium để điều khiển web browser từ Python