Từ xa là gì


288

Rất thường xuyên, Git và Rails trông giống như ma thuật ... chẳng hạn như trong chương đầu tiên của cuốn sách Hướng dẫn Rails 3 , nó nói về Git:

git remote add origin git@github.com:peter/first_app.git
git push origin master

và khá nhiều người nói rằng "nó chỉ hoạt động" mà không nói quá nhiều về những gì họ đang có và bắt đầu nói về việc phân nhánh. Tìm kiếm trên mạng cho thấy rằng git remote addđể thêm một "tên ngắn", chẳng hạn như origin, và nó cũng có thể là bất kỳ tên nào, giống như một bí danh cho một URL. Và originlà đường dẫn thông thường nơi repo từ xa trỏ đến. (trong http://git-scm.com/book/en/Git-Basics-Working-with-Remotes trong "Thêm kho lưu trữ từ xa")

Vậy tại sao URL không phải git://git@github.com/peter/first_app.gitnhưng trong cú pháp khác - đó là cú pháp gì? Tại sao nó phải kết thúc với .git? Tôi đã cố gắng không sử dụng .gitvào cuối và nó cũng hoạt động. Nếu không .git, nó có thể là gì khác? Các gittrong git@github.comcó vẻ là một tài khoản người dùng trên máy chủ git?

Ngoài ra, tại sao nó cần phải dài dòng để sử dụng git push origin master? Không thể mặc định là nguồn gốc và chủ? Tôi thấy rằng lần đầu tiên, origin mastercần thiết, nhưng sau một chỉnh sửa nhỏ và cam kết, sau đó git pushlà tất cả những gì nó cần (không cần origin master). Ai đó có thể biết những gì đang xảy ra cho một số chi tiết?

Đôi khi, nó cảm thấy giống như rất nhiều phép thuật mà không có lời giải thích ... và đôi khi người sử dụng nó rất tự tin và khi được hỏi tại sao, không thể giải thích nó và trả lời với một cái gì đó như "đó là như vậy". Đôi khi rất thực tế và thực dụng. Nó không tệ khi thực tế, nhưng có lẽ không thực tế đến mức không biết chuyện gì đang xảy ra.

Câu trả lời:


344

gitgiống như UNIX. Người dùng thân thiện nhưng kén chọn về bạn bè của nó. Nó mạnh mẽ và thân thiện với người dùng như một đường ống vỏ.

Điều đó đang được nói, một khi bạn hiểu các mô hình và khái niệm của nó, nó có cùng độ rõ ràng giống như zen mà tôi mong đợi từ các công cụ dòng lệnh UNIX. Bạn nên cân nhắc dành thời gian nghỉ ngơi để đọc một trong nhiều hướng dẫn git tốt có sẵn trực tuyến. Cuốn sách Pro Git là một nơi tốt để bắt đầu.

Để trả lời câu hỏi đầu tiên của bạn.

  1. Những gì là git remote add ...

    Như bạn có thể biết, gitlà một hệ thống kiểm soát phiên bản phân tán. Hầu hết các hoạt động được thực hiện tại địa phương. Để giao tiếp với thế giới bên ngoài, gitsử dụng những gì được gọi là remotes. Đây là các kho lưu trữ khác với kho lưu trữ trên đĩa cục bộ mà bạn có thể pushthay đổi (để người khác có thể nhìn thấy chúng) hoặc pulltừ (để bạn có thể nhận được các thay đổi khác). Lệnh git remote add origin git@github.com:peter/first_app.gittạo một điều khiển từ xa mới được originđặt tại git@github.com:peter/first_app.git. Khi bạn thực hiện việc này, trong các lệnh đẩy của mình, bạn có thể ấn vào originthay vì gõ toàn bộ URL.

  2. Những gì là git push origin master

    Đây là một lệnh có nội dung "đẩy các xác nhận trong nhánh cục bộ được đặt tên mastertừ xa có tên origin". Khi điều này được thực thi, tất cả nội dung mà bạn đã đồng bộ hóa lần cuối với nguồn gốc sẽ được gửi đến kho lưu trữ từ xa và những người khác sẽ có thể thấy chúng ở đó.

Bây giờ về vận tải (nghĩa là gì git://) có nghĩa là. URL kho lưu trữ từ xa có thể có nhiều loại ( file://,https:// v.v.). Git chỉ đơn giản dựa vào cơ chế xác thực được cung cấp bởi vận chuyển để chăm sóc các quyền và công cụ. Điều này có nghĩa là đối với file://các URL, nó sẽ là các quyền của tệp UNIX, v.v. Chương git://trình đang yêu cầu git sử dụng giao thức truyền tải nội bộ của chính nó, được tối ưu hóa để gửi các thay đổi git xung quanh. Đối với URL chính xác, đó là vì nó là do github đã thiết lập gitmáy chủ của nó .

Bây giờ tính dài dòng. Lệnh bạn đã gõ là lệnh chung. Có thể nói với git một cái gì đó như "chi nhánh được gọi masterở đây là gương địa phương của chi nhánh được gọi footrên điều khiển từ xa bar". Trong git speak, điều này có nghĩa là master theo dõi bar/foo . Khi bạn nhân bản lần đầu tiên, bạn sẽ nhận được một nhánh được gọi mastervà tùy chọn được gọi từ xa củaorigin (nơi bạn đã nhân bản từ đó) với thiết lập tổng thể cục bộ để theo dõi chủ gốc. Một khi điều này được thiết lập, bạn có thể chỉ cần nói git pushvà nó sẽ làm điều đó. Lệnh dài hơn có sẵn trong trường hợp bạn cần nó (ví dụ: git pushcó thể đẩy sang repo công khai chính thức và git push review mastercó thể được sử dụng để đẩy sang một điều khiển từ xa riêng biệt mà nhóm của bạn sử dụng để xem lại mã). Bạn có thể đặt chi nhánh của mình thành một nhánh theo dõi bằng cách sử dụng--set-upstreamgit branch lệnh.

Tôi đã cảm thấy rằng git (không giống như hầu hết các ứng dụng khác mà tôi đã sử dụng) được hiểu rõ hơn từ trong ra ngoài. Khi bạn hiểu cách dữ liệu được lưu trữ và duy trì bên trong kho lưu trữ, các lệnh và những gì chúng làm sẽ trở nên rõ ràng. Tôi đồng ý với bạn rằng có một số tinh hoa trong số nhiều gitngười dùng nhưng tôi cũng thấy rằng với người dùng UNIX đã từng có một thời gian, và thật đáng để họ vượt qua để tìm hiểu hệ thống. Chúc may mắn!


8
Bạn có thể muốn thêm một ghi chú trong đoạn văn của mình về việc vận chuyển giải thích đó git@github.com:peter/first_app.gitscpcú pháp kiểu cho các URL ssh trong git. Một điểm khác là theo mặc định, cấu hình ngược dòng masterkhông ảnh hưởng đến hành vi git push trừ khi bạn đã push.defaultđặt thành tracking(hoặc upstreamtrong các phiên bản sau) - Tôi đã viết một bài blog về nguồn gây nhầm lẫn này: longair.net/blog/2011 /
02/27

1
Một chỉnh sửa nhỏ cho nhận xét đó - không có push.defaultcấu hình ngược dòng sẽ được sử dụng để tìm điều khiển từ xa mặc định khi bạn sử dụng git push, nhưng sẽ không ảnh hưởng đến ánh xạ của các ref.
Đánh dấu Longair

1
Tôi tự hỏi tại sao "từ trong ra ngoài", như thường lệ, "hộp đen" rất dễ học ... nó giống như một cách tiếp cận từ trên xuống, với giao diện trên cùng - giao diện - những gì bạn nhập và những gì bạn nhận được, xác định rất tốt và hy vọng đơn giản là tốt. Tất cả những gì người dùng cần quan tâm là "Giao diện" và thực sự không cần biết những gì bên trong. Nếu người dùng muốn biết nhiều hơn, cách thực hiện đặc biệt, thì nên biết, nhưng nó thường là tùy chọn.
phân cực

3
Apropose đen boxen so với trong ra ngoài. Git là điều đầu tiên tôi gặp phải thực sự dễ học hơn từ bên ngoài hơn là từ "giao diện". Cho dù đó là cách đúng hay không là tranh cãi. Tôi chỉ nói rằng từ trong ra ngoài hiệu quả hơn khi nói đến git.
Noufal Ibrahim

9
"git giống như UNIX. Người dùng thân thiện nhưng kén chọn bạn bè." Điều này thật tuyệt vời tôi muốn nó được in trên áo phông.
proflux

41

Cập nhật: lưu ý rằng câu trả lời hiện được chấp nhận sẽ gây ra sự hiểu lầm phổ biến về hành vi của git push, điều này chưa được sửa chữa mặc dù có một bình luận chỉ ra.

Tóm tắt của bạn về các điều khiển từ xa là gì - như một biệt danh cho URL của kho lưu trữ - là chính xác.

Vậy tại sao URL không phải là git: //git@github.com/peter/first_app.git nhưng trong cú pháp khác - đó là cú pháp gì? Tại sao nó phải kết thúc bằng .git? Tôi đã cố gắng không sử dụng .git ở cuối và nó cũng hoạt động. Nếu không .git, nó có thể là gì khác? Git ở người mới bắt đầu dường như là một tài khoản người dùng trên máy chủ git?

Hai URL mà bạn đã đề cập chỉ ra rằng nên sử dụng hai giao thức vận chuyển khác nhau. Bắt đầu với git://giao thức git, thường chỉ được sử dụng để truy cập chỉ đọc vào kho lưu trữ. Một cách khác git@github.com:peter/first_app.git, là một trong những cách khác nhau để chỉ định quyền truy cập vào kho lưu trữ qua SSH - đây là "cú pháp kiểu scp" được mô tả trong tài liệu . Tên người dùng trong cú pháp kiểu scp gitlà do cách GitHub xử lý việc xác định người dùng - về cơ bản tên người dùng đó bị bỏ qua và người dùng được xác định dựa trên cặp khóa SSH mà họ đã sử dụng để xác thực.

Về tính dài dòng git push origin master, bạn đã nhận thấy rằng sau lần đẩy đầu tiên, bạn có thể thực hiện git push. Điều này là do một loạt các mặc định khó nhớ nhưng thường rất hữu ích :)

  • Nếu không có điều khiển từ xa được chỉ định, từ xa được cấu hình cho nhánh hiện tại (trong remote.master.urltrường hợp của bạn) được sử dụng. Nếu điều đó không được thiết lập, thì originđược sử dụng.
  • Nếu không có "refspec" (ví dụ master, master:my-experimentv.v.), thì git mặc định sẽ đẩy mọi nhánh cục bộ có cùng tên với một nhánh trên điều khiển từ xa. Nếu bạn chỉ có một nhánh được gọi masterchung giữa kho lưu trữ của bạn và từ xa, thì điều đó sẽ giống như đẩy bạn masterđến điều khiển từ xa master.

Cá nhân, vì tôi có xu hướng có nhiều nhánh chủ đề (và thường là một số điều khiển từ xa), tôi luôn sử dụng biểu mẫu:

git push origin master

... Để tránh vô tình đẩy các nhánh khác.


Trả lời nhận xét của bạn về một trong những câu trả lời khác, có vẻ như tôi đang học về git theo cách từ trên xuống rất hiệu quả - bạn đã phát hiện ra rằng mặc định hoạt động và câu hỏi của bạn là hỏi về lý do tại sao;) nghiêm trọng hơn, git có thểđược sử dụng về cơ bản đơn giản như SVN, nhưng biết một chút về điều khiển từ xa và các nhánh có nghĩa là bạn có thể sử dụng nó linh hoạt hơn nhiều và điều này thực sự có thể thay đổi cách bạn làm việc tốt hơn. Nhận xét của bạn về một khóa học trong học kỳ khiến tôi nghĩ về điều mà Scott Chacon đã nói trong một cuộc phỏng vấn podcast - sinh viên được dạy về tất cả các loại công cụ cơ bản trong khoa học máy tính và công nghệ phần mềm, nhưng rất hiếm khi kiểm soát phiên bản. Các hệ thống kiểm soát phiên bản phân tán như git và Mercurial hiện rất quan trọng và linh hoạt đến mức đáng để dạy các khóa học về chúng để mang lại cho mọi người một nền tảng tốt.

