git的使用與設(shè)計思想

cover

生活中常常有這樣的場景,你寫一個文檔屹堰,想退回以前的某個狀態(tài),但發(fā)現(xiàn)沒有以前的存檔街氢〕都或者很多人協(xié)作做一個東西(比如和你的對象一起寫小說),但發(fā)現(xiàn)大家各自做的東西總是有沖突珊肃。遇到這樣的情況怎么辦呢(恐慌臉)荣刑,別怕,今天我給大家深入淺出的介紹一下git的基本的使用技巧伦乔。

首先厉亏,git是一個分布式版本控制系統(tǒng)。分布式版本控制烈和,意味著版本庫分布在每一個人的電腦上爱只,這樣你修改完后能直接提交到本地版本庫,如果別人要得到你的修改從你那復(fù)制一份就好了招刹。當(dāng)然恬试,一般我們會拿一臺中央服務(wù)器用來交換大家的修改沥匈。

給大家介紹一下安裝git的方法,這里是安裝git的方法

好的忘渔,我沒有偷懶高帖。

大家現(xiàn)在在命令行里輸入git,按回車畦粮,先看一下它的輸出散址,上面包括的最基本的用法簡介。
初次使用git宣赔,需要設(shè)置你的郵箱和名字预麸,比如:

$ git config --global user.name "Tian Flower Flower"
$ git config --global user.email flower@example.com

接著給大家介紹一下怎么使用這項強大的工具和你的小伙伴一起敲代碼。

首先建立一個空文件夾儒将,打開終端(windows用戶搜索cmd)吏祸,進(jìn)入那個文件夾下,然后輸入git init钩蚊,這時候那個文件夾就被git初始化了贡翘。還有一種初始化的方式,假如對方已經(jīng)寫了一部分代碼砰逻,你可以直接git clone 下來他的倉庫地址鸣驱。被git初始化后,文件夾就會出現(xiàn)一個新的隱藏文件夾.git蝠咆,于一個 Git 倉庫來說踊东,其 .git 目錄保存了整個 Git 項目的所有數(shù)據(jù)與資源。

現(xiàn)在你的目錄下有三個文件(它們已經(jīng)在本地倉庫里了),sing.py,dance.py,read.py刚操,然后你對它們每個文件都加了一行代碼闸翅。那么問題來了,你想提交到本地倉庫的時候附加上提交的備注菊霜,"修改了音樂的部分"和"修改了閱讀的部分"坚冀,你需要先提交sing.py、dance.py占卧,再提交read.py遗菠。同時為了便于管理這些文件联喘,git還會對這些文件建立狀態(tài)文件(你輸入git status就能看到狀態(tài)华蜒,輸入git status --help可以查看具體的參數(shù),其它的命令也是后面加個--help)豁遭。因為git一般是在命令行里使用的叭喜,所以為了便于添加文件,記錄文件狀態(tài)蓖谢,git有了暫存區(qū)的概念捂蕴,你可以通過git add sing.py dance.py將文件添加到暫存區(qū)譬涡,這個時候輸入git status,會發(fā)現(xiàn):

~/gitPresentation  master ?                                                                                                                                                              ? ?  
? git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

    new file:   dance.py
    new file:   sing.py

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    read.py

由上面的信息可以看到dance.py和sing.py已經(jīng)被加入到了暫存區(qū)啥辨,changes to be commited就是告訴你這些變化待提交涡匀,(use "git rm --cached <file>..." to unstage)是告訴你可以用那個命令把文件從暫存區(qū)里弄出去。下半部分就是沒有在暫存區(qū)的溉知。

然后git commit -m "your message"就可以提交到本地倉庫了陨瘩。read.py的操作也是git add 然后 git commit。

這個時候我們查看一下.git/objects

~/gitPresentation  master ?                                                                                                                                                               0m  
? find .git/objects -type f
.git/objects/fe/80e07a67b964e66cf2ac5abb611c3e4b351b33
.git/objects/d3/c9a190f400e0f4e5837c25be288540945e1492
.git/objects/b4/43902473907ac4832f821db909f98964ee9f3e
.git/objects/9d/9991b2ac7598604dad272072a4979fb48abddc
.git/objects/f0/2275089261d075a1b33ddb281c310d2365cb04
.git/objects/60/59d3d2e913d238833e9cf2707b5379794fafb3
.git/objects/7d/a981ddf41583e61b41385ca86c7ba5953bc545

可以看到這里有了很多對象级乍,那這個時候我們給read.py增加一個空行舌劳,提交后再輸入一下這個命令:

