git下的團隊合作模型及git基礎知識彙集

世有因果知因求果發表於2016-03-11

https://www.atlassian.com/git/tutorials/syncing/git-fetch

 

Syncing

svn使用單箇中央庫來作為開發者之間溝通的橋樑,而協同合作是通過在開發者和中央庫之間傳遞changeset來實現的。這種情況對於GIT的協同模型是有區別的,在git下每一個開發者都擁有他們自己的整庫copy。取而代之於從working copy來提交變更集到一箇中央庫中,git允許你在不同的repo之間分享整個分支。

下面的命令允許你管理你和其他repo之間的連線,通過push 一個分支到其他的repo你實現釋出本地history,通過pull一個branch到你自己的repo來獲取他人的contribution.

Git remote

git remote命令允許你來create,view和delete和其他repo的connections. Remote connections可以這樣來理解: 他們更像是bookmarks,而不是其他repo的直接連線。

例如,下面的圖顯示兩個remote connections,一個是從你的repo到central repo,而另一個則是你和John的repo的連線

 

常用命令: git remote -v/git remote add <name> <url>/git remote rm <name>/git remote rename <old-name> <new-name>

注意:

git設計的目標是它會給每一個開發者一個完全獨立的開發環境。這意味著資訊並不會自動地在repo之間自動流轉。相反地,開發人員需要手工的pull upstream commits來獲取到local repo中,或者手工地push local commits到central repo.這個git remote命令實際上僅僅是一種傳遞URL的方便方法到這些sharing目的的commands.

 

Origin Remote

當你通過git clone來clone一個repo時,git會自動地建立一個被稱為origin的remote connection指向到被cloned的repo.這對於開發者建立central repo的一份拷貝是非常方便的,因為這為開發者提供一種便捷pull upstream changes或者publish local commits的方法。這種行為也是為什麼大多數git-based專案稱他們的中央庫為origin的原因。

 

Repository URLs

Git提供很多種方法去引用一個remote repo.兩種最簡單的方式是HTTP或者SSH.

HTTP方法是一種非常簡單的允許匿名只讀訪問repo的方式,比如

http://host/path/to/repo.git

但是,通常是不允許push commit到一個http地址url上面的。需要讀寫一個repo,你必須使用ssh方式:

ssh://user@host/path/to/repo.git

你必須要有一個在host machine上的合法ssh帳號。

除了origin,建立一個連線到你的同事的repo上去的連線也是非常必要和方便的。比如,如果你的搭檔John,維護了一個可以公開訪問的repo在dev.example.com/john.git這個url的話,你可以通過過下面的命令增加一個connection

git remote add john http://dev.example.com/john.git

有了上面這種訪問其他開發者的repo的簡單方式後,這就允許人們繞開central repo來私下協同。這種模式對於小團隊做大專案時是非常有用和高效的!!

git fetch

git fetch這個命令從一個remote repo來向你的local repo匯入commits。這些commits匯入後的結果是他們被儲存在一個remote branch,而不是local branch上。這種模式就讓你在整合remote commit之前來評審這些變更有了機會!

git fetch <remote> <branch>

Fetching這個動作完成的是當你希望檢視其他人的工作時需要做的工作。既然被fetched的content是以一個remote branch來呈現的,那麼這個動作對於你的local dev是沒有任何影響的。這也就是說fetching是一個在外部變更落地前來review評審的安全的方法。

Remote branch

Remote branch和local branch是類似的,不過remote branch是代表著是來自於其他人的repo的commit。你可以像checkout一個local branch一樣來checkout一個remote branch,但是這樣做你將被置入detached HEAD state(就像checkout一個old commit一樣的效果)。你可以把他們想象成一個read-only的分支。要想檢視有哪些remote branches,只需要git branch -r命令引數即可。remote branch總是冠之以remote connection name,所以你永遠不會和本地branch搞混淆。比如,下面的程式碼片段展示了remote branch的情況:

git branch -r
# origin/master
# origin/develop
# origin/some-feature

你可以通過git checkout origin/develop;git log來檢視這些remote分支上有了哪些commit改動。如果你確認這些commit可以進到你的local branch上的話,你只需要git merge即可。

所以,對於git來說,你需要本地和遠端的remo同步的話,你需要有兩步:1.fetch,2.merge

而git pull則一步完成了上面的兩個工作。

 

相關文章