Thắc mắc về origin/master trong git

A/c cho e hỏi origin/master thực sự là gì? E đã search gg nhưng vẫn thấy rất khó hiểu, nó là nhánh master trên remote đặt trên server thật sự hay là 1 bản copy của master trên remote? Nếu nó là 1 bản copy của của nhánh master trên remote thì khi nào nó được update, vì khi e checkout sang 1 nhánh khác mà nhánh này đã có thay đổi gì đó trên remote thì e nhận được thông báo: gõ git pull để cập nhật nhánh này? liệu có phải git chạy ngầm fetch remote về local hay khi mình checkout sang thì nó mới fetch?

origin/master giải thích nhanh là vầy:
origin: tên đại diện cho 1 repo đã có trên server, chủ yếu trỏ đến địa chỉ server và vị trí repo trên server để đồng bộ, không cần biết nó giống hay khác nhau so với trên máy
master: (đang được thay tên main) là 1 nhánh chủ yếu để làm việc, cũng như vậy, không cần thiết nó như thế nào so với server cả.
Lệnh pull sẽ viết đè từ server về máy làm việc và ngược lại push sẽ viết đè lên server. Pull sẽ viết đè không hỏi, còn push sẽ hỏi nếu có xung đột khi có vấn đề trên repo, hầu hết xảy ra khi nhiều người làm việc trên một repo.
Checkout chỉ chuyển nhánh, lấy data đang có trên máy.
Không có sự chạy ngầm với git.

3 Likes

Ví dụ nhánh main đã bị thay đổi trên remote thì khi e git checkout main (lúc này trên máy e chưa fetch/pull main) thì sẽ nhận được thông báo như vầy:
Screenshot 2021-04-24 145809
nên e nghĩ khi checkout nó đã ping đến sever để biết có sự khác biệt, còn có fetch hay không thì không biết.
Sau 1 hồi suy nghĩ thì e nghĩ nó ko fetch mà chỉ ping đến server để xem mã hash commit có khác nhau không? vì nếu nó fetch rồi thì nó chỉ cần kêu mình merge luôn chứ ko cần pull (vì pull gồm fetch + merge)

Theo mình biết không ping gì cả, nó chỉ đọc cái bản sao repo đã được cache sẵn thôi, không ping gì cả
Ping là hành động gửi các package với không có data đến server để kiểm tra độ trễ, hoàn toàn không liên quan tới việc trên
Thử ngắt mạng rồi chuyển branch xem?

2 Likes

Vậy vì sao e chưa fetch hay pull gì nhánh main mà checkout sang nó lại hiện thông báo như trên nhỉ?

Nó dựa trên lần push/pull gần nhất, bạn có sửa đổi, chuyển branch thì nó sẽ compare cái bạn đã sửa đổi.
Tốt nhất bạn nên tự học git lại từ đầu, câu hỏi của bạn nói lên bạn chưa hiểu gì về git cả.

4 Likes

Như case bạn nói thì nó sẽ thế này
Server: origin/master
A----->B----->C------>D

Local: origin/master
A----->B----->C------>E (commit E chỉ mới commit, chưa push)

Checkout: Git sẽ chuyển branch ở Local và compare status của 2 phía server và local. Git phát hiện server có 1 commit ahead (D) và Local có 1 commit chưa push (E) -> báo lỗi bắt mình pull (get commit từ server về local) và resolve conflict (nếu có)
Khi push hay pull git đều check commit của cả 2 đầu server và local nên pull vẫn có thể bị báo conflict

3 Likes

Oke bạn, vì lúc đầu mình không biết lệnh git pull nó fetch toàn bộ chứ không phải chỉ fetch mỗi cái nhánh mình đang đứng, nên dẫn đến hiểu sai :disappointed:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?