~/gitPresentation  master ?                                                                                                                                                               0m  
? find .git/objects -type f                             
.git/objects/fe/80e07a67b964e66cf2ac5abb611c3e4b351b33
.git/objects/36/f4d833fae786bf32082e289808bc8988c039d2
.git/objects/d3/c9a190f400e0f4e5837c25be288540945e1492
.git/objects/6d/fbda7939f771046777e8858bc4d742b4be5e2c
.git/objects/b4/43902473907ac4832f821db909f98964ee9f3e
.git/objects/9d/9991b2ac7598604dad272072a4979fb48abddc
.git/objects/f0/2275089261d075a1b33ddb281c310d2365cb04
.git/objects/60/59d3d2e913d238833e9cf2707b5379794fafb3
.git/objects/7d/a981ddf41583e61b41385ca86c7ba5953bc545
.git/objects/7d/9a8143b3d66a8cb5178f7b780015bcfdaa46ea

可以發(fā)現(xiàn)對象變多了。
你每次修改文件提交后git都會把修改后的文件完整的存儲起來玫荣。你可能想git為什么不每次記錄修改的地方甚淡,按前面那種方法太浪費空間了。其實是可以的捅厂,git默認(rèn)使用松散對象來存儲文件贯卦,當(dāng)太多空間被浪費,或者推送到遠(yuǎn)程服務(wù)器的時候焙贷,git會調(diào)用git gc脸侥,來將松散對象打包好,來節(jié)省空間盈厘,在打包好的packfile中睁枕,git只存儲變化的部分,然后用一個指針指向之前的文件沸手。

我們可以手動調(diào)用git gc來試一下:

~/gitPresentation  master ?                                                                                                                                                              16m  
? git count-objects -v                                  
count: 10
size: 40
in-pack: 0
packs: 0
size-pack: 0
prune-packable: 0
garbage: 0
size-garbage: 0

~/gitPresentation  master ?                                                                                                                                                              16m  
? git gc
Counting objects: 10, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (10/10), done.
Writing objects: 100% (10/10), done.
Total 10 (delta 0), reused 0 (delta 0)

~/gitPresentation  master ?                                                                                                                                                              16m  
? git count-objects -v
count: 0
size: 0
in-pack: 10
packs: 1
size-pack: 2
prune-packable: 0
garbage: 0
size-garbage: 0

~/gitPresentation  master ?                                                                                                                                                              16m  
? find .git/objects -type f
.git/objects/pack/pack-2c2c342dc3d81f01aa69d2bd2eedf5d4429264d9.pack
.git/objects/pack/pack-2c2c342dc3d81f01aa69d2bd2eedf5d4429264d9.idx
.git/objects/info/packs

~/gitPresentation  master ?                                                                                                                                                              16m  
? ls
dance.py  read.py  sing.py

可以看到之前那十個松散對象都被打包好了外遇。

現(xiàn)在你想寫有關(guān)巴赫的代碼,你的朋友想寫有關(guān)莫扎特的代碼契吉,于是為了避免沖突跳仿,你創(chuàng)建了一個叫巴赫的分支,你的朋友創(chuàng)建了一個叫莫扎特的分支捐晶。(這里提醒一下菲语,git pull默認(rèn)只獲取遠(yuǎn)程的master分支,如果要checkout到遠(yuǎn)程其它的分支惑灵,首先要git branch -r山上,然后checkout到對應(yīng)的分支。)

現(xiàn)在你先checkout到Bach分支英支,進(jìn)行魔改操作佩憾,然后提交:

~/gitPresentation  master ?                                                                                                                                                              22m  
? git checkout Bach
Switched to branch 'Bach'

~/gitPresentation  Bach ?                                                                                                                                                                29m  
? ls
dance.py  read.py  sing.py

~/gitPresentation  Bach ?                                                                                                                                                                29m  
? vim note.py 

~/gitPresentation  Bach ?                                                                                                                                                              31m ?  
? git add note.py 

~/gitPresentation  Bach ?                                                                                                                                                              31m ?  
? git commit -m "note"
[Bach 4f38850] note
 1 file changed, 5 insertions(+)
 create mode 100644 note.py

~/gitPresentation  Bach ?                                                                                                                                                                 0m  
? git log --oneline
4f38850 (HEAD -> Bach) note
36f4d83 (master, Mozart) add a empty line
b443902 read.py
7da981d music

你先把Bach分支合并到master分支:

~/gitPresentation  master ?                                                                                                                                                              37m  
? git merge Bach
Updating 36f4d83..4f38850
Fast-forward
 note.py | 5 +++++
 1 file changed, 5 insertions(+)
 create mode 100644 note.py
~/gitPresentation  master ?                                                                                                                                                               9m  
? git log --oneline
4f38850 (HEAD -> master, Bach) note
36f4d83 add a empty line
b443902 read.py
7da981d music

你的朋友在Mozart分支下也創(chuàng)建了一個note.py。然后你想把Mozart分支也合并到master分支,那么問題來了妄帘,Mozart分支下也有note.py楞黄,內(nèi)容差不多,和master分支下的note.py沖突了抡驼,我們可以git diff一下:

~/gitPresentation  master ?                                                                                                                                                              11m  
? git diff master Mozart 
diff --git a/note.py b/note.py
index ce070d4..0c85471 100644
--- a/note.py
+++ b/note.py
@@ -1,5 +1,5 @@
 def note():
-    print('note')
+    print('Mozart')
 
 if __name__ == '__main__':
     note()

