Git 簡介
Git是目前世界上最先進的分布式版本控制系統(tǒng),沒有之一。
勤用 git status 查看狀態(tài)和提示,準沒錯的。
廖雪峰 Git 教程
集中式 VS 分布式
CVS及SVN都是集中式的版本控制系統(tǒng)举畸,而Git是分布式版本控制系統(tǒng),集中式和分布式版本控制系統(tǒng)有什么區(qū)別呢凳枝?
先說集中式版本控制系統(tǒng)抄沮,版本庫是集中存放在中央服務器的,而干活的時候岖瑰,用的都是自己的電腦叛买,所以要先從中央服務器取得最新的版本,然后開始干活蹋订,干完活了率挣,再把自己的活推送給中央服務器。中央服務器就好比是一個圖書館露戒,你要改一本書椒功,必須先從圖書館借出來,然后回到家自己改智什,改完了动漾,再放回圖書館。
集中式版本控制系統(tǒng)最大的毛病就是必須聯(lián)網(wǎng)才能工作荠锭,如果在局域網(wǎng)內(nèi)還好旱眯,帶寬夠大彭沼,速度夠快链沼,可如果在互聯(lián)網(wǎng)上陶贼,遇到網(wǎng)速慢的話蔫敲,可能提交一個10M的文件就需要5分鐘,這還不得把人給憋死啊痘拆。
那分布式版本控制系統(tǒng)與集中式版本控制系統(tǒng)有何不同呢赏表?首先蔼两,分布式版本控制系統(tǒng)根本沒有“中央服務器”叫搁,每個人的電腦上都是一個完整的版本庫,這樣供炎,你工作的時候渴逻,就不需要聯(lián)網(wǎng)了,因為版本庫就在你自己的電腦上音诫。既然每個人電腦上都有一個完整的版本庫惨奕,那多個人如何協(xié)作呢?比方說你在自己電腦上改了文件A竭钝,你的同事也在他的電腦上改了文件A梨撞,這時雹洗,你們倆之間只需把各自的修改推送給對方,就可以互相看到對方的修改了卧波。
說明
首先這里再明確一下时肿,所有的版本控制系統(tǒng),其實只能跟蹤文本文件的改動港粱,比如TXT文件螃成,網(wǎng)頁,所有的程序代碼等等查坪,Git也不例外寸宏。版本控制系統(tǒng)可以告訴你每次的改動,比如在第5行加了一個單詞“Linux”偿曙,在第8行刪了一個單詞“Windows”氮凝。而圖片、視頻這些二進制文件望忆,雖然也能由版本控制系統(tǒng)管理罩阵,但沒法跟蹤文件的變化,只能把二進制文件每次改動串起來炭臭,也就是只知道圖片從100KB改成了120KB永脓,但到底改了啥,版本控制系統(tǒng)不知道鞋仍,也沒法知道常摧。
不幸的是,Microsoft的Word格式是二進制格式威创,因此落午,版本控制系統(tǒng)是沒法跟蹤Word文件的改動的,前面我們舉的例子只是為了演示肚豺,如果要真正使用版本控制系統(tǒng)溃斋,就要以純文本方式編寫文件。
因為文本是有編碼的吸申,比如中文有常用的GBK編碼梗劫,日文有Shift_JIS編碼,如果沒有歷史遺留問題截碴,強烈建議使用標準的UTF-8編碼梳侨,所有語言使用同一種編碼,既沒有沖突日丹,又被所有平臺所支持走哺。
使用Windows的童鞋要特別注意:
千萬不要使用Windows自帶的記事本編輯任何文本文件。原因是Microsoft開發(fā)記事本的團隊使用了一個非常弱智的行為來保存UTF-8編碼的文件哲虾,他們自作聰明地在每個文件開頭添加了0xefbbbf(十六進制)的字符丙躏,你會遇到很多不可思議的問題择示,比如,網(wǎng)頁第一行可能會顯示一個“?”晒旅,明明正確的程序一編譯就報語法錯誤栅盲,等等,都是由記事本的弱智行為帶來的敢朱。建議你下載 Notepad++ 代替記事本剪菱,不但功能強大,而且免費拴签!記得把Notepad++的默認編碼設置為UTF-8 without BOM 即可:
Unix的哲學是——沒有消息就是好消息孝常。
廢話說完了,下面開始命令
-
git init
:將一個目錄或文件夾初始化成 Git 可以管理的倉庫( repository ) -
git add readme.txt
:把readme.txt
文件的修改添加到暫存區(qū)蚓哩; -
git add .
:將當前目錄下所有文件添加到暫存區(qū)构灸; -
git commit -m 'the commit info'
:將暫存區(qū)中的修改提交到倉庫; -
git status
:查看倉庫當前狀態(tài)岸梨; git diff readme.txt
:查看文件具體不同喜颁;-
git log [--pretty=oneline]
:查看提交歷史; -
git reset --hard HEAD^
:回到上一個版本曹阔; -
git reset --hard HEAD~n
:回到上 n 個版本半开; -
git reset --hard commit_id
:回到commit_id
對應的版本; -
git reflog
:查看命令歷史——包括每一次的commit_id
T叻荨寂拆!這樣就可以任意穿越!抓韩! -
git checkout -- readme.txt
:將 工作區(qū)中的修改 恢復到最近一次add
或commit
的狀態(tài)纠永,即若add
后又作了修改,就恢復到add
時的狀態(tài)谒拴;若commit
后作了修改尝江,就恢復到commit
時的狀態(tài);(注意這里--
是單獨在中間的英上,沒有和readme.txt
連起來L啃颉) -
git reset HEAD readme.txt
:將 暫存區(qū)中readme.txt
的修改 撤銷(unstage)掉,重新放回工作區(qū)苍日; -
git rm a.txt
:刪除a.txt
并將修改添加到暫存區(qū)惭聂; -
git remote add origin https://github.com/xiaogmail/learnit.git
將本地倉庫與遠程倉庫關聯(lián)起來; -
git push -u origin master
:將本地倉庫推送到遠程倉庫易遣;由于遠程庫是空的,我們第一次推送
master
分支時嫌佑,加上了-u
參數(shù)豆茫,Git不但會把本地的master
分支內(nèi)容推送的遠程新的master
分支侨歉,還會把本地的master
分支和遠程的master
分支關聯(lián)起來,在以后的推送或者拉取時就可以簡化命令揩魂,git push
搞定幽邓。
-
git branch
:查看分支; -
git branch <name>
:創(chuàng)建分支火脉; -
git checkout <name>
:切換分支牵舵; -
git checkout -b <name>
:創(chuàng)建并切換分支; -
git branch -d <name>
:刪除分支倦挂; -
git merge <name>
:合并某個分支到當前分支畸颅; -
git merge --abort
:終止合并(在遇到?jīng)_突要你手動合并時); -
git log --graph --pretty=oneline --abbrev-commit
:查看分支圖方援; -
git merge --no-ff dev -m 'master merge dev with --no-ff'
:強制非快進模式没炒,這才是正確使用方式。不要默認的 Fast-forward犯戏。 -
git stash
:保存和隱藏當前工作現(xiàn)場送火; -
git stash list
:查看隱藏的工作現(xiàn)場; -
git stash apply
:恢復工作現(xiàn)場先匪; -
git stash drop
:刪除隱藏的工作現(xiàn)場种吸; -
git stash pop
:恢復并刪除; -
git remote
:查看遠程倉庫信息呀非; -
git remote -v
:查看更詳細的信息(url 地址)坚俗; -
git push origin branch-name
:從本地推送分支; -
git checkout -b branch-name origin/branch-name
在本地創(chuàng)建和遠程分支對應的分支姜钳; -
git branch --set-upstream-to=origin/branch-name
:建立本地分支和遠程分支的關聯(lián)坦冠; -
git pull
:從遠程分支抓取。如果有沖突哥桥,先解決沖突辙浑; -
git tag <tagname>
:在當前最新提交上創(chuàng)建一個標簽; -
git tag <tagname> <commit id>
:在指定 commit id 上創(chuàng)建標簽拟糕; -
git tag -a <tagname> -m <'tag information'>
:帶提示信息的標簽判呕; -
git tag
:查看所有已建立的標簽; -
git show <tagname>
:查看某個標簽的詳細信息(如建在哪個 commit id 上)送滞; -
git tag -d <tagname>
:刪除標簽(本地)侠草; -
git push origin <tagname>
:推送標簽到遠程倉庫;對犁嗅,標簽也要推送边涕! -
git push origin --tags
:一次性推送所有未推送標簽; -
git push origin :refs/tags/<tagname>
:刪除一個遠程標簽(首先要在本地刪除);
手動新建一個 readme.txt
并寫入內(nèi)容 aaaaa
后功蜓,用git status
查看狀態(tài):
執(zhí)行git add readme.txt
后再次查看狀態(tài):
在readme.txt
中添加一行bbbbb
并保存后园爷,查看狀態(tài):
Changes to be commited
:暫存區(qū)中有未提交的修改;
Changes not staged for commit
:not staged式撼,未將修改添加到暫存區(qū)童社;
再添加一行ccccc
后,用git diff readme.txt
查看區(qū)別:
像這樣著隆,你不斷對文件進行修改扰楼,然后不斷提交修改到版本庫里,就好比玩RPG游戲時美浦,每通過一關就會自動把游戲狀態(tài)存盤弦赖,如果某一關沒過去,你還可以選擇讀取前一關的狀態(tài)抵代。有些時候腾节,在打Boss之前,你會手動存盤荤牍,以便萬一打Boss失敗了案腺,可以從最近的地方重新開始。Git也是一樣康吵,每當你覺得文件修改到一定程度的時候劈榨,就可以“保存一個快照”,這個快照在Git中被稱為
commit
晦嵌。一旦你把文件改亂了同辣,或者誤刪了文件,還可以從最近的一個commit
恢復惭载,然后繼續(xù)工作旱函,而不是把幾個月的工作成果全部丟失。
-
git log [--pretty=oneline]
:查看日志描滔;
需要友情提示的是棒妨,你看到的一大串類似
3628164...882e1e0
的是commit id
(版本號),和 SVN 不一樣含长,Git的commit id
不是1券腔,2,3……遞增的數(shù)字拘泞,而是一個SHA1
計算出來的一個非常大的數(shù)字纷纫,用十六進制表示,而且你看到的commit id
和我的肯定不一樣陪腌,以你自己的為準辱魁。為什么commit id
需要用這么一大串數(shù)字表示呢烟瞧?因為Git是分布式的版本控制系統(tǒng),后面我們還要研究多人在同一個版本庫里工作染簇,如果大家都用1燕刻,2,3……作為版本號剖笙,那肯定就沖突了。
時光機---回退:將工作區(qū)恢復到以前的某個版本
首先请唱,Git必須知道當前版本是哪個版本弥咪,在Git中,用
HEAD
表示當前版本十绑,也就是最新的提交3628164...882e1e0
(注意我的提交ID和你的肯定不一樣)聚至,上一個版本就是HEAD^
,上上一個版本就是HEAD^^
本橙,當然往上100個版本寫100個^扳躬,比較容易數(shù)不過來,所以寫成HEAD~100
甚亭。
現(xiàn)在會退到上一個版本:git reset --hard HEAD^
看贷币,readme.txt
果然回去了:
但是!如果剛才是手殘亏狰,現(xiàn)在想回到add ccccc
的那個版本怎么辦役纹??
——有辦法暇唾!前提是你剛才的窗口還沒關促脉!
辦法其實還是有的,只要上面的命令行窗口還沒有被關掉策州,你就可以順著往上找啊找啊瘸味,找到那個
append GPL
的commit id
是3628164...
,于是就可以指定回到未來的某個版本:
$ git reset --hard 3628164 HEAD is now at 3628164 append GPL
版本號沒必要寫全够挂,前幾位就可以了旁仿,Git會自動去找。當然也不能只寫前一兩位下硕,因為Git可能會找到多個版本號丁逝,就無法確定是哪一個了。
現(xiàn)在梭姓,你回退到了某個版本霜幼,關掉了電腦,第二天早上就后悔了誉尖,想恢復到新版本怎么辦罪既?找不到新版本的commit id
怎么辦?
在Git中,總是有后悔藥可以吃的琢感。當你用git reset --hard HEAD^
回退到add distributed
版本時丢间,再想恢復到append GPL
,就必須找到append GPL
的commit id
驹针。Git提供了一個命令git reflog
用來記錄你的每一次命令:
$ git reflog
ea34578 HEAD@{0}: reset: moving to HEAD^
3628164 HEAD@{1}: commit: append GPL
ea34578 HEAD@{2}: commit: add distributed
cb926e7 HEAD@{3}: commit (initial): wrote a readme file
現(xiàn)在烘挫,你又可以用git reset --hard commit_id
回到未來了!
工作區(qū)--暫存區(qū)--某個分支:
撤銷柬甥,工作區(qū)中饮六,對某個文件最近的修改——即還未stage
的修改
git checkout -- readme.txt
命令
git checkout -- readme.txt
意思就是,把readme.txt
文件在工作區(qū)的修改全部撤銷苛蒲,這里有兩種情況:
- 一種是
readme.txt
自修改后還沒有被放到暫存區(qū)卤橄,現(xiàn)在,撤銷修改就回到和版本庫一模一樣的狀態(tài)臂外; - 一種是
readme.txt
已經(jīng)添加到暫存區(qū)后窟扑,又作了修改,現(xiàn)在漏健,撤銷修改就回到添加到暫存區(qū)后的狀態(tài)嚎货;
總之,就是讓這個文件回到最近一次
git commit
或git add
時的狀態(tài)蔫浆。
上面是撤銷工作區(qū)中的修改厂抖,若想撤銷暫存區(qū)中的呢?
撤銷(unstage)暫存區(qū)中克懊,未提交(commit)的修改忱辅,重新放回工作區(qū):
git reset HEAD readme.txt
刪除文件
修改若添加到了暫存區(qū),則先要恢復暫存區(qū)(git reset HEAD a.txt
)谭溉,再恢復工作區(qū)(git checkout -- a.txt
)墙懂。
連接 Github
注冊賬戶之后,首先需要在 Github 上對本機添加信任(SSH, RSA)扮念,步驟损搬;
完成后在 Github 上可以看到:
接下來在 Github 上新建一個空的倉庫,然后把本地的倉庫與之關聯(lián)柜与,將本地倉庫內(nèi)容推送到 Github 倉庫:
git remote add origin https://github.com/xiaogmail/learngit.git
git push -u origin master
或者巧勤,遠程倉庫已經(jīng)存在,從遠程倉庫克隆到本地:
git clone https://github.com/xiaogmail/learngit.git
創(chuàng)建與合并分支
git checkout -b dev
:創(chuàng)建并切換到dev
分支弄匕;
上面相當于以下兩條命令:
git branch dev
:創(chuàng)建dev
分支颅悉;
git checkout dev
:切換到dev
分支;
用git branch
查看分支:
現(xiàn)在迁匠,在readme.txt
中加一行new branch
然后提交(到dev
分支)剩瓶,再git branch master
切換回master
分支:
這時你發(fā)現(xiàn)驹溃,readme.txt
中最后一行new branch
不見了!(用Notepad++需要關閉并重新打開文件)——因為回到了master
分支延曙!
現(xiàn)在豌鹤,把dev
分支的內(nèi)容合并到master
分支上:git merge dev
這時會發(fā)現(xiàn)readme.txt
中new branch
的內(nèi)容又回來了;
注意到上面的
Fast-forward
信息枝缔,Git告訴我們布疙,這次合并是“快進模式”,也就是直接把master
指向dev
的當前提交愿卸,所以合并速度非彻樟桑快。
當然擦酌,也不是每次合并都能Fast-forward
,我們后面會講其他方式的合并菠劝。
合并完成后的分支狀態(tài):
合并完成后赊舶,就可以放心的刪除dev
分支了:git branch -d dev
;
因為創(chuàng)建赶诊、合并和刪除分支非沉剑快,所以 Git 鼓勵你使用分支完成某個任務舔痪,合并后再刪掉分支寓调,這和直接在 master 分支上工作效果是一樣的,但過程更安全锄码。
解決沖突
現(xiàn)在夺英,你在dev
上新增一個提交,切換回master
滋捶,在master
上也新增一個提交痛悯,變成了這樣:
這時你用git merge dev
合并分支:
其中,dev 中 readme.txt 最后一行是 "dev new line"重窟,master 中是 "master new line"载萌;
這時發(fā)現(xiàn),readme.txt 的內(nèi)容變了:
Git 用 <<<<<<<扭仁,=======,>>>>>>> 標記出不同分支的內(nèi)容
注意上面最后一句話:“Automatic merge failed; fix conficts and then commit the result.”——現(xiàn)在還處于 merge 狀態(tài)厅翔,只不過需要你手動完成乖坠。
我修改為如下:
然后提交,git add readme.txt
刀闷,git commit -m 'fix conflicts.'
這樣瓤帚,merge 操作才算手動完成描姚,現(xiàn)在造虎,分支圖:
看懂分支圖的變化:綠線表示在 master 分支上將 dev 分支的內(nèi)容合并進來洒闸,但 feature1 是不變的!它是被合并的那一個可柿!不動怯邪!
仔細想想合并的過程绊寻。同一個文件,稍微有點不一樣悬秉,就會發(fā)生沖突澄步;這時只能手動決定合并后的內(nèi)容——亦即,隨便改和泌,隨你村缸。
“ 首先 git branch一下你在哪個分支上,本節(jié)的例子出現(xiàn)上面的文本應該時在 master 上武氓。那么對于這個文本梯皿,想怎么改就怎么改,改成合并后你想要的文本就行县恕。甚至不修改东羹,直接保持上面原文。只要在 merge 操作提示沖突后再進行一個 add 和 commit 忠烛,至于進行這個操作前你對 master 分支里的 readme.txt 進行怎樣的修改都行 修改完畢后属提,git add 然后 git commit,就已經(jīng) merge 了美尸。”——網(wǎng)友討論冤议。
所以,git merge 只是一種嘗試师坎,或者一種提示求类;根據(jù)沖突的提示,由你來決定合并后的版本屹耐。合并過程與兩個涉及到的分支都沒關系尸疆。
機智網(wǎng)友的討論:
我說一點自己的理解,不知道對不對盎塘搿寿弱?造成沖突的原因就是多個分支同時對同一文件進行了修改,有點像是樹節(jié)點有了多個兒子按灶,當合并時症革,HEAD就不知道該往哪里走了,所以只能保留某一個分支的修改內(nèi)容鸯旁,然后進行合并噪矛。所以量蕊,在實際中,我們在同一時間應該利用某一個分支最好只操作固定的文件艇挨,避免沖突的發(fā)生残炮?不知道我以上說的對不對。
你說的這種辦法絕對不會造成沖突缩滨,可是我們在工作學習中不能削足適履吧势就?已經(jīng)提供了這種在不同分支中沖突的解決辦法,為什么還要害怕沖突產(chǎn)生呢脉漏?
當兩條分支對同一個文件的同一個文本塊進行了不同的修改苞冯,并試圖合并時,Git不能自動合并的侧巨,稱之為沖突(conflict)舅锄。解決沖突需要人工處理
廖老師,你好司忱,我 merge 成功之后(已解決了沖突)皇忿,發(fā)現(xiàn) master 分支和 feature1 分支中的 readme.txt 的內(nèi)容不一樣....
廖雪峰:對,因為你解決沖突后 master 多了一個新的 commit烘贴,正常情況可以把 master 再 merge 到 feature1 使兩者保持一致
正常情況可以把 master 再 merge 到 feature1 使兩者保持一致,不過沒有必要撮胧,因為之前 merge 過了桨踪,并且已經(jīng)修改過了(解決沖突)。修改之后 feature1 就沒有作用了芹啥,可以刪掉锻离。
master 是穩(wěn)定版,然后你此時要開發(fā)一個功能 a墓怀,你開一個新分支去開發(fā)汽纠,開發(fā)完后再合并到 master,這時 master 才有功能a傀履,大概這樣吧…
用帶參數(shù)的 git log 查看分支的合并情況:
git log --graph --pretty=oneline --abbrev-commit
分支管理策略
之前合并分支時虱朵,默認用的是Fast-forward
模式,但這種模式下钓账,刪除分支后碴犬,會丟掉分支信息。
默認的Fast-forward
和用參數(shù)--no-ff
關閉快速模式:
刪除dev
分支后再看:
重新做了個實驗梆暮,在 master 中新建 a.txt服协,空的;新建并切換到分支 dev啦粹,分3次添加 aaaa偿荷,bbbb窘游,cccc;再切換回 master跳纳,合并忍饰,分別用默認 Fast-forward 和 --no-ff ;最后刪除 dev 分支棒旗,查看分支圖:
也許最關鍵的后果是喘批,造成了 dev 分支 commit 記錄和 master 的 commit 記錄的混亂吧。想想 Fast-forward 的實現(xiàn)方式铣揉,移動指針饶深。
而用 --no-ff 就可以在即使 dev 刪除后也能保留 dev 的 commit 記錄,清晰的區(qū)分開來逛拱。
另敌厘,當有沖突時,就不再是 Fast-forward 了(你都動手了)朽合,這時就轉為了 --no-ff俱两,自然可以保留 dev 分支記錄 or 合并記錄。不要迷惑了曹步。
下面這張圖完美解釋了這個問題宪彩!
問題的關鍵點在于 master 有沒有diverged!**
分支策略
在實際開發(fā)中讲婚,我們應該按照幾個基本原則進行分支管理:
首先尿孔,master
分支應該是非常穩(wěn)定的,也就是僅用來發(fā)布新版本筹麸,平時不能在上面干活活合;
那在哪干活呢?干活都在dev
分支上物赶,也就是說白指,dev
分支是不穩(wěn)定的,到某個時候酵紫,比如1.0版本發(fā)布時告嘲,再把dev分支合并到master
上,在master
分支發(fā)布1.0版本奖地;
你和你的小伙伴們每個人都在dev
分支上干活状蜗,每個人都有自己的分支,時不時地往dev
分支上合并就可以了鹉动。
所以轧坎,團隊合作的分支看起來就像這樣:
合并分支時,加上--no-ff
參數(shù)就可以用普通模式合并泽示,合并后的歷史有分支缸血,能看出來曾經(jīng)做過合并蜜氨,而Fast forward
合并就看不出來曾經(jīng)做過合并。
保存當前工作 [現(xiàn)場]
在切換分支前捎泻,當前的工作現(xiàn)場必須是“working tree clean”的狀態(tài)飒炎;即不能有沒 staged 的修改,或未 commit 的 stage笆豁;否則在切換前會有提示:
Your local changes to the following files would be overwritten by checkout: a.txt. Please commit your changes or stash them before you switch branches. Aborting.
提示要么提交郎汪,要么 stash,隱藏當前工作現(xiàn)場闯狱;
git stash
:保存并隱藏當前工作現(xiàn)場煞赢,待以后恢復;(stash:隱藏)
然后就可以愉快的切換分支了哄孤。
再回來照筑,用git stash list
查看隱藏的工作現(xiàn)場:
然后用git stash pop
恢復并刪除分支:
-
git stash apply
:恢復工作現(xiàn)場; -
git stash drop
:刪除隱藏的工作現(xiàn)場瘦陈; -
git stash pop
:恢復并刪除凝危;
修復bug時,我們會通過創(chuàng)建新的bug分支進行修復晨逝,然后合并蛾默,最后刪除;
當手頭工作沒有完成時捉貌,先把工作現(xiàn)場git stash一下支鸡,然后去修復bug,修復后昏翰,再git stash pop苍匆,回到工作現(xiàn)場刘急。
刪除分支時的一點小問題
軟件開發(fā)中棚菊,總有無窮無盡的新的功能要不斷添加進來。
添加一個新功能時叔汁,你肯定不希望因為一些實驗性質的代碼统求,把主分支搞亂了,所以据块,每添加一個新功能码邻,最好新建一個feature分支,在上面開發(fā)另假,完成后像屋,合并,最后边篮,刪除該feature分支己莺。
但就在 feature 分支的新功能開發(fā)完畢奏甫,切換回 dev 分支準備合并時,接到上級命令凌受,因經(jīng)費不足阵子,新功能必須取消!
雖然白干了胜蛉,但是這個分支還是必須就地銷毀:git branch -d dev
但是提示:dev 分支還沒有被合并挠进,如果確定要刪除,用git branch -D dev
照做誊册,OK.
多人協(xié)作
當你從遠程倉庫克隆時领突,實際上Git自動把本地的 master 分支和遠程的master 分支對應起來了,并且解虱,遠程倉庫的默認名稱是 origin 攘须。
git remote
:查看遠程倉庫信息;
或者git remote -v
查看更詳細的信息:
上面顯示了可以抓取和推送的 origin 的地址殴泰。如果沒有推送權限于宙,就看不到 push 的地址。
git push origin <branch-name>
:推送某個分支到遠程倉庫悍汛;
原來你的遠程 origin 倉庫里只有 master 分支捞魁,現(xiàn)在你推送 dev 分支,那么 origin 里就會新出現(xiàn)一個 dev 分支离咐。origin 是 倉 庫 名 谱俭,可以容納很多分支。
現(xiàn)在宵蛀,另一個人參與進來昆著,他在他的電腦上 clone 這個倉庫:git clone https://xxxxxx.git
,但是术陶,他用git branch
查看分支時凑懂,發(fā)現(xiàn) 只 能 [看 到] master 分支,dev 分支 [看] 不 到N喙:
是的塘匣,這時需要你手動把他找出來:
git checkout -b dev origin/dev
我這里為什么猜測是 [看不到]脓豪,而不是根本沒有拷貝下來?因為這句命令回車后沒有拷貝的過程忌卤!瞬間完成扫夜。
就行來就可以在本地的 dev 分支上繼續(xù)工作了。
多人協(xié)作
完整故事看這里。
多人協(xié)作的工作模式通常是這樣:
- 首先笤闯,可以試圖用
git push origin branch-name
推送自己的修改现拒; - 如果推送失敗,則因為遠程分支比你的本地更新望侈,需要先用
git pull
試圖合并印蔬; - 如果合并有沖突,則解決沖突脱衙,并在本地提交侥猬;
- 沒有沖突或者解決掉沖突后,再用
git push origin branch-name
推送就能成功捐韩!
如果git pull
提示 “no tracking information”退唠,則說明本地分支和遠程分支的鏈接關系沒有創(chuàng)建,用命令git branch --set-upstream-to=origin/branch-name
荤胁。
這就是多人協(xié)作的工作模式瞧预,一旦熟悉了,就非常簡單仅政。
使用標簽
標簽(tag)也指向某個 commit垢油,作用是為某次 commit 取個別名——因為 commit id 是一串無規(guī)律的數(shù)字,記不住圆丹。類似于 ip 地址和域名的關系滩愁。
其余
- 忽略某些文件時,需要編寫
.gitignore
辫封; -
.gitignore
文件本身要放到版本庫里硝枉,并且可以對.gitignore
做版本管理!
為命令配置別名
上面哪個顯示分支圖的命令還記得嗎倦微?
git log --graph --pretty=oneline --abbrev-commit
妻味;
還有一個顏色、格式更好欣福,但更長的版本:
git log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
太長了,記不住怎么辦劣欢?設置一個別名棕诵。
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
lg
就是后面一大串的別名裁良。
然后就可以git lg
了凿将!
git 全局的配置文件在C:\Users\xiao\.gitconfig
:
Done!
終于到了期末總結的時刻了价脾!
經(jīng)過幾天的學習牧抵,相信你對Git已經(jīng)初步掌握。一開始,可能覺得Git上手比較困難犀变,尤其是已經(jīng)熟悉SVN的童鞋妹孙,沒關系,多操練幾次获枝,就會越用越順手蠢正。
Git雖然極其強大,命令繁多省店,但常用的就那么十來個嚣崭,掌握好這十幾個常用命令,你已經(jīng)可以得心應手地使用Git了懦傍。