Quan điểm của tôi là với git, đường cong học tập này hoàn toàn xứng đáng - làm việc với nhiều nhánh chủ đề, dễ dàng hợp nhất chúng, và đẩy và kéo chúng về giữa các kho lưu trữ khác nhau rất hữu ích khi bạn tự tin với hệ thống. Thật không may rằng:

  • Các tài liệu chính cho git rất khó phân tích cho người mới. (Mặc dù tôi cho rằng nếu bạn Google cho hầu hết mọi câu hỏi git, tài liệu hướng dẫn hữu ích (hoặc câu trả lời Stack Overflow :)) hiện nay sẽ xuất hiện.)
  • Hiện tại có một vài hành vi kỳ quặc trong git rất khó thay đổi vì nhiều kịch bản có thể dựa vào chúng, nhưng gây nhầm lẫn cho mọi người.

Tôi nghĩ rằng cuốn sách chuyên nghiệp git là một tài nguyên tuyệt vời và dễ hiểu cho người mới. Làm dịu đi đường cong học tập đáng kể. Ngoài ra, tôi nghĩ rằng cố gắng "ánh xạ" SVN và các khái niệm tập trung khác vào git sẽ làm cho con đường trở nên khó khăn hơn thay vì trơn tru hơn. Thiết lập lại hoàn toàn là một cách nhanh hơn và dễ dàng hơn trong kinh nghiệm của tôi.
Noufal Ibrahim

