我們做畢業(yè)設(shè)計(jì)一般包含代碼部分和論文笛钝,為了保存論文每次更改記錄,會(huì)復(fù)制重命名聪富,對(duì)于代碼部分一般也會(huì)復(fù)制文件夾記錄版本。在企業(yè)當(dāng)中是一個(gè)團(tuán)隊(duì)在開(kāi)發(fā)著蟹,顯然需要版本管理墩蔓,能夠查看每次提交的代碼比上個(gè)版本的變化梢莽,如果版本存在問(wèn)題,可以回滾到老版本等等奸披。此處介紹企業(yè)中都在用的git昏名,工作流程:
本地工作區(qū)【代碼目錄】-》到暫存區(qū)【加入git文件跟蹤,文件索引】-》到本地倉(cāng)庫(kù)-》遠(yuǎn)程倉(cāng)庫(kù)【大家都可以訪(fǎng)問(wèn)的服務(wù)器,例如github】
一阵面、git 下載:https://git-scm.com/downloads
二轻局、git本地倉(cāng)庫(kù)創(chuàng)建,創(chuàng)建文件样刷,添加到暫存區(qū)仑扑,提交到本地倉(cāng)庫(kù)
cd /Users/free/learngit
//到工作目錄
git init
//初始化版本庫(kù)
echo "第一個(gè)版本代碼xxxx" >> test.txt
//追加這段文字到test.txt文件
git status
//查看工作區(qū)狀態(tài)
以下返回內(nèi)容:
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
test.txt
nothing added to commit but untracked files present (use "git add" to track)·
git add test.txt
//將test.txt添加到暫存區(qū)
//提交到本地倉(cāng)庫(kù) "第一個(gè)版本" 為提交備注,方便日后查看這次提交代碼的主要功能
git commit -m "第一個(gè)版本"
三置鼻、將本地倉(cāng)庫(kù)推送到github或者其他遠(yuǎn)程倉(cāng)庫(kù)中镇饮,與其他人共同開(kāi)發(fā)
//接下來(lái)設(shè)置賬戶(hù),跟github用一個(gè)賬戶(hù)箕母,并推送本地倉(cāng)庫(kù)到github這個(gè)遠(yuǎn)程倉(cāng)庫(kù)上
//--global 如果加這個(gè)就會(huì)設(shè)置全局储藐,不加則只設(shè)置當(dāng)前倉(cāng)庫(kù)所用賬戶(hù)
cd .git
//要進(jìn)入項(xiàng)目目錄下的.git文件夾 進(jìn)行賬戶(hù)設(shè)置
git config [--global] user.name "onerole1024"
git config [--global] user.email "onerole@126.com"
git config --list
//查看配置
cat config
//查看配置
git remote add origin https://github.com/onerole1024/learngit.git
//本地倉(cāng)庫(kù)關(guān)聯(lián)到遠(yuǎn)程倉(cāng)庫(kù),遠(yuǎn)程倉(cāng)庫(kù)的名稱(chēng)一般默認(rèn)為origin嘶是,也可以設(shè)置為其他名稱(chēng)
git push -u origin master
//將本地倉(cāng)庫(kù)master分支推送到origin主機(jī)钙勃,指定origin為默認(rèn)主機(jī),以后可以不加任何參數(shù)使用git push
cd ..
//從.git 目錄到上層目錄
echo "第二個(gè)版本">>test.txt
//追加這句話(huà)到test.txt文件
git add test.txt
//將test.txt添加到暫存區(qū)
git commit -m "第二個(gè)版本"
//提交到本地倉(cāng)庫(kù)
git push
//將本地倉(cāng)庫(kù)推送到遠(yuǎn)程github聂喇,此時(shí)查看github就會(huì)看到提交記錄
git pull
//拉取遠(yuǎn)程服務(wù)器上最新代碼
四辖源、將變動(dòng)提交到暫存區(qū),還未提交到本地倉(cāng)庫(kù)授帕,但變動(dòng)不想要了同木,需要丟去
echo "第二個(gè)版本的細(xì)微改動(dòng)" >>test.txt
//對(duì)代碼進(jìn)行修改
git add test.txt
//添加到暫存區(qū)
git reset HEAD test.txt
//將本地倉(cāng)庫(kù)文件狀態(tài)覆蓋暫存區(qū)
git checkout -- test.txt
//將工作區(qū)變?yōu)闀捍鎱^(qū)的狀態(tài)
五、將變動(dòng)已經(jīng)提交到本地倉(cāng)庫(kù)或者遠(yuǎn)程倉(cāng)庫(kù),但變動(dòng)不想要了深浮,需要回滾到某一個(gè)版本
echo "第二個(gè)版本增加擴(kuò)展功能" >>test.txt
//對(duì)代碼進(jìn)行修改
git add test.txt
//添加到暫存區(qū)
git commit -m "第二個(gè)版本擴(kuò)展功能"
//提交到本地倉(cāng)庫(kù)
git push
//推送到遠(yuǎn)程倉(cāng)庫(kù)
git log
//查看提交記錄旭寿,以下是提交記錄
commit 049ffa85228bdc65ec9c3061c1438e36478ae007 (HEAD -> master)
Author: onerole1024 <onerole@126.com>
Date: Sat Mar 9 21:21:47 2019 +0800
第二個(gè)版本擴(kuò)展功能
commit 52c576e19eef9bcd7e3354598d12d242419621c1 (origin/master)
Author: onerole1024 <onerole@126.com>
Date: Sat Mar 9 20:28:14 2019 +0800
第二次提交
commit e4338a16c7d1e16be2ea003fe7d2f875e687c64f
Author: onerole1024 <onerole@126.com>
Date: Sat Mar 9 20:24:08 2019 +0800
第一次提交
//將倉(cāng)庫(kù)和暫存區(qū)都回滾到上次提交的版本,復(fù)制上次提交的版本號(hào)洲尊,執(zhí)行回滾
git reset --hard 52c576e19eef9bcd7e3354598d12d242419621c1
//輸出:
HEAD is now at 52c576e 第二次提交
git push origin --force
//強(qiáng)制推送到遠(yuǎn)程倉(cāng)庫(kù)主分支
//git reset --hard 之后,git log就看不到放棄的提交了奈偏,git reflog則可以看到被刪除的commit 坞嘀,可以后悔,執(zhí)行 git reset --hard xxx 恢復(fù)到某刪除的版本惊来,已經(jīng)提交到遠(yuǎn)程服務(wù)器的版本要回滾到之前某版本比較危險(xiǎn)丽涩,本地執(zhí)行了git reset --hard 之后版本落后于遠(yuǎn)程倉(cāng)庫(kù),需要git push origin --force 強(qiáng)制push
六、項(xiàng)目增加了一個(gè)功能矢渊,也提交到了本地倉(cāng)庫(kù)继准,但完全不需要了,需要?jiǎng)h除這個(gè)功能
echo "增加人臉識(shí)別功能" >> face.txt
git add face.txt
git commit -m "人臉識(shí)別"
git rm face.txt
//刪除變動(dòng)
git status
//查看狀態(tài)矮男,需要將刪除提交到本地倉(cāng)庫(kù)
git commit -m "丟棄人臉識(shí)別功能"
//將刪除提交到本地倉(cāng)庫(kù)
七移必、項(xiàng)目中暫存區(qū)的變動(dòng)不需要了,將本地倉(cāng)庫(kù)文件狀態(tài)覆蓋掉暫存區(qū)和工作區(qū)【與四毡鉴、相同】
echo "發(fā)送語(yǔ)音" >>yy.txt
git add yy.txt
git commit -m "語(yǔ)音功能"
echo "語(yǔ)音識(shí)別" >>yy.txt
git add yy.txt
git checkout HEAD yy.txt
//將版本庫(kù)的文件覆蓋掉暫存區(qū)和工作區(qū)
八崔泵、項(xiàng)目已經(jīng)提交到遠(yuǎn)程服務(wù)器,但是該功能不需要了猪瞬,將遠(yuǎn)程本地回滾到上個(gè)版本【與五憎瘸、的區(qū)別是回滾到某一個(gè)版本,只是命令差異】
echo "增加表情功能" >> bq.txt
git add bq.txt
git commit -m "表情功能"
git push
git revert HEAD
//回滾到上個(gè)版本 與reset --hard 的區(qū)別就是會(huì)生成一次提交
git commit -m "不需要發(fā)送表情"
git push
九撑螺、總結(jié)工作區(qū)含思、暫存區(qū)、本地倉(cāng)庫(kù)工作流甘晤、遠(yuǎn)程倉(cāng)庫(kù)
工作區(qū)改動(dòng)通過(guò)add提交到暫存區(qū)含潘,通過(guò)commit提交到本地倉(cāng)庫(kù),push推送到遠(yuǎn)程倉(cāng)庫(kù)线婚。reset HEAD 會(huì)將本地倉(cāng)庫(kù)某文件最新版本覆蓋掉暫存區(qū)文件遏弱,checkout --
會(huì)將暫存區(qū)文件覆蓋掉工作區(qū)文件。checkout HEAD 會(huì)將本地倉(cāng)庫(kù)某文件
最新版本覆蓋掉暫存區(qū)和工作區(qū)文件塞弊。如果需要將本地倉(cāng)庫(kù)回滾到之前某個(gè)版本
則git reset --hard 版本號(hào)漱逸,這樣本地倉(cāng)庫(kù)和暫存區(qū)指針都會(huì)指向這個(gè)版本,
這個(gè)版本號(hào)的文件會(huì)覆蓋掉工作區(qū)文件游沿。
git push origin master -f ,-f 參數(shù)是強(qiáng)制提交饰抒,因?yàn)閞eset之后本地庫(kù)落后于
遠(yuǎn)程庫(kù)版本,因此需要強(qiáng)制提交诀黍。
git revert HEAD 和 reset 的區(qū)別是袋坑,前者會(huì)保留要放棄的提交記錄。
暫存區(qū)index 和 本地倉(cāng)庫(kù)HEAD 都是指針形式指向objects文件hash眯勾。
十枣宫、標(biāo)簽管理,每發(fā)個(gè)版本打一個(gè)標(biāo)簽,便于管理吃环,每一個(gè)標(biāo)簽就像一個(gè)里程碑式發(fā)布
git tag v2.0
//打一個(gè)標(biāo)簽 v2.0
git tag
//查看所有打的標(biāo)簽
git push origin v2.0
//將標(biāo)簽推送到遠(yuǎn)程倉(cāng)庫(kù)【遠(yuǎn)程倉(cāng)庫(kù)默認(rèn)命名origin】
//以上操作會(huì)將遠(yuǎn)程倉(cāng)庫(kù)當(dāng)前的代碼打一個(gè)標(biāo)簽也颤,該標(biāo)簽如同當(dāng)前代碼內(nèi)容快照
echo "增加方言識(shí)別" >> yy.txt
git add yy.txt
git commit -m "方言"
git push origin v2.1
echo "增加泰語(yǔ)" >> yy.txt
git add yy.txt
git commit -m "泰語(yǔ)"
git tag v2.2
git push origin v2.2
git tag -d v2.2
//刪除本地倉(cāng)庫(kù)標(biāo)簽
git push origin :refs/tags/v2.2
//刪除遠(yuǎn)程該標(biāo)簽 git push origin :refs/tags/標(biāo)簽名
//以上命令把修改代碼本地打標(biāo)簽并推送到遠(yuǎn)程相應(yīng)的標(biāo)簽,并未到遠(yuǎn)程主分支
git push
//將變動(dòng)推送到主分支
//如果某一個(gè)發(fā)布的標(biāo)簽出現(xiàn)bug郁轻,可以查看該標(biāo)簽對(duì)應(yīng)的commit提交號(hào)翅娶,將
本地倉(cāng)庫(kù)版本回滾到該版本,然后拉取分支,將本地倉(cāng)庫(kù)版本再恢復(fù)到最新版本故觅,
在分支修復(fù)bug后厂庇,本地打標(biāo)簽并push到遠(yuǎn)程該標(biāo)簽渠啊,合并代碼到本地倉(cāng)庫(kù)主分支再push
十一输吏、 主分支還在開(kāi)發(fā),當(dāng)需要開(kāi)發(fā)一個(gè)功能替蛉,與主分支不能同時(shí)發(fā)版等贯溅,可以創(chuàng)建分支
echo "增加人機(jī)對(duì)話(huà)功能,中文">> speak.txt
git add *
//當(dāng)前修改全部加入暫存區(qū)
git commit -m "人機(jī)對(duì)話(huà)-中文"
git push
git branch feature_en
//打一個(gè)分支名為 feature_en 用做開(kāi)發(fā)人機(jī)回話(huà)-英語(yǔ)
git branch
//查看當(dāng)前所有分支 簽名帶*號(hào)的為當(dāng)前所在分支
git checkout feature_en
//切換到 feature_en 這個(gè)分支
echo "增加人機(jī)對(duì)話(huà)功能躲查,英文">> speak.txt
//在分支上開(kāi)發(fā)新功能
git add speak.txt
git commit -m "人機(jī)對(duì)話(huà)-英語(yǔ)"
git push --set-upstream origin feature_en
//在遠(yuǎn)程倉(cāng)庫(kù)github上創(chuàng)建分支它浅,并將修改push到遠(yuǎn)程分支
echo "增加人機(jī)對(duì)話(huà)功能,修復(fù)英文bug">> speak.txt
git add speak.txt
git commit -m "修復(fù)英文bug"
git push
git checkout master
//切換到主分支
echo "人機(jī)對(duì)話(huà)智能性增強(qiáng)">>speak.txt
//主分支開(kāi)發(fā)了新內(nèi)容
git add speak.txt
git commit -m "智能增強(qiáng)"
git push
//推送到遠(yuǎn)程倉(cāng)庫(kù)
git tag v2.2
//創(chuàng)建本地倉(cāng)庫(kù)標(biāo)簽
git push origin v2.2
//推送本地標(biāo)簽內(nèi)容到遠(yuǎn)程倉(cāng)庫(kù)镣煮,并建立遠(yuǎn)程倉(cāng)庫(kù)標(biāo)簽
git merge feature_en
//將分支內(nèi)容合并到主分支上姐霍,由于同時(shí)都在開(kāi)發(fā),產(chǎn)生沖突典唇,需要解決
cat speak.txt
//以下為輸出內(nèi)容
增加人機(jī)對(duì)話(huà)功能镊折,中文
<<<<<<< HEAD
人機(jī)對(duì)話(huà)智能性增強(qiáng)
=======
增加人機(jī)對(duì)話(huà)功能,英文
增加人機(jī)對(duì)話(huà)功能介衔,修復(fù)英文bug
>>>>>>> feature_en
git add speak.txt
//解決沖突后恨胚,添加到暫存區(qū)
git commit -m "合并分支上英語(yǔ)對(duì)話(huà)功能"
git push
十二、 創(chuàng)建和刪除遠(yuǎn)程分支
git branch feature_ak
//本地倉(cāng)庫(kù)創(chuàng)建 feature_ak 分支
git checkout feature_ak
//切換到本地倉(cāng)庫(kù) feature_ak 分支
git push --set-upstream origin feature_ak
//push推送創(chuàng)建遠(yuǎn)程分支
git checkout master
//切換到本地倉(cāng)庫(kù) master 分支,再去刪除 feature_ak 分支
git branch -d feature_ak
//刪除本地倉(cāng)庫(kù) feature_ak 分支
git push origin --delete feature_ak
//刪除遠(yuǎn)程分支
十三炎咖、 企業(yè)級(jí)應(yīng)用gitflow赃泡,項(xiàng)目開(kāi)發(fā)、發(fā)布乘盼、bug修復(fù)的分支規(guī)劃
master分支和dev開(kāi)發(fā)分支都會(huì)存在開(kāi)發(fā)歷史記錄升熊,程序員平日根據(jù)項(xiàng)目功能模塊從dev開(kāi)發(fā)分支打出feature_x功能分支,開(kāi)發(fā)的功能完成之后會(huì)合并到dev開(kāi)發(fā)分支上绸栅,并刪除該功能分支级野,當(dāng)dev開(kāi)發(fā)分支收集完這次迭代功能,需要發(fā)布版本時(shí)阴幌,會(huì)創(chuàng)建release分支勺阐,部署release分支代碼到測(cè)試環(huán)境供測(cè)試人員進(jìn)行測(cè)試,修復(fù)bug會(huì)提交到release分支上矛双,測(cè)試通過(guò)后會(huì)將release分支合并到主分支并打一個(gè)標(biāo)簽渊抽,release分支合并到開(kāi)發(fā)分支,并將release分支刪除议忽。生產(chǎn)環(huán)境運(yùn)行的是master分支打的發(fā)布標(biāo)簽版本號(hào)懒闷,生產(chǎn)環(huán)境發(fā)現(xiàn)bug,會(huì)從master主分支打出一個(gè)hotfix分支,做bug修復(fù)愤估,修復(fù)完成會(huì)合并到master主分支和dev開(kāi)發(fā)分支帮辟,刪除hotfix分支。也就是說(shuō)dev開(kāi)發(fā)分支就第一次從master主分支上打出來(lái)之后就獨(dú)立往前推進(jìn)玩焰,當(dāng)收集完feature會(huì)打出release分支由驹,release分支測(cè)試完畢,合并到master主分支并打出版本號(hào)標(biāo)簽昔园,記錄發(fā)布版本號(hào)蔓榄。合并到dev開(kāi)發(fā)分支,使得開(kāi)發(fā)分支保持最新代碼狀態(tài)默刚。此時(shí)release分支使命就結(jié)束了甥郑。