Git Pro: Những thao tác cơ bản khi làm việc với Git (P4) – Remotes & Aliases

2.6 Working with Remotes

Làm việc với remotes

Để có thể cộng tác trên bất kỳ dự án Git nào, bạn cần biết cách quản lý kho lưu trữ từ xa( repo remotes). Các repo remotes là các version dự án của bạn được lưu trữ trên Internet hoặc network. Bạn có thể có một vài repo trong số chúng, mỗi repo thường bạn chỉ có thể chỉ đọc hoặc đọc/ghi. Phối hợp với những người khác liên quan đến việc quản lý các repo remotes; push và pull dữ liệu khi bạn cần. Quản lý repo remotes bao gồm thêm repo remotes, loại bỏ các remotes không còn hiệu lực, quản lý các branch remotes khác nhau và xác định chúng có bị theo dõi hay không, v.v. Trong phần này, chúng tôi đề cập đến một vài kỹ năng quản lý các remotes này.

Hiển thị các remotes của bạn

Để xem server remotes nào bạn đã cấu hình, bạn có thể chạy git remote . Nó liệt kê tên ngắn gọn của mỗi remote handle mà bạn đã chỉ định. Nếu bạn đã clone kho lưu trữ của mình thì ít nhất bạn sẽ thấy origin – đó là tên mặc định mà Git đặt cho server bạn đã clone:

$ git clone https://github.com/schacon/ticgit
Cloning into 'ticgit'...
remote: Reusing existing pack: 1857, done.
remote: Total 1857 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (1857/1857), 374.35 KiB | 268.00 KiB/s, done.
Resolving deltas: 100% (772/772), done.
Checking connectivity... done.
$ cd ticgit
$ git remote
origin

Bạn cũng có thể chỉ định -v , hiển thị các URL mà Git đã lưu tên ngắn được sử dụng khi đọc và ghi vào remote đó:

$ git remote -v
origin	https://github.com/schacon/ticgit (fetch)
origin	https://github.com/schacon/ticgit (push)

Nếu bạn có nhiều remotes, lệnh sẽ liệt kê tất cả. Ví dụ: kho lưu trữ có nhiều remotes để làm việc với nhiều thành viên sẽ như sau:

$ cd grit
$ git remote -v
bakkdoor  https://github.com/bakkdoor/grit (fetch)
bakkdoor  https://github.com/bakkdoor/grit (push)
cho45     https://github.com/cho45/grit (fetch)
cho45     https://github.com/cho45/grit (push)
defunkt   https://github.com/defunkt/grit (fetch)
defunkt   https://github.com/defunkt/grit (push)
koke      git://github.com/koke/grit.git (fetch)
koke      git://github.com/koke/grit.git (push)
origin    git@github.com:mojombo/grit.git (fetch)
origin    git@github.com:mojombo/grit.git (push)

Điều đó cho thấy là dự án có thể có sự đóng góp từ bất kỳ ai trong số người dùng bằng cách khá dễ dàng.

Thêm repo remotes

Chúng ta đã đề cập và đưa ra một số demo về cách git clone ngầm thêm origin remote – đây là cách để thêm một remote mới. Để thêm repo remote Git mới dưới dạng tên rút gọn, bạn có lệnh git remote add <shortname> <url> :

$ git remote
origin
$ git remote add pb https://github.com/paulboone/ticgit
$ git remote -v
origin	https://github.com/schacon/ticgit (fetch)
origin	https://github.com/schacon/ticgit (push)
pb	https://github.com/paulboone/ticgit (fetch)
pb	https://github.com/paulboone/ticgit (push)

Bây giờ bạn có thể sử dụng pb trên dòng lệnh thay cho toàn bộ URL. Ví dụ: nếu bạn muốn lấy tất cả thông tin mà Paul có nhưng bạn chưa có trong kho lưu trữ của mình, bạn có thể chạy git fetch pb :

$ git fetch pb
remote: Counting objects: 43, done.
remote: Compressing objects: 100% (36/36), done.
remote: Total 43 (delta 10), reused 31 (delta 5)
Unpacking objects: 100% (43/43), done.
From https://github.com/paulboone/ticgit
 * [new branch]      master     -> pb/master
 * [new branch]      ticgit     -> pb/ticgit

