Git patch là một lệnh cực kì hữu ích cho việc sao lưu code cũng như dùng để chia sẻ những code base cho đồng nghiệp mà không cần phải đẩy code lên nhánh remote.

Một số usecase cần sử dụng git patch

  • Bạn có code base và muốn chia sẻ cho đồng nghiệp, nhưng không muốn đẩy code của bạn lên nhánh remote vì nó chưa hoàn chỉnh
  • Bạn fixbug hộ đồng nghiệp trên máy của mình, sau đó muốn gửi phần code đã fixbug đấy cho đồng nghiệp, để người ta lấy về và tự xử lý tiếp
  • Khi có cậu đồng nghiệp đẩy code nhầm vào nhánh của bạn, trước khi revert những commit đó thì bạn muốn sao lưu lại và gửi cho người ta, để người ta đem đẩy vào nhánh khác
  • ….

Tạo bản vá khi code ở trên remote

git log

Trước tiên git log để xem mình cần lấy những commit nào để tạo bản vá, giả sử mình khoanh đỏ ba cái commit_id như hình trên.

Khi cần tạo một bản vá từ 1 trong ba commit này thì dùng lệnh sau:

git format-patch -1 commit_id --stdout > output.patch

sử dụng lệnh trên để tạo ra bản vá từ 1 commit_id

Nếu cần tạo bản vá từ nhiều commit thì dùng lệnh sau:

git format-patch -n commit_1 commit_2 commit_3 --stdout > output.patch

với n là số lượng commit mà bạn cần tạo bản vá, có bao nhiêu commit thì khai báo bấy nhiêu, còn output.patch sẽ là tên của file đích bạn muốn tạo.

git format-patch -n commit_1 commit_2 commit_3 --stdout > output.patch

Như ảnh trên là mình dùng command sau:

 git format-patch -3 64d15ae6280572de9c0a5a8bf22a5d484711ca7a b87f5298ceac79162ced690ed377a78c6ce8f1f5 243477ceb446a9ec03cf42f1ecef5f7e7dbea834 --stdout > file_destination_3_commit.patch

Ở trên là trường hợp khi code đã được đẩy lên nhánh remote rồi, thì các bạn tạo các bản vá như thế và gửi cho đồng nghiệp thôi (cách apply bản vá thì ở cuối mình sẽ đề cập).

Tạo bản vá khi code nằm trên local repository

Bây giờ khi code nằm trên nhánh local của bạn, bạn xử lý xong vấn đề và muốn tạo bản vá để gửi cho người khác thì về bản chất cũng chỉ là lấy đúng commit_id ở phần Stage Area và tạo ra file patch rồi gửi đi thôi.

Trước tiên các bạn tạo ba commit ở local và gửi lên Stage Area, đoạn này dễ quá nên mình không làm (chỉ là thêm hoặc sửa file, git add rồi commit thôi, nhưng đừng push)

Sau đó dùng git reflog để xem log, ở đây mình đã tạo sẵn 3 commit để demo:

git reflog

Các bạn có thể thấy mình tạo ra ba commit vào khu vực Stage Area gồm có: a31a948, afcbbae, 0516425. Giờ mình sẽ tạo file patch từ hai commit a31a948 afcbbae bằng command sau:

git format-patch -2 a31a948 afcbbae --stdout > file_from_local_repository.patch
git format-patch -2 a31a948 afcbbae –stdout > file_from_local_repository.patch

Apply những thay đổi từ bản vá

Ok bây giờ bạn đã tạo xong những bản vá đó rồi, giờ cần apply những thay đổi đó vào nhánh target thì làm như sau:

Sử dụng command: git apply <đường dẫn file patch> để áp dụng những thay đổi từ bản vá vào nhánh đích.

ví dụ ban nãy mình tạo một bản vá tên là: file_from_local_repository.patch từ branch feature/demo-patch-local, giờ mình sẽ apply những thay đổi trên bản vá này sang branch master, các bạn theo dõi hình bên dưới:

Vậy là branch master đã có những thay đổi (phần khoanh đỏ) từ bản vá được tạo từ branch feature/demo-patch-local rồi, giờ các bạn xử lý tiếp thôi.

Một số bài viết liên quan: