2011-04-11 125 views
248

很多時候,Git和Rails的看起來像變魔術一樣......如在first chapter of Rails 3 Tutorial book,它談論的Git:什麼是「git remote add ...」和「git push origin master」?

git remote add origin [email protected]:peter/first_app.git 
git push origin master 

和它幾乎說,「它只是作品」沒有說太多關於它們是什麼並開始談論分支。在網上搜索顯示git remote add是添加一個「短名稱」,如origin,它也可以是任何名稱,這就像一個URL的別名。而origin是遠程回購指向的常用路徑。 (在http://git-scm.com/book/en/Git-Basics-Working-with-Remotes下的「添加遠程倉庫」)

那麼爲什麼URL不是git://[email protected]/peter/first_app.git,但在其他語法 - 它是什麼語法?爲什麼必須以.git結束?我試過最後不使用.git,它也可以。如果不是.git,還有什麼可以的?在[email protected]中的git似乎是git服務器上的用戶帳戶?

此外,它爲什麼需要如此詳細以便使用git push origin master?不能默認是起源和主人嗎?我發現第一次需要origin master,但經過小小的編輯和提交,然後git push就是它所需要的(不需要origin master)。知道發生了什麼的人可以提供一些細節嗎?

有時候感覺就像很多魔術一樣沒有解釋......有時候使用它的人是如此自信,當被問到爲什麼,無法解釋它,並用「就是這樣」的方式迴應。有時非常務實和務實。實踐並不壞,但不知道發生了什麼事情可能不切實際。

回答

293

git就像UNIX一樣。用戶友好但對其朋友挑剔。它與shell管道一樣功能強大且用戶友好。

話雖這麼說,一旦你瞭解它的模式和概念,它具有相同的zenlike清晰度我來自UNIX命令行工具的期望。你應該考慮抽出一些時間閱讀在線提供的許多優秀的git教程之一。 Pro Git書是一個開始的好地方。

回答你的第一個問題。

  1. 什麼是git remote add ...

    正如你可能知道,git是一個分佈式版本控制系統。大多數操作都在本地完成。爲了與外界溝通,git使用所謂remotes。這是一個比本地磁盤上,您可以push更改成(以便其他人可以看到他們)或pull(這樣就可以讓別人改變)其他存儲庫。命令git remote add origin [email protected]:peter/first_app.git創建一個名爲origin的新遠程,位於[email protected]:peter/first_app.git。一旦你這樣做,在你推命令,你可以推到origin不是鍵入出整個URL的。

  2. 什麼是git push origin master

    這是說「推提交名爲master遠程命名origin地方分支」的命令。執行此操作後,所有與原始同步的內容都將發送到遠程存儲庫,其他人員將能夠在此處看到它們。

現在關於運輸(即什麼git://)的含義。遠程存儲庫URL可以有多種類型(file://,https://等)。 Git只是依靠傳輸提供的認證機制來處理權限和內容。這意味着對於file:// URL,它將是UNIX文件許可權等。git://方案要求git使用其自己的內部傳輸協議,該協議已針對發送git變更集進行了優化。至於確切的URL,這是因爲github已經建立了它的服務器的方式。

現在的詳細程度。你輸入的命令是一般的命令。有可能告訴git類似於「在這裏稱爲master的分支是名爲bar的遠程分支名爲foo的分支的本地鏡像」。在git中,這意味着master跟蹤bar/foo。第一次克隆時,您將獲得一個名爲master的分支和一個名爲origin(您從中克隆)的遠程設備,並使用本地主設備來追蹤原點上的主設備。一旦建立起來,你可以簡單地說git push,它會做到這一點。如果需要,可以使用較長的命令(例如,git push可能推送到官方公開回購,git push review master可用於推送到您的團隊用於查看代碼的單獨的遠程設備)。您可以使用git branch命令的--set-upstream選項將您的分支設置爲跟蹤分支。

我覺得git(不同於大多數其他應用程序,我使用過)從內到外都能更好地理解。一旦您瞭解了數據庫中存儲和維護數據的方式,命令和它們的功能就變得清晰起來。我同意你的看法,許多git用戶中存在一些精英主義,但我也發現,曾經有UNIX用戶從中學習系統是值得的。祝你好運!

+6

您可能需要在段落中添加關於傳輸的註釋,說明'[email protected]:peter/first_app.git'是git中ssh URL的'scp'風格語法。還有一點是,默認情況下,'master'的上游配置不會影響'git push' *的行爲,除非*您有'push.default'設置爲'tracking'(或更高版本的'upstream' ) - 我做了一篇關於這個混淆源的博客文章:http://longair.net/blog/2011/02/27/an-asymmetry-between-git-pull-and-git-push/ – 2011-04-11 06:15:24

+1

該註釋 - 如果不使用'push.default',則在使用'git push'時,將使用上游配置來查找默認遠程,但不會影響refs的映射。 – 2011-04-11 06:46:47

+0

是不是......我使用的其他VCS如TortoiseSVN似乎是非常「黑匣子」......一些簡單的命令具有非常明確的工作方式。學習它不到一個小時,每個人都很清楚它是如何做到的。使用Git或Hg,看起來更像是一個單元的學期課程。當發生什麼事情時,人們並不確定發生了什麼以及如何解決問題。 [cont'd] – 2011-04-11 06:47:11

5
  1. 存儲庫名稱末尾的.git只是一個約定。通常,在git服務器上,存儲庫保存在名爲project.git的目錄中。當僅指定project時,git客戶端和協議通過測試project.git來尊重該慣例。

  2. git://[email protected]/peter/first_app.git不是有效的git url。 git存儲庫可以通過指定的各種url方案來標識和訪問。 [email protected]:peter/first_app.git是該頁面上提到的ssh網址。

  3. git是靈活的。它允許您跟蹤任何存儲庫中幾乎任何分支的本地分支。雖然master(您的本地默認分支)跟蹤origin/master(遠程默認分支)是一種流行的情況,但它不是通用的。很多時候你可能不想這樣做。這就是爲什麼第一個git push如此詳細。它會告訴git在執行git pullgit push時如何處理本地master分支。

  4. git pushgit pull的默認值是與當前分支的遠程一起工作。這是比起始原件更好的默認值。 git push決定這一點的方式解釋爲here

git是相當優雅和理解,但有一個學習曲線穿行。

+1

正如我在其他答案中所評論的,在git的默認配置中,'git push'不使用'git branch/checkout --track'設置的配置變量來確定要推送哪個遠程引用。然而,你說得對,git pull確實使用了這些。 – 2011-04-11 06:21:18

35

更新:請注意,目前接受的答案使common misunderstanding延續有關git push的行爲,儘管有評論指出,但行爲仍未糾正。像一個倉庫的URL一個綽號 - -

你什麼遙控器是總結是正確的。

那麼爲什麼URL不是git://[email protected]/peter/first_app.git,但在其他語法中 - 它是什麼語法?爲什麼它必須以.git結尾?我在最後嘗試不使用.git,它也可以工作。如果不是.git,還能有什麼?在初學者的git似乎是在git服務器上的用戶帳戶?

您提到的兩個URL指示應該使用兩種不同的傳輸協議。以git://開頭的那個是git協議,通常只用於對存儲庫的只讀訪問。另外一個,[email protected]:peter/first_app.git,是指定通過SSH訪問的庫的不同方式之一 - 這是the documentation描述的「SCP風格的語法」。這在SCP風格的語法的用戶名是git是因爲的方式,GitHub的涉及用戶身份識別 - 本質上的用戶名被忽略,用戶是基於SSH密鑰對,他們用來認證標識。

至於詳細度git push origin master,你已經注意到第一次推後,你可以做git push。這是因爲一系列難以記住,但是,通常,有用的默認值:)

  • 如果沒有指定的遠程,遠程配置爲當前分支(在remote.master.url你的情況)時使用。如果沒有設置,則使用origin
  • 如果沒有指定「refspec」(例如master,master:my-experiment等),那麼git將默認推送與遠程分支具有相同名稱的每個本地分支。如果你只是有你的倉庫和遠程一個叫之間共同master分支,那將是同推你master遠程master

個人,因爲我往往有很多話題分支(而且經常幾個遙控器)我總是使用形式:

git push origin master 

...以避免意外推等分支機構。


在回答關於其他答案之一您的意見,這聽起來我好像在自上而下的方式非常有效地學習有關的git - 你已經發現,默認工作,你的問題是問爲什麼;)更嚴重,混帳可以基本上被簡單地爲SVN使用,但知道一點關於遙控器和分支意味着你可以更flexibily使用它,這真的可以改變你的工作方式爲了更好。你對一個學期課程的評論讓我想起了Scott Chacon在一個播客採訪中所說的一些東西 - 學生們被教授計算機科學和軟件工程中的各種基本工具,但很少有版本控制。分佈式版本控制系統(如git和Mercurial)現在非常重要,而且非常靈活,因此值得爲其教授課程以便給予人們良好的基礎。

我的觀點是,與git,這個學習曲線是絕對值得的 - 與許多主題分支合作,輕鬆合併,並在不同存儲庫之間推送和拉動它們,一旦您對系統充滿信心,就會非常有用。這只是不幸的是:

  • git的主要文檔是很難解析的新手。 (雖然我認爲如果你的Google幾乎有任何git問題,但是有幫助的教程材料(或Stack Overflow答案:))現在出現了。)
  • git中有一些奇怪的行爲現在很難改變,因爲許多腳本可能依賴於它們,但會讓人感到困惑。
+0

我認爲親git書是一個很好的資源,對於新手來說很容易理解。大大平滑學習曲線。另外,我認爲試圖將SVN和其他集中式概念「映射」到git上會使道路更加艱難而不是平滑。根據我的經驗,完全重置是更快更簡單的方法。 – 2011-04-11 07:06:36

+0

@Noufal Ibrahim:我同意你的觀點。我並沒有試圖將SVN概念映射到git上,因爲我知道可能導致的可怕混淆 - 但從上到下有更好的教學方法。 – 2011-04-11 07:25:26

相關問題