Nhánh master của Paul hiện có thể truy cập tại local dưới dạng pb/master – bạn có thể merge nó vào một trong các nhánh của mình hoặc bạn có thể check out một nhánh local tại thời điểm đó nếu bạn muốn.

Fetch Pull từ remotes

Như bạn vừa thấy, để lấy dữ liệu từ các project remote, bạn có thể chạy:

$ git fetch <remote>

Lệnh này sẽ đi đến dự án remote đó và kéo xuống tất cả dữ liệu từ dự án remote mà bạn chưa có.

Nếu bạn clone một kho lưu trữ, lệnh sẽ tự động thêm repo remote đó dưới tên “origin”. Vì vậy, git fetch origin sẽ nạp bất kỳ phần việc mới nào đã được đẩy lên server kể từ khi bạn clone (hoặc từ lần fetch cuối). Một lưu ý quan trọng là git fetch chỉ pull dữ liệu xuống kho lưu trữ local của bạn – nó không tự động merge với bất kỳ phần việc nào của bạn hoặc sửa đổi những gì bạn đang làm. Bạn phải merge thủ công vào phần việc của bạn khi bạn đã sẵn sàng.

Nếu nhánh hiện tại được thiết lập để theo dõi một nhánh remote, bạn có thể sử dụng git pull để tự động fetch và merge nhánh đó vào nhánh hiện tại của bạn. Theo mặc định, git clone sẽ tự động thiết lập nhánh master local của bạn theo dõi nhánh master remote (hoặc bất cứ thứ gì mà nhánh mặc định được gọi) trên server mà bạn đã clone. Chạy git pull thường lấy dữ liệu từ server mà bạn đã clone ban đầu và tự động merge nó vào mã mà bạn hiện đang làm việc.

Đẩy đến remotes

Khi bạn có project của mình tại một điểm mà bạn muốn chia sẻ, bạn phải đẩy nó lên. Lệnh này rất đơn giản: git push <remote> <branch> . Nếu bạn muốn đẩy nhánh chính của mình đến server origin (clone thường tự động thiết lập cả hai tên đó cho bạn), bạn có thể chạy lệnh như sau để đẩy bất kỳ commit nào bạn đã thực hiện lên server:

$ git push origin master

Lệnh này chỉ hoạt động nếu bạn clone từ một server mà bạn có quyền truy cập write và trong lúc đó không có ai push lên. Nếu bạn và người khác clone cùng một lúc, họ push lên và sau đó bạn cũng push, lệnh push của bạn sẽ bị từ chối. Bạn phải tìm fetch phần việc của họ và merge nó vào phần việc của bạn trước khi bạn push lên.

Kiểm tra một remotes

Nếu bạn muốn xem thông tin về một remotes cụ thể, bạn có thể sử dụng git remote show <remote> . Nếu bạn chạy lệnh này với một tên rút gọn, chẳng hạn như origin , bạn sẽ nhận được một thông báo như thế này:

$ git remote show origin
* remote origin
  Fetch URL: https://github.com/schacon/ticgit
  Push  URL: https://github.com/schacon/ticgit
  HEAD branch: master
  Remote branches:
    master                               tracked
    dev-branch                           tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

Nó liệt kê URL cho repo remotes cũng như thông tin nhánh theo dõi. Lệnh cho bạn biết rằng nếu bạn ở nhánh master và bạn chạy git pull  nó sẽ tự động merge nhánh master trên remote sau khi nó fetch tất cả các tham chiếu remote. Lệnh cũng liệt kê tất cả các tài liệu tham khảo remote mà nó đã pull xuống.

Khi bạn sử dụng Git nhiều hơn, bạn sẽ thấy nhiều thông tin hơn từ git remote show :

