原文連接:http://tabalt.net/blog/use-gi...git
關因而用git仍是svn的爭論,我想不用多聊了,總的來講,git是更穩定、更強大、更現代的分佈式版本控制工具,值得你們去嘗試與應用。github
配置我的信息vim
git config --global user.name "$username"
git config --global user.email "$email"
git config --global push.default simple
git config --global color.ui trueapi
git倉庫的建立與受權服務器
git倉庫通常由管理員建立好了,若是是github網站,直接點擊右上角的「 + 」號,選擇 「New repository」,填寫信息並建立便可。 git服務器廣泛使用ssh公鑰來受權訪問。unix系列環境下,使用ssh-keygen命令建立。
ssh-keygen
cd ~/.ssh
ls id_rsa.pub運維
將id_rsa.pub文件發給git服務器的管理員,或複製文件中的內容在github的Settings -> SSH keys 頁面中添加便可:
https://github.com/settings/sshssh
如何建立、管理一個git倉庫,是git服務器運維的問題了,這裏不作過多的探討。
初始化項目分佈式
cd ~/dev/
git clone git@127.0.0.1:path/to/git_test.git
cd ~/dev/git_test
git statussvn
當有一些緊急bug須要修復或者一些小功能的改動,一我的就能輕鬆搞定,可使用本地分支來開發。函數
更新本地master分支爲最新
cd ~/dev/git_test git checkout master git pull
創建本地開發分支
git branch -b dev1011
在本地開發分支上修改代碼
echo "hello git" > hello.txt git add hello.txt git commit -am 'add test file hello.txt' echo "test" > test.txt git add test.txt git commit -am 'add test file test.txt'
開發完畢後,合併代碼到master
他人可能在咱們開發的時候提交了代碼,所以先更新master分支的代碼
git checkout master
git pull
以最新的master分支代碼rebase本地開發分支,若是出現衝突請看第四節:git衝突處理。
git checkout dev1011
git rebase master
合併本地開發分支的代碼到master
git checkout master
git merge dev1011
git push
遠程分支適用於多人協同開發同一個系統或功能的場景。使用遠程分支開發,能夠避免在master分支上引入不穩定的代碼。
遠程分支名能夠根據開發的獨立子系統或模塊名稱命名,如game、user、api、admin 等等。
初始化遠程user分支
更新本地master分支爲最新
cd ~/dev/git_test
git checkout master
git pull
以本地master分支爲基準新建遠程user分支
git push origin master:user
在遠程user分支開發(平常開發)
將遠程user分支checkout下來
git checkout user
git pull
在本地創建屬於本身的開發分支
git checkout -b userdev
編寫代碼
echo 'hello user' > user.txt
提交到本地開發分支
git add user.txt
git commit -am 'add user.txt'
其餘人可能修改了代碼,先合併user上變更的內容到本地本身的開發分支
git checkout user
git pull
git checkout userdev
git rebase user
合併本地本身的開發分支的代碼到遠程user分支
git checkout user
git merge userdev
git push
切換到本地userdev開發分支,繼續開發
git checkout userdev
//coding...
能夠看到,這小節的操做步驟,和使用本地分支開發時幾乎徹底同樣,只是將基於master的操做,換成基於user的操做。
合併user分支到master
git checkout master git pull git checkout user git rebase master git checkout master git merge user git push
更新遠程user分支的代碼
這時,遠程的master,本地的master,本地的develop保持一致;但若是master裏被人修改了代碼(如修改緊急bug等),遠程的user分支的代碼並非最新的了。
借用本地master的代碼更新遠程user分支:
git push origin master:user
開發完畢後,能夠直接刪除遠程user分支
git push origin :user
開發完畢後,能夠刪除本地分支
git branch -D user
使用git merge 、git rebase、git pull等命令時,都有可能和別人修改的代碼發生衝突。
從本質上說,都是merge 和 patch(應用補丁)時產生衝突。rebase是從新設置基準,而後應用補丁的過程,因此也會衝突。git pull會自動merge,repo sync會自動rebase,因此git pull和repo sync也會產生衝突。
邏輯衝突
邏輯衝突實際上git是發現不了的。git merge 或者path成功,可是生成的代碼邏輯是有問題的,須要經過完備自動化測試等方式來保障。
可能形成邏輯衝突的狀況:
其餘人修改了文件名,我在老文件裏作改動
函數參數、返回值等變化,調用方未作相應修改等
樹衝突
兩個用戶同時修改文件名形成的衝突,稱爲樹衝突。下面是一個用戶修改a.txt爲b.txt,另外一個用戶修改a.txt爲c.txt形成衝突的狀況:
$ git status added by us: b.txt both deleted: a.txt added by them: c.txt
若是最終肯定使用b.txt,執行以下操做:
git rm a.txt git rm c.txt git add b.txt git commit
樹衝突也能夠用git mergetool來解決,用d 刪除不要的文件,用c保留須要的文件,最後執行git commit提交。
內容衝突
內容衝突是最多見的狀況,兩個用戶修改了同一個文件的同一塊區域,git會報告內容衝突。
通常狀況下,出現衝突時都會有「CONFLICT」字樣,並提示哪些文件有衝突。
當repo sync報錯時,可能並不直接提示衝突,而是下面這樣:
error: project mini/sample
能夠經過rebase解決:
git rebase remote-branch-name
merge/patch的衝突解決
當某個文件有衝突產生時,git會在衝突的地方作標記。下面是一個有衝突的文件,衝突標記<<<<<<< (7個<)與=======之間的內容是個人修改,=======與>>>>>>>之間的內容是別人的修改;此外,沒有任何其它垃圾文件產生。
$ vim conflict.txt <<<<<<< HEAD //my changes ======= //other's changes >>>>>>> commit log
直接編輯文件中被標記的地方,將不須要的表明和衝突標記刪除。並執行 add、commit操做
git add conflict.txt git commit
rebase的衝突解決
rebase的衝突解決過程,就是解決每一個應用補丁衝突的過程。
按照上面的操做編輯每個衝突文件,並一一執行git add 的操做,而後執行下面的命令繼續rebase操做:
git rebase --continue
有衝突繼續解決,重複這這些步驟,直到rebase完成。
若是中間遇到某個補丁不須要應用,能夠用下面命令忽略:
git rebase --skip
若是想回到rebase執行以前的狀態,能夠執行:
git rebase --abort
rebase以後,不須要執行commit,也不存在新的修改須要提交,都是git自動完成。