寫在前面
Git作為目前世界上最先進的分布式版本控制系統(tǒng)阳仔,可以算是程序員必備技能了近范。
一直都知道學(xué)會它的重要性评矩,但就是沒有花時間好好學(xué)習(xí)一下斥杜。這兩天借跑實驗數(shù)據(jù)的時間蔗喂,打算好好學(xué)習(xí)一下,認真靜下心來畦粮,沒有什么問題是真的學(xué)不會的吧宣赔。
發(fā)現(xiàn)自己最近心理素質(zhì)真是蹭蹭蹭的開始往上漲了哈哈哈~~~
(一) Git 基本入門
1. 安裝Git
- 在linux下安裝Git很簡單儒将,只需要輸入以下語句就可以了:
sudo apt-get install git
- 初始配置: 作為分布式版本控制系統(tǒng)椅棺,每個機器都必須自報家門两疚,Git需要知道我們的用戶名和email诱渤,需在在命令行進行如下配置勺美。
git config --global user.name "YourName" git config --global user.email "email@example.com"
2. 創(chuàng)建版本庫
- 進入到自己想創(chuàng)建版本庫的目錄
- 輸入指令:
git init
如圖所示缎脾,會在目錄中創(chuàng)建.git
的目錄遗菠,這個目錄就是Git用來跟蹤管理版本庫的辙纬。
3. 文件添加進版本庫
-
git add filename
將文件名為filename
的文件添加進倉庫贺拣,可以多個文件名并列譬涡,用空格隔開昂儒。 -
git add --all
命令將當(dāng)前所有文件添加進倉庫渊跋; - 注: 這里
git add
只是相當(dāng)于選中的功能拾酝,還沒有放進去蒿囤。 -
git commit -m "describe it"
命令執(zhí)行將文件提交到倉庫的操作材诽,這個時候才放進去了。 - 要使用Git進行管理的文件一定要在當(dāng)前目錄下建邓,即與
.git
文件夾處于同級官边,否則Git找不到它注簿。
4. 查看倉庫狀態(tài): git status
-
git status
可以隨時倉庫當(dāng)前狀態(tài)诡渴,查看已經(jīng)命令過但還未經(jīng)提交到倉庫的所有操作玩徊,可以看成是待處理事項列表。 - 原來的我們加入的文件
1.txt
是空的胶哲,什么內(nèi)容都沒有潭辈,現(xiàn)在嘗試輸入一點內(nèi)容把敢。
如圖所示婶恼,git可以檢測到我們對文件做了改動勾邦,但還沒有準(zhǔn)備提交的命令下達眷篇。
5. 查看更改內(nèi)容:git diff
-
git status
命令我們只知道做了修改蕉饼,但是還不知道具體修改的內(nèi)容 -
git diff
這個命令就幫助我們解決這個問題。
現(xiàn)在就可以知道我在文檔里加入的是什么內(nèi)容了厦幅。
6. 更新文件
文件如果修改過确憨,提交修改和提交新文件是一樣的休弃。
git add 1.txt
git commit -m "modify 1.txt"
7. 查看操作記錄:git log
-
git log
會打印我們對倉庫所作的操作記錄 -
git log --pretty oneline
單行打印歷史操作記錄 - 輸出的一大串?dāng)?shù)字屬于
commit id
8. 查看歷史命令: git reflog
- 記錄了每一次命令
- 可以在版本回退時用來恢復(fù)到未來的狀態(tài)查找版本號
(二) Git 版本管理入門
1. 版本回退: git reset
- 每一次
commit
都是對應(yīng)一個版本 -
commit id
是對版本的具體標(biāo)識 -
HEAD
表示當(dāng)前版本 -
HEAD^
表示上一個版本 -
HEAD^^
表示上上版本 -
HEAD~100
表示前100個版本 -
git reset --hard commitId
回退到版本號為commitId
的地方,也可以用HEAD
的形式表示稽坤。 - 穿梭前尿褪,用
git log
查看提交歷史杖玲,以便確定要回退到哪個版本摆马。 - 重返未來囤采,用
git reflog
查看命令歷史蕉毯,以便確定要回到未來的哪個版本恕刘。
2. 工作區(qū)和暫存區(qū)
-
先上一張很經(jīng)典的圖
- 工作區(qū):就是我們在電腦中實際看到的坷澡;
- 版本庫:工作區(qū)中的隱藏目錄
.git
频敛,就是版本庫; - 暫存區(qū):暫存區(qū)的概念很重要着降,理解暫存區(qū)之后對于Git的版本管理會有一個比較清晰的思路任洞。
- master: 這是Git為我們自動創(chuàng)建的第一個分支交掏。
- 我覺得如果把工作區(qū)看成是鍵盤終端輸入盅弛,版本庫中的
master
可以看成是電腦硬盤挪鹏,我們輸入的內(nèi)容首先是到緩存中的讨盒,并不是直接存入硬盤催植。當(dāng)緩存區(qū)滿或者人為發(fā)送指令時才會將緩存區(qū)的內(nèi)容寫入硬盤勺择。 - 以添加和文件修改為例省核,
git add
指令只是選中文件或者其他要提交的修改气忠,將它們添加進暫存區(qū)旧噪。只有使用git commit
指令的時候淘钟,才將暫存區(qū)的所有內(nèi)容提交到當(dāng)前分支米母。
3. 撤銷修改
-
工作區(qū)文件內(nèi)容被修改铁瞒,但還沒有添加到暫存區(qū):那么直接丟棄工作區(qū)的修改慧耍,回到跟版本庫一樣的狀態(tài)芍碧。
git checkout -- file
-
工作區(qū)文件內(nèi)容被修改师枣,并且已經(jīng)添加進暫存區(qū)践美,但還沒有commit:如果這時候直接用上面那條語句陨倡,那么工作區(qū)的文件會恢復(fù)到跟上一次提交到暫存區(qū)的一樣兴革。所以要先將暫存區(qū)的修改撤除,這樣就跟上面的情況一樣庶艾,然后再丟棄工作區(qū)的修改咱揍。
git reset HEAD file git checkout -- file
-
工作區(qū)文件內(nèi)容被修改煤裙,且已經(jīng)提交: 用版本回退
git reset
的方法進行恢復(fù)硼砰。
4. 刪除文件
- 前提:一個文件已經(jīng)提交到版本庫后手動刪除或者
rm file
指令刪除 -
git status
可以看到文件被刪除题翰。 -
確定刪除:那就需要從版本庫中也刪除文件:
git rm file git commit -m "remove file"
-
恢復(fù)文件:刪錯了遍愿,因為版本庫里還有呢沼填,所以可以很輕松地把誤刪的文件恢復(fù)到最新版本:
git checkout -- test.txt
git checkout
其實是用版本庫里的版本替換工作區(qū)的版本坞笙,無論工作區(qū)是修改還是刪除,都可以“一鍵還原”籍茧。
(持續(xù)更新中~~~~)
(三) Git 遠程倉庫
之前學(xué)習(xí)的都是本地倉庫的管理寞冯,但是如果有一個遠程倉庫既可以用來存放又可以在本地倉庫跟遠程倉庫之間進行同步就太好了吮龄。
Github就屬于遠程倉庫漓帚。之前一直覺得Github很難學(xué)尝抖,現(xiàn)在對Git有了一定的了解之后迅皇,至少覺得它不是那么遙不可及的了登颓。
1. Github和Bitbucket的簡單介紹
這兩個都是用的比較多的遠程倉庫管理平臺挺据,在學(xué)習(xí)了一些資料之后做一點歸納性的總結(jié)工作:
- 兩者都可以為你的代碼托管提供幫助扁耐;
- 兩者都可以使用Git進行管理婉称;
- Github更關(guān)注開源王暗,你需要為私有項目付費;
- Bitbucket提供無限的免費私人倉庫科汗,還支持五人團隊開發(fā)头滔;
- 相對來說坤检,GitHub上面的項目資源或更多一些早歇,功能也會強大很多箭跳;
總的來說衅码,建議同時使用GitHub和BItbucket逝段,私人或者暫不適合公開的項目就選擇用Bitbucket管理奶躯,公開項目就放到Github上面嘹黔。
2. 添加遠程倉庫并關(guān)聯(lián)
- 在Github或者BItbucket中創(chuàng)建好一個倉庫
repository
后儡蔓,可以把本地已經(jīng)有的倉庫與之關(guān)聯(lián)疼邀。然后把本地的內(nèi)容推動到遠程倉庫。 - 關(guān)聯(lián)遠程庫获询,使用命令:
git remote add origin git@server-name:path/repo-name.git
- 關(guān)聯(lián)后,使用該命令執(zhí)行第一次推送master分支的所有內(nèi)容:
git push -u origin master
- 以后每次本地倉庫提交之后梢薪,想要將修改同步到遠程倉庫,都可以使用以下命令:
git push origin master
3. 從遠程倉庫克隆
上面我們講的是現(xiàn)有本地倉庫畜疾,然后創(chuàng)建遠程倉庫來同步它的情況印衔。最好的方式是一開始就先創(chuàng)建好遠程庫瞎暑,然后從遠程庫克隆到本地与帆。
- 最簡單的方式是直接點擊遠程倉庫上的‘clone`進行克隆勿她。
- 代碼方式:生成遠程倉庫后都會有一個倉庫地址逢并,使用
git clone
命令進行克隆即可郭卫。常見形式為:
git clone git@server-name:path/repo-name.git
(四) 分支管理
1. 分支需求描述
不完整的改動可以先放到分支上玻蝌,這樣別人看不到分支的內(nèi)容俯树,不會相互影響聘萨。可以直到開發(fā)完畢后,再一次性合并到原來的分支上.
一開始的時候翘贮,master分支是一條線,Git用master指向最新的提交扯再,再用HEAD指向master,就能確定當(dāng)前分支斋竞,以及當(dāng)前分支的提交點:
2. 創(chuàng)建、合并和刪除分支
2.1 原理
-
創(chuàng)建新的分支:當(dāng)我們創(chuàng)建新的分支鳄袍,例如dev時拗小,Git新建了一個指針叫dev哀九,指向master相同的提交,再把HEAD指向dev唇礁,就表示當(dāng)前分支在dev上:
-
Git創(chuàng)建一個分支很快勾栗,增加一個dev指針,改改HEAD的指向. 從現(xiàn)在開始盏筐,對工作區(qū)的修改和提交就是針對dev分支了围俘,比如新提交一次后,dev指針往前移動一步琢融,而master指針不變:
-
合并分支:把dev合并到master上, 最簡單的方法就是直接把master指向dev的當(dāng)前提交界牡,就完成了合并:
-
刪除分支:刪除dev分支就是把dev指針給刪掉,刪掉后就剩下了一條master分支:
2.2 實戰(zhàn)
- take
dev
as an example - 創(chuàng)建分支:
git branch dev
- 切換到分支:
git checkout dev
- 創(chuàng)建+切換分支:
git checkout -b dev
- 查看當(dāng)前分支:
git branch
- 切換到master分支:
git checkout master
- 合并指定分支到當(dāng)前分支:
git merge dev
- 刪除分支:
git branch -d dev
-
git log --graph
命令可以看到分支合并圖宿亡。
3. 分支策略
在實際開發(fā)中,我們應(yīng)該按照幾個基本原則進行分支管理:
- master分支應(yīng)該是非常穩(wěn)定的漠另,也就是僅用來發(fā)布新版本,平時不能在上面干活;
- 干活都在dev分支上,也就是說,dev分支是不穩(wěn)定的,到某個時候,比如1.0版本發(fā)布時柴底,再把dev分支合并到master上鸿脓,在master分支發(fā)布1.0版本幻件;
-
你和你的小伙伴們每個人都在dev分支上干活贺待,每個人都有自己的分支,時不時地往dev分支上合并就可以了绍撞。
4.所以非洲,團隊合作的分支看起來就像這樣:
4. Bug分支
- 修復(fù)bug時梦染,我們會通過創(chuàng)建新的bug分支進行修復(fù)遂铡,然后合并珠增,最后刪除;
- 當(dāng)工作沒有完成時,先把工作現(xiàn)場
git stash
一下桃焕,然后去修復(fù)bug. - 修復(fù)后师痕,再
git stash pop
笔横,回到工作現(xiàn)場汽烦。 - 要丟棄一個沒有被合并過的分支迄薄,可以通過
git branch -D <name>
強行刪除讥蔽。
5. 多人協(xié)作
5.1 基本命令
- 當(dāng)從遠程倉庫克隆時,實際上Git自動把本地的master分支和遠程的master分支對應(yīng)起來了侯繁,并且,遠程倉庫的默認名稱是origin弓颈。
- 要查看遠程庫的信息款票,用
git remote
- 顯示更詳細的信息, 用
git remote -v
- 推送分支: 就是把該分支上的所有本地提交推送到遠程庫。推送時锁施,要指定本地分支,這樣篱竭,Git就會把該分支推送到遠程庫對應(yīng)的遠程分支上:
git push origin master git push origin dev
- 并不是一定要把本地分支往遠程推送,master分支是主分支氯质,因此要時刻與遠程同步, 其他視情況而定.
-
git pull
抓取遠程的新提交. - 在本地創(chuàng)建和遠程分支對應(yīng)的分支,使用
git checkout -b branch-name origin/branch-name
隧期,本地和遠程分支的名稱最好一致; - 建立本地分支和遠程分支的關(guān)聯(lián)之碗,使用
git branch --set-upstream branch-name origin/branch-name
;
5.2 工作模式總結(jié)
首先派诬,用
git push origin branch-name
推送自己的修改;如果推送失敗吊趾,則因為遠程分支比你的本地更新,需要先用
git pull
試圖合并识颊;如果合并有沖突奠伪,則解決沖突藐俺,并在本地提交浙宜;
沒有沖突或者解決掉沖突后扶镀,再用
git push origin branch-name
推送就能成功!如果
git pull
提示“no tracking information”,則說明本地分支和遠程分支的鏈接關(guān)系沒有創(chuàng)建智亮,用命令git branch --set-upstream branch-name origin/branch-name
。
最后
真的是超級感謝廖雪峰老師提供的Git教程了,大贊(≧▽≦)/
文章很多圖和文章都從這里摘錄瓦呼,教程講的真的蠻容易理解學(xué)習(xí)的稚字,推薦給同樣想學(xué)的人哦(????ω????)