# Git學習
>inus在1991年創建了開源的Linux,從此,Linux系統不斷發展,已經成為最大的服務器系統軟體了。
Linus雖然創建了Linux,但Linux的壯大是靠全世界熱心的志愿者參與的,這么多人在世界各地為Linux撰寫代碼,那Linux的代碼是如何管理的呢?
事實是,在2002年以前,世界各地的志愿者把源代碼檔案通過diff的方式發給Linus,然后由Linus本人通過手工方式合并代碼!
你也許會想,為什么Linus不把Linux代碼放到版本控制系統里呢?不是有CVS、SVN這些免費的版本控制系統嗎?因為Linus堅定地反對CVS和SVN,這些集中式的版本控制系統不但速度慢,而且必須聯網才能使用。有一些商用的版本控制系統,雖然比CVS、SVN好用,但那是付費的,和Linux的開源精神不符。
不過,到了2002年,Linux系統已經發展了十年了,代碼庫之大讓Linus很難繼續通過手工方式管理了,社區的弟兄們也對這種方式表達了強烈不滿,于是Linus選擇了一個商業的版本控制系統BitKeeper,BitKeeper的東家BitMover公司出于人道主義精神,授權Linux社區免費使用這個版本控制系統。
安定團結的大好局面在2005年就被打破了,原因是Linux社區牛人聚集,不免沾染了一些梁山好漢的江湖習氣。開發Samba的Andrew試圖破解BitKeeper的協議(這么干的其實也不只他一個),被BitMover公司發現了(監控作業做得不錯!),于是BitMover公司怒了,要識訓Linux社區的免費使用權。
Linus可以向BitMover公司道個歉,保證以后嚴格管教弟兄們,嗯,這是不可能的。實際情況是這樣的:
Linus花了兩周時間自己用C寫了一個分布式版本控制系統,這就是Git!一個月之內,Linux系統的原始碼已經由Git管理了!牛是怎么定義的呢?大家可以體會一下。
Git迅速成為最流行的分布式版本控制系統,尤其是2008年,GitHub網站上線了,它為開源專案免費提供Git存盤,無數開源專案開始遷移至GitHub,包括jQuery,PHP,Ruby等等.
歷史就是這么偶然,如果不是當年BitMover公司威脅Linux社區,可能現在我們就沒有免費而超級好用的Git了。
## 名詞解釋
`HEAD` HEAD就相當于指標一樣。他指向的版本就是當前顯示的版本,可以理解為版本游走器,可以在任意版本之間穿梭。
## 概念解釋
* 作業區
`作業區`可以理解為當前檔案夾中的所有檔案,它是可見的。
對`作業區`的檔案進行修改、添加、洗掉、新增后可以通過`git add` 命令將檔案添加到`暫存區`
* 暫存區
`暫存區`我理解為是對作業區的一個復制和實時更新。只要`作業區`的某個檔案發生了變化,就會立馬修改檔案狀態
可以通過`git commit -m'XXX'`命令將檔案提交到`當前分支`
`暫存區`是關鍵的一環,我認為它是最不好理解的一部分。因為它不可見。
* 暫存區追蹤修改
git追蹤管理的是修改,而不是檔案。
git修改的定義:對檔案的增刪改查都叫修改。
git是如何跟蹤修改的:對于每次的修改,如果不`git add`到`暫存區`就不會加入到`commit`中
* 當前分支
`分支`的概念我現在經常用,但是還有些模糊。
現在的理解就是一個分支就是一個生產大隊。
首先創建一個`分支`
然后通過一系列的`git add` 和 `git commit` 來完成`當前分支`的開發任務。
## bug分支
__前景提要:__
當正在開發中出現bug時,可以創建一個bug分支`bug-001`分支來修復,但是你在`develop`分支上的任務還沒完成,
也不能提交,因為你現在的開發還需要好幾天才能完成,但是這個bug比較緊急,需要立馬完成提交。
此時,就用到了git的`git stash`功能,將正在開發的作業現場“存盤”起來。等以后恢復現場后繼續作業。
__操作步驟:__
* `git stash` 將現場保存
* `git status` 確認當前分支是干凈的
* `git checkout master` 假如你正在develop分支開發,切換到master分支修bug
* `git checkout -b bug-001` 創建bug分支并切換到bug分支
* ... ... 修復中
* `git add` ,`git commit -a`
* `git merge master` 合并到master上
* `git chekcout develop` 切換到develop分支繼續干活
* `git stash pop` 恢復作業現場,同時把stash內容洗掉
也可以 `git stash appli` 現場恢復 然后`git stash drop` 洗掉stash內容
* `git stash list` 可以查詢剛剛的作業現場保存到哪個分支了
## 命令
* `git diff` + file
可以查看當前檔案被修改的地方
* `git status`
查看當前檔案狀態
* `git add`
把檔案添加到`暫存區`或者是把修改檔案添加到`暫存區`
* `git commit -m'XXX'`
把`暫存區`的所有內容提交到當前分支
* `git log`
查看日志 當前日志中存在一個commit id `b1a87`這樣的東西
* `git reflog`
這是一個查看commit id的命令,如果沒有用`git log` 那么久用這個命令去選擇你要去哪個版本。
* `git reset --hard HEAD^`
可以回退到當前版本的上一個版本,如果想回退到上上一個版本就 `git reset --hard HEAD^^` 如果要回退到上上上個就`git reset --hard HEAD~3` 以此類推
* `git checkout -- file`
亂改了`作業區`的某個檔案想要,想要直接丟棄`作業區`的修改
* `git reset HEAD file`
不但亂改了`作業區`的某個檔案,還`commit`到了`暫存區`時可以用這個命令退回到為添加到`作業區`的狀態,也就是`git add`之前
* `git branch`
查看分支
* `git branch <name>`
創建分支
* `git checkout <name>`
切換分支
* `git checkout -b <name>`
創建+切換分支
* `git merge <name>`
合并某分支到當前分支
* `git branch -d <name>`
洗掉分支
* `git log --graph --pretty=oneline --abbrev-commit`
可以查看分支合并圖
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/39541.html
標籤:網絡通信/分布式開發
上一篇:Delphi 的畫弧問題
