Chuyển đến nội dung chính

Git Remote: Hướng dẫn đầy đủ kèm ví dụ

Tìm hiểu về remote trong Git, mục đích của chúng và cách sử dụng cho kiểm soát phiên bản trong dự án của bạn. Bao gồm các ví dụ thực tiễn.
· 11 phút đọc

Khám phá cùng AI

Git là một hệ thống quản lý phiên bản (VCS) phổ biến được dùng trong phát triển phần mềm để theo dõi các thay đổi của tệp theo thời gian. Nó hỗ trợ cộng tác bằng cách cho phép các nhà phát triển làm việc đồng thời mà không ghi đè lẫn nhau. Vì tất cả nhà phát triển đều giữ bản sao cục bộ đầy đủ lịch sử dự án, mỗi người có thể làm việc độc lập ngoại tuyến và hợp nhất thay đổi của mình một cách an toàn khi sẵn sàng.

Một kho lưu trữ từ xa (remote) là một phiên bản dự án Git của bạn được lưu trữ trên đám mây thông qua dịch vụ như GitHub hoặc BitBucket.

Bài viết này sẽ tìm hiểu chi tiết hơn về Git remote. Nếu bạn mới bắt đầu với Git, hãy đọc hướng dẫn Git cho người mới bắt đầu. 

Git Remote là gì?

Một Git remote cung cấp một vị trí tập trung nơi một kho có thể được lưu trữ, chia sẻ và truy cập bởi người khác. Người dùng có thể đẩy (push) thay đổi cục bộ của họ lên remote và kéo (pull) các cập nhật do đồng đội thực hiện từ remote. Remote cũng hữu ích để sao lưu mã và triển khai mã lên môi trường sản xuất.

Một kho lưu trữ cục bộ nằm trên máy tính của bạn, vì vậy bạn có thể viết mã, tạo commit và kiểm thử thay đổi tại chỗ. Một kho lưu trữ từ xa, đặt trên mạng, dùng để chia sẻ mã, cộng tác với người khác và sao lưu công việc của bạn. Trong bài này, chúng ta sẽ xem cách đồng bộ thay đổi giữa kho cục bộ và kho từ xa bằng các lệnh Git.

Quy trình làm việc với Git

Một quy trình Git điển hình bắt đầu bằng việc “nhân bản” (clone) một kho từ xa về máy cục bộ. Sau khi clone, bạn có thể tạo một nhánh mới để làm một tính năng hoặc sửa lỗi, chỉnh sửa và commit các thay đổi cục bộ. 

Khi hoàn tất, bạn “đẩy” (push) nhánh lên remote và mở một pull request để được xem xét. Sau khi được duyệt, hợp nhất (merge) các thay đổi vào nhánh chính.

Xuyên suốt quá trình, bạn thường xuyên “kéo” (pull) các cập nhật để giữ kho cục bộ đồng bộ với remote.

A typical Git workflow

Một quy trình Git điển hình (Hình từ khóa học Introduction to Git)

Hãy xem chi tiết quá trình này.

Clone một kho

Giả sử bạn muốn tạo một bản sao của một kho từ xa, quá trình này gọi là “clone” kho. Với bản sao cục bộ, bạn có thể sửa mã và thử nghiệm tính năng mới.

Để dùng Git, hãy đảm bảo đã cài đặt, sau đó mở terminal và dùng lệnh: git clone <URL>.

Ví dụ, để clone dự án tên “project” từ trang GitHub với tên người dùng “datacamp”, hãy dùng

git clone https://github.com/datacamp/project.git

Remote mặc định: 'origin'

Khi bạn clone một kho, Git sẽ tạo một remote mặc định tên là origin. Nhãn origin này đóng vai trò alias cho URL của kho bạn đã clone.

Trong các quy trình Git điển hình, khi bạn chạy lệnh như git push hoặc git pull, Git giả định bạn đang ám chỉ đến origin trừ khi bạn chỉ định remote khác. Điều này đơn giản hóa việc đồng bộ thay đổi giữa bản sao cục bộ và kho chia sẻ. Chúng ta sẽ xem kỹ hơn thao tác push và pull ở phần sau của bài.

Quản lý Git Remote

Các tác vụ quản lý remote phổ biến gồm xem các remote hiện có bằng git remote và thêm một remote mới với git remote add.

Xem các remote hiện có

Để xem các remote hiện có, dùng lệnh git remote. 

git remote
>> origin

Trong ví dụ của chúng ta, alias remote origin được liệt kê nhưng không hiển thị URL. Nếu muốn xem URL gắn với mỗi remote, dùng cờ -v.

