Update fork repo

Nội dung

Đặt vấn đề

Bạn fork một repo trên GitHub về account của bạn, sau một thời gian bạn nhận ra là repo của bạn đang "behind" repo chính vài commit. Bạn muốn lấy các commit mới về repo của mình nhưng chưa biết làm thế nào.

Dưới đây là 3 cách để bạn pull thay đổi từ repo chính về repo của bạn.

Để bài viết trực quan hơn, mình sẽ thực hành với một repo mà mình đã fork trên GitHub là: reactjs_koans

Như bạn đã thấy trong ảnh, repo của mình, hnq90/reactjs_koans đang ít hơn repo gốc, arkency/reactjs_koans 13 commit (branch master). Vì vậy, mình sẽ thực hiện việc update repo của mình để lấy được code mới nhất về.

Với 2 cách đầu tiên, bạn cần phải clone repo về máy mình trước: git clone <repo_url>

Ví dụ:

git clone git@github.com:hnq90/reactjs_koans.git

Cloning into 'reactjs_koans'...  
remote: Counting objects: 716, done.  
remote: Total 716 (delta 0), reused 0 (delta 0), pack-reused 716  
Receiving objects: 100% (716/716), 94.44 KiB | 83.00 KiB/s, done.  
Resolving deltas: 100% (380/380), done.  
Checking connectivity... done.  

Cách 1

Pull trực tiếp bằng url của repo chính: git pull <repo_url> <branch>

Ví dụ:

git pull git@github.com:arkency/reactjs_koans.git master

From github.com:arkency/reactjs_koans  
 * branch            master     -> FETCH_HEAD
Updating 2849031..7269361  
Fast-forward  
 README.md                            | 15 +++++++++++----
 build/stylesheets/tabs.css           |  4 ++++
 koans/es6/07-LifecycleMethods.js.jsx |  3 ++-
 package.json                         |  7 ++++---
 scripts/setup.sh                     |  4 ----
 test/es6/02-PartiesList.js           |  2 +-
 test/es6/07-LifecycleMethods.js      |  2 +-
 7 files changed, 23 insertions(+), 14 deletions(-)
 delete mode 100755 scripts/setup.sh

Khi thực hiện command trên, git sẽ pull các thay đổi từ repo tại url vừa truyền vào command về repo hiện tại của bạn.

Sau khi pull các thay đổi về rồi, bạn có thể push lên repo của mình:
git push origin <branch>

Cách 2

Về bản chất, cách 2 cũng chính là cách 1, tuy nhiên nhược điểm của cách 1 là bạn phải nhớ được url của repo khi mỗi lần pull về. Cách dưới đây sẽ khắc phục nhược điểm trên bằng cách add url của repo gốc vào list remote của repo trên máy của bạn.

Để list remote của 1 repo, bạn có thể dùng command: git remote (để xem list alias các remote) hoặc git remote -v (để xem đầy đủ gồm url + alias các remote).

Ví dụ:

git remote -v

origin     git@github.com:hnq90/reactjs_koans.git (fetch)  
origin     git@github.com:hnq90/reactjs\.git (push)  

Mặc định, khi clone một repo về máy, remote alias của bạn sẽ là origin.
Việc bạn phải làm tiếp theo đó là add remote mới vào repo ở máy bạn bằng command sau: git remote add <alias> <repo_url>

Ví dụ:

git remote add repo_goc git@github.com:arkency/reactjs_koans.git

git remote -v  
origin     git@github.com:hnq90/reactjs_koans.git (fetch)  
origin     git@github.com:hnq90/reactjs_koans.git (push)  
repo_goc     git@github.com:arkency/reactjs_koans.git (fetch)  
repo_goc     git@github.com:arkency/reactjs_koans.git (push)  

Sau khi add được remote mới vào repo như trên, từ bây giờ, mỗi lần muốn pull thay đổi từ repo gốc, bạn chỉ cần dùng command như sau:
git pull <remote alias> <branch>

Ví dụ:

git pull repo_goc master

From github.com:arkency/reactjs_koans  
 * branch            master     -> FETCH_HEAD
 * [new branch]      master     -> repo_goc/master
Updating 2849031..7269361  
Fast-forward  
 README.md                            | 15 +++++++++++----
 build/stylesheets/tabs.css           |  4 ++++
 koans/es6/07-LifecycleMethods.js.jsx |  3 ++-
 package.json                         |  7 ++++---
 scripts/setup.sh                     |  4 ----
 test/es6/02-PartiesList.js           |  2 +-
 test/es6/07-LifecycleMethods.js      |  2 +-
 7 files changed, 23 insertions(+), 14 deletions(-)
 delete mode 100755 scripts/setup.sh

Sau khi đã pull được các thay đổi từ repo gốc về repo ở local, bạn chỉ việc push thay đổi lên như phần cuối ở cách 1.

Ví dụ:

git push origin master

Counting objects: 41, done.  
Delta compression using up to 2 threads.  
Compressing objects: 100% (39/39), done.  
Writing objects: 100% (41/41), 5.18 KiB | 0 bytes/s, done.  
Total 41 (delta 23), reused 0 (delta 0)  
To git@github.com:hnq90/reactjs_koans.git  
b0c7093..7269361  master -> master  

Sau khi push lên remote origin, bạn có thể thấy repo của mình và repo gốc đã bằng nhau về số commit (branch master).

Cách 3

Cách số 3 là cách dành riêng cho GitHub vì cách này sử dụng chức năng tạo Pull Request (PR) trên giao diện của GitHub.

Để tạo một PR mới, bạn hãy click vào button ở cạnh button branch như hình dưới:

Vì mục đích của mình là muốn merge các commit ở repo gốc vào repo của mình, nên mình sẽ chọn base fork là repo hnq90/reactjs_koans và branch master của mình và head fork là repo gốc arkency/reactjs_koans cùng với branch master. Sau đó click button Create pull request như hình dưới:

Tiếp theo, bạn có thể điền nội dung tuỳ ý vào phần title và content của PR.

Cuối cùng, bạn click vào button Merge pull request để hoàn thành việc merge thay đổi giữa 2 branch của 2 repo.

Lúc này, các commit ở branch master của repo gốc sẽ được merge vào branch master trên repo của bạn. Tuy nhiên, lúc này bạn sẽ thấy branch master của bạn nhiều hơn branch master của repo gốc 1 commit. Commit này là commit được tự động tạo ra khi merge một PR.

Chú ý

  • Nếu giữa 2 repo có commit lệch nhau thì việc pull từ repo này về repo của mình có thể gây ra conflict. Do đó, khi cần thay đổi, bạn có thể tạo một branch khác (ví dụ develop và commit các thay đổi vào đó, trong khi vẫn giữ nguyên branch master để maintain repo dễ dàng hơn. Sau khi pull từ repo gốc về branch master, ta có thể dùng git merge để merge các thay đổi từ branch master vào branch develop.

Ví dụ:

git checkout master  
git pull repo_goc master

git checkout develop  
git merge master  
  • Việc merge branch bằng cách tạo PR có thể gây ra nhầm lẫn: thay vì merge branch A của repo gốc vào repo của mình thì lại làm ngược lại. Lưu ý là không xoá được PR.

  • Nội dung và một số từ khoá trong bài viết này có thể không hoàn toàn đúng, nếu bạn phát hiện được, xin hãy comment hoặc gửi ý kiến của bạn đến email của mình (fackbeed@huynq.net) để mình sửa đổi hoặc giải thích rõ ràng hơn.

Thay đổi

  • 2015-02-07 13:30 - Public bài viết
  • 2015-02-07 15:20 - Đặt lại tiêu đề