@Noufal Ibrahim: Tôi đồng ý với tất cả các điểm của bạn. Tôi đã không cố gắng đề xuất "ánh xạ" các khái niệm SVN lên các khái niệm git, vì tôi biết sự nhầm lẫn khủng khiếp có thể gây ra - mặc dù có nhiều cách tốt hơn để dạy git từ trên xuống.
Mark Longair

9

Có một cái nhìn vào cú pháp để thêm một repo từ xa.

git remote add origin <url_of_remote repository>

Thí dụ:

git remote add origin git@github.com:peter/first_app.git

Hãy để chúng tôi mổ xẻ lệnh:

git từ xa này được sử dụng để quản lý các máy chủ trung tâm của bạn để lưu trữ kho git của bạn.

Có thể bạn đang sử dụng Github cho công cụ lưu trữ trung tâm của mình. Tôi sẽ cho bạn một ví dụ và giải thích git remote add origin lệnh

Giả sử tôi đang làm việc với GitHubBitBucket cho các máy chủ trung tâm cho kho lưu trữ git và đã tạo kho lưu trữ trên cả hai trang web cho ứng dụng đầu tiên của tôi dự án .

Bây giờ nếu tôi muốn đẩy các thay đổi của mình lên cả hai máy chủ git này thì tôi sẽ cần nói với git cách tiếp cận các kho lưu trữ trung tâm này. Vì vậy, tôi sẽ phải thêm những thứ này,