git remote -v
>> origin	https://github.com/datacamp/project.git (fetch)
>> origin	https://github.com/datacamp/project.git (push)

Thêm một remote mới

Bạn có thể muốn kết nối kho cục bộ với một remote khác. Chẳng hạn, nếu bạn đã fork một dự án, bạn có thể muốn theo dõi thay đổi ở kho gốc ngoài các thay đổi ở remote main. Hoặc bạn muốn đẩy mã lên nhiều nền tảng như GitHub và GitLab.

Để thêm remote mới, dùng lệnh git remote add <name> <URL>. Hãy thêm một remote tên new_remote.

git remote add new_remote https://github.com/datacamp/project

Đặt tên cho remote giúp bạn không phải nhập lại URL nhiều lần khi hợp nhất.

Đổi tên và xóa remote

Đổi tên một remote rất đơn giản. Dùng lệnh git remote rename <old-name> <new-name>. Ví dụ,

git remote rename new_remote original_remote

Để xác nhận remote đã được đổi tên, liệt kê các remote với git remote.

Để xóa một remote, dùng git remote remove <name>. Với ví dụ của chúng ta:

git remote remove new_remote

Bây giờ, liệt kê các remote để kiểm tra.

git remote
>> origin

Ta thấy remote duy nhất là origin.

Làm việc với nhánh từ xa

Một nhánh trong Git là một nhánh làm việc độc lập với main, cho phép bạn thực hiện thay đổi tách biệt với phiên bản chính của dự án. Khi hoàn tất và được xem xét, bạn có thể hợp nhất nhánh trở lại dự án chính.

Liệt kê các nhánh từ xa

Để liệt kê nhánh từ xa, dùng lệnh git branch -r.

git branch -r
>> origin/HEAD -> origin/main
>> origin/main

Hãy diễn giải kết quả. Dòng origin/main cho biết có một nhánh từ xa tên main trên remote origin. Dòng origin/HEAD -> origin/main cho thấy nhánh mặc định trên remote là origin/main. Vậy, kết quả này cho bạn biết main là nhánh mặc định trên remote origin, và hiện đây là nhánh từ xa duy nhất được liệt kê.

Theo dõi một nhánh từ xa

Bạn thường sẽ muốn kết nối một nhánh cục bộ với một nhánh từ xa để giữ mã đồng bộ. Khi một nhánh cục bộ theo dõi (track) một nhánh từ xa, bạn có thể pull và push thay đổi mà không cần chỉ định remote và tên nhánh mỗi lần. 

Git cũng theo dõi số commit nhánh cục bộ của bạn đi trước hoặc tụt sau so với nhánh từ xa, giúp quản lý thay đổi dễ dàng hơn.

Lệnh git checkout --track origin/<branch-name> tạo một nhánh cục bộ mới để theo dõi nhánh từ xa được chỉ định. Nó thiết lập một nhánh cục bộ cùng tên với <branch-name> và liên kết với phiên bản từ xa. Nhờ vậy, các lệnh git pull và git push trong tương lai sẽ tự động tương tác với đúng nhánh từ xa. Bạn có thể tìm hiểu thêm về Git Push và Pull trong hướng dẫn của chúng tôi. 

Fetch và pull từ remote

Để giữ nhánh cục bộ đồng bộ với thay đổi của người khác, bạn cần kéo nội dung về nhánh cục bộ. “Pull” nghĩa là tải về các thay đổi mới nhất từ nhánh tương ứng trên remote và hợp nhất các thay đổi đó vào phiên bản cục bộ của nhánh. Điều này đảm bảo bạn làm việc với mã mới nhất.

Giả sử chúng ta muốn kéo tất cả nhánh từ remote tên origin. Thao tác này dùng lệnh git fetch origin. Nếu chỉ muốn fetch một nhánh cụ thể, như main, hãy chỉ định như git fetch origin main.

Sau khi fetch, bạn vẫn cần đồng bộ nội dung bằng cách hợp nhất các thay đổi đã fetch vào nhánh cục bộ hiện tại. Để làm vậy, chạy git merge origin/<branch-name>, thay <branch-name> bằng tên nhánh bạn đã fetch. Ví dụ, để hợp nhất thay đổi từ nhánh main trên remote, bạn dùng git merge origin/main.

Vì việc fetch và merge thường diễn ra liên tiếp, Git cung cấp một lệnh thực hiện cả hai: git pull. Ví dụ, để fetch và merge thay đổi từ nhánh main trên remote tên origin, bạn có thể dùng git pull origin main.