$ git remote show origin
* remote origin
  URL: https://github.com/my-org/complex-project
  Fetch URL: https://github.com/my-org/complex-project
  Push  URL: https://github.com/my-org/complex-project
  HEAD branch: master
  Remote branches:
    master                           tracked
    dev-branch                       tracked
    markdown-strip                   tracked
    issue-43                         new (next fetch will store in remotes/origin)
    issue-45                         new (next fetch will store in remotes/origin)
    refs/remotes/origin/issue-11     stale (use 'git remote prune' to remove)
  Local branches configured for 'git pull':
    dev-branch merges with remote dev-branch
    master     merges with remote master
  Local refs configured for 'git push':
    dev-branch                     pushes to dev-branch                     (up to date)
    markdown-strip                 pushes to markdown-strip                 (up to date)
    master                         pushes to master                         (up to date)

Lệnh này cho biết nhánh nào được tự động push khi bạn chạy git push khi đang trên nhánh nhất định. Nó cũng cho biết nhánh remote nào trên server mà bạn chưa có; những nhánh remote nào đã bị xóa khỏi server, và nhiều nhánh local có thể tự động merge với nhánh remote của họ khi bạn chạy git pull .

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

Bạn chạy git remote rename để thay đổi tên rút gọn remote. Ví dụ: nếu bạn muốn đổi tên pb thành paul:

$ git remote rename pb paul
$ git remote
origin
paul

Việc này cũng thay đổi tất cả tên nhánh remote của bạn. Những gì từng được tham chiếu tại pb/master bây giờ là paul/master .

Nếu bạn muốn xóa một remote, bạn có thể sử dụng git remote remove hoặc git remote rm :

$ git remote remove paul
$ git remote
origin

Khi bạn xóa một remote theo cách này, tất cả các nhánh remote và cài đặt cấu hình được liên kết với remotr đó cũng sẽ bị xóa.

2.7 Git Aliases – Bí danh Git

Bí danh Git

Trước khi kết thúc về Git cơ bản, có một số một mẹo nhỏ có thể giúp trải nghiệm Git của bạn đơn giản hơn, dễ dàng hơn và quen thuộc hơn: bí danh( aliases).

Git không tự động suy ra lệnh của bạn nếu bạn nhập nó không đầy đủ. Nhưng nếu bạn không muốn nhập toàn bộ từng lệnh Git, bạn có thể thiết lập bí danh cho mỗi lệnh bằng git config . Dưới đây là một vài ví dụ bạn có thể thiết lập:

$ git config --global alias.co checkout
$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status

Lệnh trên có nghĩa là, thay vì gõ git commit , bạn chỉ cần gõ git ci . Khi bạn sử dụng Git nhiều, có thể bạn cũng sẽ sử dụng các lệnh khác thường xuyên; bạn có thể tạo các bí danh mới cho chúng.

Kỹ thuật này cũng rất hữu ích trong việc tạo các lệnh mà bạn nghĩ nên tồn tại. Ví dụ: để khắc phục sự cố về khả năng sử dụng mà bạn gặp phải khi unstaging file, bạn có thể thêm bí danh unstage vào Git:

$ git config --global alias.unstage 'reset HEAD --'

Nó tương đương với hai lệnh sau:

$ git unstage fileA
$ git reset HEAD -- fileA

Trông có vẻ rõ ràng hơn. Một việc phổ biến nữa là thêm một lệnh last , như sau:

$ git config --global alias.last 'log -1 HEAD'

Bằng cách này, bạn có thể thấy commit cuối cùng một cách dễ dàng:

$ git last
commit 66938dae3329c7aebe598c2246a8e6af90d04646
Author: Josh Goebel <dreamer3@example.com>
Date:   Tue Aug 26 19:48:51 2008 +0800

    Test for current head

    Signed-off-by: Scott Chacon <schacon@example.com>

Ta thấy, Git có thể thay thế bất kỳ lệnh nào khi bạn đặt bí danh cho nó. Tuy nhiên, có thể bạn muốn chạy một lệnh bên ngoài command, một Git subcommand. Trong trường hợp này, bạn bắt đầu lệnh với một ! . Nó rất hữu ích nếu bạn viết các tools của riêng bạn khi làm việc với Git. Chúng ta có thể demo với một bí danh git visual để chạy gitk :

$ git config --global alias.visual '!gitk'

Add a Comment

Scroll Up