Dành cho GitHub

git remote add gh_origin https://github.com/user/first-app-git.git

Và đối với BitBucket

git remote add bb_origin https://user@bitbucket.org/user/first-app-git.git

Tôi đã sử dụng hai biến (cho đến nay thật dễ dàng để tôi gọi chúng là biến) gh_origin (gh FOR GITHUB) và bb_origin (bb cho BITBucksET) chỉ để giải thích cho bạn, chúng tôi có thể gọi nguồn gốc bất cứ điều gì chúng tôi muốn.

Bây giờ sau khi thực hiện một số thay đổi, tôi sẽ phải gửi (đẩy) tất cả những thay đổi này đến kho lưu trữ trung tâm để những người dùng khác có thể thấy những thay đổi này. Vì vậy, tôi gọi

Đẩy đến GitHub

git push gh_origin master

Đẩy lên BitBucket

git push bb_origin master

gh_origin đang giữ giá trị của https://github.com/user/first-app-git.gitbb_origin đang giữ giá trị của https: //user@bitbucket.org/user/first-app-git.git

Hai biến này đang làm cho cuộc sống của tôi dễ dàng hơn

vì bất cứ khi nào tôi cần gửi thay đổi mã của mình, tôi cần sử dụng các từ này thay vì ghi nhớ hoặc gõ URL cho cùng.