Khi nào nên dùng fetch và merge và khi nào nên dùng pull? Quy trình hai bước fetch và merge cho bạn nhiều quyền kiểm soát hơn đối với cập nhật. Fetch cho phép bạn xem có gì thay đổi trên remote trước khi hợp nhất vào nhánh cục bộ. Điều này hữu ích nếu bạn muốn rà soát cập nhật, so sánh khác biệt hoặc xử lý xung đột cẩn thận. 

Dùng pull khi bạn tự tin rằng thay đổi trên remote an toàn để hợp nhất ngay và bạn muốn cập nhật nhánh nhanh chóng. Nó tiện lợi và gộp cả hai bước làm một, nhưng cho bạn ít khả năng quan sát trước khi việc merge diễn ra.

Push lên kho từ xa

“Push” nội dung từ nhánh cục bộ lên remote nghĩa là bạn đang gửi các thay đổi cục bộ lên nhánh tương ứng trên kho từ xa. Điều này cập nhật remote với công việc mới nhất của bạn để người khác có thể xem, pull hoặc phát triển tiếp. Push giúp chia sẻ đóng góp của bạn và giữ kho từ xa được cập nhật cho mọi người trong dự án.

Tải các thay đổi cục bộ lên remote gồm ba bước.

1. Dùng git add để đưa các tệp vào vùng chuẩn bị (stage). Để thêm mọi thay đổi, dùng

git add

Để thêm một tệp cụ thể, hãy chỉ định tên tệp.

git add <filename>

2. Commit thay đổi của bạn. Thêm một thông điệp mô tả những gì bạn đã làm.

git commit -m “Your commit message here”

3. Push lên remote.

git push origin branch-name

Ví dụ thực tiễn

Hãy xem một số ví dụ thực tế: clone một kho và cộng tác với nhiều remote.

Clone một kho lưu trữ

Dưới đây là hướng dẫn từng bước để clone một kho.

  1. Lấy URL của kho. Sao chép URL của kho bạn muốn clone. URL này có trên nhà cung cấp đám mây của bạn, như GitHub hoặc BitBucket.
  2. Chọn thư mục. Đi tới thư mục trên máy tính nơi bạn muốn sao chép kho về.
  3. Clone kho. Chạy lệnh git clone <URL>. Ví dụ, chạygit clone https://github.com/datacamp/project.Lệnh này tạo một thư mục mới tên project chứa nội dung của kho.
  4. Liệt kê các remote đã cấu hình. Sau khi clone, kiểm tra các remote với lệnh git remote.Trong ví dụ của chúng ta, bạn sẽ thấy origin, là tên mặc định Git gán cho remote bạn đã clone và URL của nó.

Cộng tác với nhiều remote

Khi đóng góp cho dự án mã nguồn mở hoặc cộng tác thông qua bản sao cá nhân (fork), việc làm với hai remote là phổ biến: origin, là fork của bạn, và upstream, là kho bạn đã fork. Thông thường, bạn có quyền ghi lên origin nhưng không có trên upstream.

Có một số thực hành tốt để quản lý nhiều remote mà bạn nên lưu ý.

  1. Thêm remote upstream. Sau khi clone fork của bạn, hãy theo dõi kho gốc là upstream: git remote add upstream <URL>.
  2. Giữ fork của bạn luôn cập nhật. Thường xuyên fetch thay đổi từ kho upstream bằng lệnh git fetch upstream. Sau đó merge hoặc rebase các thay đổi đó vào nhánh cục bộ của bạn.
  3. Tránh push lên kho upstream. Thông thường bạn không có (hoặc không cần) quyền push lên kho upstream. Mọi thay đổi của bạn nên được push lên origin và tạo pull request từ đó.
  4. Dùng tên nhánh có tính mô tả. Giữ các nhánh cục bộ gọn gàng. Nên đặt tên theo tính năng hoặc issue bạn đang làm.
  5. Kiểm tra các remote. Dùng git remote -v để xem lại cấu hình remote và xác nhận URL cho origin và upstream là chính xác.
  6. Đồng bộ trước khi làm việc. Trước khi bắt đầu công việc mới, luôn pull các thay đổi mới nhất từ upstream vào nhánh chính của bạn để luôn cập nhật và tránh xung đột sau này.

Thực hành tốt và mẹo với Git Remote

Dưới đây là một số thực hành tốt bạn nên tuân theo khi dùng Git remote: 

Giữ remote luôn cập nhật

Thường xuyên fetch thay đổi giúp đảm bảo bản sao cục bộ của bạn luôn cập nhật với phiên bản trên remote. Bằng cách chạy git fetch, bạn tải về mọi thay đổi mới từ remote mà không ảnh hưởng đến nhánh hiện tại. 