可以看出來有不同的地方鬼廓,我們需要手動處理沖突。
這里講一下git merge是如何判斷沖突的致盟,貼一段官方文檔里的話:

For conflicting paths, the index file records up to three versions: stage 1 stores the version from the common ancestor, stage 2 from HEAD, and stage 3 from MERGE_HEAD (you can inspect the stages with git ls-files -u). The working tree files contain the result of the "merge" program; i.e. 3-way merge results with familiar conflict markers <<< === >>>.

就是說兩個分支合并桑阶,先和公共的基點做對比,不然勾邦,要是一個分支比另一個分支多一個文件蚣录,你怎么知道是a分支增加了一個文件,還是b分支刪除了一個文件眷篇。

手動處理沖突后萎河,我們進(jìn)行合并,然后查看提交歷史:

~/gitPresentation  master ?                                                                                                                                                              25m  
? git merge Mozart 
Merge made by the 'recursive' strategy.

~/gitPresentation  master ?                                                                                                                                                               0m  
? git log --graph --oneline
*   0cfd35e (HEAD -> master) Merge branch 'Mozart'
|\  
| * cf331f2 (Mozart) solve
| * 756753d Mozart not
* | 4f38850 (Bach) note
|/  
* 36f4d83 add a empty line
* b443902 read.py
* 7da981d music

可以看到現(xiàn)在Bach分支和Mozart分支都已經(jīng)合并到了master分支蕉饼,此時要記住最好刪除Bach分支和Mozart分支虐杯,避免歷史混亂。

git還有一種合并方法叫rebase昧港,它的原理是將另一條分支上面提交的commit在master上重演一遍擎椰,但是因為rebase會改寫歷史記錄,所以不要在公共分支上用rebase创肥,不然可能一不小心达舒,你的朋友們都會仇恨你。不過這里提一個有用的rebase命令叹侄,如果你想修改上一個commit信息巩搏,自然是用git commit --amend,但是修改很久之前的呢趾代,可以用git rebase -i(查看git rebase --help的INTERACTIVE MODE)贯底。

好,git今天就簡單的講到這了撒强,謝謝大家禽捆。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市飘哨,隨后出現(xiàn)的幾起案子胚想,更是在濱河造成了極大的恐慌,老刑警劉巖杖玲,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件顿仇,死亡現(xiàn)場離奇詭異,居然都是意外死亡摆马,警方通過查閱死者的電腦和手機(jī)臼闻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來囤采,“玉大人述呐,你說我怎么就攤上這事〗短海” “怎么了乓搬?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長代虾。 經(jīng)常有香客問我进肯,道長,這世上最難降的妖魔是什么棉磨? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任江掩,我火速辦了婚禮,結(jié)果婚禮上乘瓤,老公的妹妹穿的比我還像新娘环形。我一直安慰自己,他們只是感情好衙傀,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布抬吟。 她就那樣靜靜地躺著,像睡著了一般统抬。 火紅的嫁衣襯著肌膚如雪火本。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天聪建,我揣著相機(jī)與錄音发侵,去河邊找鬼。 笑死妆偏,一個胖子當(dāng)著我的面吹牛刃鳄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播钱骂,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼叔锐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了见秽?” 一聲冷哼從身側(cè)響起愉烙,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎解取,沒想到半個月后步责,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年蔓肯,在試婚紗的時候發(fā)現(xiàn)自己被綠了遂鹊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡蔗包,死狀恐怖秉扑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情调限,我是刑警寧澤舟陆,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站耻矮,受9級特大地震影響秦躯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜裆装,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一踱承、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧米母,春花似錦勾扭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至慧耍,卻和暖如春身辨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背芍碧。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工煌珊, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人泌豆。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓定庵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親踪危。 傳聞我的和親對象是個殘疾皇子蔬浙,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容

  • git作為時下最流行的代碼管理工具,Git權(quán)威指南總結(jié)了十條喜歡Git的理由: 異地協(xié)同工作贞远; 現(xiàn)場版本控制畴博; 重...
    古斟布衣閱讀 1,824評論 0 12
  • 1.設(shè)置 初次使用需要設(shè)置姓名和郵箱git config --global user.name "git用戶名"g...
    jrg陳咪咪sunny閱讀 758評論 0 1
  • 1.git的安裝 1.1 在Windows上安裝Git msysgit是Windows版的Git,從https:/...
    落魂灬閱讀 12,664評論 4 54
  • 1. 冬天的早上官疲,寒風(fēng)瑟瑟,天剛蒙蒙亮亮隙,我依然6點半下樓等班車途凫。 每天早上一位環(huán)衛(wèi)阿姨都帶著她那條長得很高大的狗在...
    北方的橙子閱讀 518評論 2 3
  • flex基于水平和垂直的兩條基準(zhǔn)線進(jìn)行布局。 理解了這一點剩下的看文檔就好了~ 水平軸 默認(rèn)的flex布局是按水平...
    云峰yf閱讀 896評論 0 0