Hầu hết các lần bạn sẽ không thấy bất cứ điều gì ngoại trừ nguồn gốc vì hầu hết các lần bạn sẽ chỉ giao dịch với một kho lưu trữ trung tâm như Github hoặc BitBucket chẳng hạn.


5
  1. Các .gitở phần cuối của tên kho chỉ là một quy ước. Thông thường, trên kho git máy chủ được giữ trong các thư mục có tên project.git. Máy khách và giao thức git tôn vinh quy ước này bằng cách kiểm tra project.gitkhi chỉ projectđược chỉ định.

  2. git://git@github.com/peter/first_app.gitkhông phải là một url git hợp lệ. kho git có thể được xác định và truy cập thông qua các lược đồ url khác nhau được chỉ định ở đây . git@github.com:peter/first_app.gitsshurl được đề cập trên trang đó.

  3. gitlà linh hoạt. Nó cho phép bạn theo dõi chi nhánh địa phương của bạn chống lại hầu hết các chi nhánh của bất kỳ kho lưu trữ nào. Trong khi mastertheo dõi origin/master( nhánh mặc định cục bộ của bạn) (nhánh mặc định từ xa) là một tình huống phổ biến, nó không phổ biến. Nhiều lần bạn có thể không muốn làm điều đó. Đây là lý do tại sao đầu tiên git pushlà rất dài dòng. Nó cho git biết phải làm gì với masterchi nhánh địa phương khi bạn làm a git pullhoặc a git push.

  4. Mặc định cho git pushgit pulllà để làm việc với điều khiển từ xa của chi nhánh hiện tại. Đây là một mặc định tốt hơn so với nguồn gốc. Cách git đẩy xác định điều này được giải thích ở đây .

git là khá thanh lịch và dễ hiểu nhưng có một đường cong học tập để đi qua.


1
Như tôi đã nhận xét về câu trả lời khác, trong cấu hình mặc định của git, git pushkhông sử dụng các biến cấu hình được thiết lập git branch/checkout --trackđể xác định tham chiếu từ xa nào. Bạn đúng rằng git pull không sử dụng những cái này, tuy nhiên.
Mark Longair

0

Git từ xa thêm nguồn gốc:

Nó tập trung mã nguồn của bạn vào các dự án khác. Nó được phát triển dựa trên Linux, hoàn thành mã nguồn mở và làm cho mã của bạn hữu ích cho những người dùng git khác. Chúng tôi gọi nó là tài liệu tham khảo

Đẩy mã của bạn vào kho git bằng cách sử dụng url từ xa của trung tâm git.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.