Điều này giúp bạn nắm được đồng nghiệp đã push gì, cho phép bạn so sánh thay đổi và chuẩn bị cho các cập nhật hoặc merge cần thiết. Fetch đều đặn giảm khả năng xung đột và giúp quy trình cộng tác vận hành trơn tru.

Theo thời gian, khi các nhánh bị xóa khỏi kho từ xa, thiết lập Git cục bộ của bạn vẫn có thể hiển thị các nhánh cũ dưới dạng nhánh theo dõi từ xa. Đây được gọi là nhánh theo dõi “cũ” (stale). 

Để dọn dẹp các nhánh, chạy git remote prune origin để xóa những nhánh theo dõi từ xa không còn tồn tại trên remote origin. 

Thực hiện điều này thường xuyên giúp kho cục bộ của bạn gọn gàng, dễ tìm nhánh liên quan và đảm bảo bạn không tham chiếu đến công việc lỗi thời.

Xử lý xung đột với remote

Xung đột trên remote có thể khó giải quyết. Cách tốt nhất là phòng tránh bằng cách đảm bảo không có nhiều người cùng sửa một phần mã tại cùng thời điểm. Tuy vậy, điều này không phải lúc nào cũng khả thi. 

Dù có cố gắng, xung đột vẫn có thể xảy ra. Khi xảy ra, hãy làm theo kế hoạch này để xử lý hiệu quả.

  1. Dùng git status để xem những xung đột nào cần bạn xử lý.
  2. Mở các tệp bị xung đột và chỉnh sửa để giải quyết khác biệt.
  3. Dùng công cụ hợp nhất (merge tool). Các công cụ như VS Code hoặc git mergetool hiển thị so sánh song song và cho phép bạn chọn phiên bản mã cần giữ.
  4. Trao đổi với nhóm. Nếu xung đột không rõ ràng, hãy trao đổi với đồng nghiệp trước khi xử lý. Đảm bảo bạn hiểu dòng nào cần giữ, dòng nào cần bỏ.
  5. Kiểm thử mã sau khi giải quyết xung đột để đảm bảo mọi thứ vẫn hoạt động như mong đợi.
  6. Commit thay đổi của bạn. Sau khi giải quyết tất cả xung đột, stage các tệp và tạo commit để hoàn tất việc merge.

Rebase

Dùng git pull --rebase có thể giảm khả năng xảy ra xung đột hợp nhất phức tạp bằng cách áp các thay đổi của bạn lên trên các commit mới nhất từ remote.

Khi bạn dùng git pull --rebase, Git trước tiên fetch các thay đổi mới nhất từ remote, sau đó áp các commit cục bộ của bạn lên trên như thể công việc của bạn diễn ra sau đó.

Cách tiếp cận này giúp tạo lịch sử commit gọn gàng, tuyến tính và có thể giảm khả năng xung đột merge rối rắm.

Thay vì tạo một merge commit kết hợp lịch sử, rebase khiến cho trông như các thay đổi của bạn được thực hiện sau các cập nhật từ remote. Bạn có thể tìm hiểu thêm trong hướng dẫn Git Rebase. 

Kết luận

Git remote đóng vai trò then chốt trong phát triển cộng tác, kết nối kho cục bộ với codebase dùng chung. Trong hướng dẫn này, chúng ta đã điểm qua các thao tác remote thiết yếu, gồm thiết lập, đồng bộ thông qua các lệnh fetch, pull, push, và quản lý nhiều kết nối remote.

Nắm vững các khái niệm đã trình bày sẽ giúp bạn cộng tác hiệu quả hơn, duy trì lịch sử dự án rõ ràng và đóng góp tốt cho đội ngũ phát triển.

Để biết thêm thông tin liên quan đến các nhánh remote của git, hãy xem các tài nguyên của DataCamp.

Git Remotes FAQs

Git remote là gì?

Git remote là một liên kết tới kho lưu trữ được lưu trên máy chủ, thường trên các nền tảng như GitHub, GitLab hoặc Bitbucket.

Khi bạn clone một kho, remote được gọi là gì?

Theo mặc định, remote được đặt bí danh là origin.

Làm sao để xem các remote đã cấu hình?

Lệnh git remote -v hiển thị tên và URL của tất cả các remote được liên kết với dự án của bạn.

Làm sao để thêm một remote mới?

Dùng lệnh git remote add <name> <url>. Ví dụ, 

git remote add upstream https://github.com/user/project.git

Điều gì xảy ra nếu tôi push lên sai remote?

Bạn sẽ gửi (push) thay đổi của mình tới sai kho. Nên kiểm tra lại tên remote bằng git remote -v.

Chủ đề

Liên quan