Git工作流程和常用命令分享

1280px-Git-logo.svg.png

歷史

git是一個(gè)分布式版本控制軟件,最初由林納斯·托瓦茲創(chuàng)作萌壳,于2005年以GPL發(fā)布璧诵。最初目的是為更好地管理Linux內(nèi)核開(kāi)發(fā)而設(shè)計(jì)。林納斯·托瓦茲在編寫(xiě)第一個(gè)版本時(shí)就使用了“git”這個(gè)名稱嵌莉, 他將工具描述為“愚蠢的內(nèi)容跟蹤器”。

Git和SVN使用的區(qū)別

??差異?? svn git
系統(tǒng)特點(diǎn) 1.集中式版本控制系統(tǒng)(文檔管理很方便)
2.克隆一個(gè)擁有將近一萬(wàn)個(gè)提交(commit),五個(gè)分支,每個(gè)分支有大約1500個(gè)文件捻脖,用時(shí)將近一個(gè)小時(shí)
1.分布式系統(tǒng)(代碼管理很方便)
2.克隆一個(gè)擁有將近一萬(wàn)個(gè)提交(commit),五個(gè)分支,每個(gè)分支有大約1500個(gè)文件锐峭,用時(shí)1分鐘
靈活性 1.搭載svn的服務(wù)器出現(xiàn)故障中鼠,無(wú)法與服務(wù)器進(jìn)行交互
2.所有的svn操作都需要中央倉(cāng)庫(kù)交互(例:拉分支,看日志等)
1.可以單機(jī)操作沿癞,git服務(wù)器故障也可以在本地git倉(cāng)庫(kù)工作
2.除了push和pull(或fetch)操作援雇,其他都可以在本地操作
3.根據(jù)自己開(kāi)發(fā)任務(wù)任意在本地創(chuàng)建分支 4.日志都是在本地查看,效率較高
安全性 較差椎扬,定期備份惫搏,并且是整個(gè)svn都得備份 較高,每個(gè)開(kāi)發(fā)者的本地就是一套完整版本庫(kù)蚕涤,記錄著版本庫(kù)的所有信息
分支方面 1.拉分支更像是copy一個(gè)路徑
2.可針對(duì)任何子目錄進(jìn)行branch
3.拉分支的時(shí)間較慢筐赔,因?yàn)槔种喈?dāng)于copy
4.創(chuàng)建完分支后,影響全部成員揖铜,每個(gè)人都會(huì)擁有這個(gè)分支
5.多分支并行開(kāi)發(fā)較重(工作較多而且繁瑣)
1.可以在Git的任意一個(gè)提交點(diǎn)開(kāi)啟新分支
2.拉分支時(shí)間較快茴丰,因?yàn)槔种е皇莿?chuàng)建文件的指針和HEAD
3.自己本地創(chuàng)建的分支不會(huì)影響其他人 4.比較適合多分支并行開(kāi)發(fā)
版本控制 1.保存前后變化的差異數(shù)據(jù),作為版本控制
2.版本號(hào)進(jìn)行控制天吓,每次操作都會(huì)產(chǎn)生一個(gè)高版本號(hào)(svn的全局版本號(hào)贿肩,這是svn一個(gè)較大的特點(diǎn),git是hash值)
1.git只關(guān)心文件數(shù)據(jù)的整體發(fā)生變化失仁,更像是把文件做快照,文件沒(méi)有改變時(shí)们何,分支指向這個(gè)文件的指針不會(huì)改變萄焦,文件發(fā)生改變,指針指向新版本
2. 40 位長(zhǎng)的哈希值作為版本號(hào)冤竹,沒(méi)有先后之分
工作流程 1.每次更改文件之前都得update操作拂封,有的時(shí)候修改過(guò)程中這個(gè)文件有更新,commit不會(huì)成功
2.有沖突鹦蠕,會(huì)打斷提交動(dòng)作
1.開(kāi)始工作前進(jìn)行fetch操作冒签,完成開(kāi)發(fā)工作后push操作,有沖突解決沖突?
2.git的提交過(guò)程不會(huì)被打斷钟病,有沖突會(huì)標(biāo)記沖突文件
3.gitflow流程(經(jīng)典)
內(nèi)容管理 svn對(duì)中文支持好萧恕,操作簡(jiǎn)單,適用于大眾 對(duì)程序的源代碼管理方便肠阱,代碼庫(kù)占用的空間少票唆,易于分支化管理
權(quán)限管理 svn的權(quán)限管理相當(dāng)嚴(yán)格,可以按組屹徘、個(gè)人針對(duì)某個(gè)子目錄的權(quán)限控制(每個(gè)目錄下都會(huì)有個(gè).svn的隱藏文件) git沒(méi)有嚴(yán)格的權(quán)限管理控制走趋,只有賬號(hào)角色劃分(在項(xiàng)目的home文件下有且只有一個(gè).git目錄)

Git工作流程

[圖片上傳失敗...(image-c23291-1619063471664)]

四個(gè)專有名詞:

Workspace:工作區(qū)

Index / Stage:暫存區(qū)

Repository:倉(cāng)庫(kù)區(qū)(或本地倉(cāng)庫(kù))

Remote:遠(yuǎn)程倉(cāng)庫(kù)

????關(guān)鍵詞 解釋
工作區(qū) 程序員進(jìn)行開(kāi)發(fā)改動(dòng)的地方,是你當(dāng)前看到的噪伊,也是最新的簿煌。 平常我們開(kāi)發(fā)就是拷貝遠(yuǎn)程倉(cāng)庫(kù)中的一個(gè)分支氮唯,基于該分支進(jìn)行開(kāi)發(fā)。在開(kāi)發(fā)過(guò)程中就是對(duì)工作區(qū)的操作姨伟。
暫存區(qū) .git目錄下的index文件, 暫存區(qū)會(huì)記錄git add添加文件的相關(guān)信息(文件名惩琉、大小、timestamp...) 授滓×账可以使用git status查看暫存區(qū)的狀態(tài)。暫存區(qū)標(biāo)記了你當(dāng)前工作區(qū)中般堆,哪些內(nèi)容是被git管理的在孝。
本地倉(cāng)庫(kù) 保存了對(duì)象被提交過(guò)的各個(gè)版本,比起工作區(qū)和暫存區(qū)的內(nèi)容淮摔,它要更舊一些私沮。 git commit后同步目錄樹(shù)到本地倉(cāng)庫(kù),方便下一步通過(guò)git push同步本地倉(cāng)庫(kù)與遠(yuǎn)程倉(cāng)庫(kù)和橙。
遠(yuǎn)程倉(cāng)庫(kù) 遠(yuǎn)程倉(cāng)庫(kù)的內(nèi)容可能被分布在多個(gè)地點(diǎn)的處于協(xié)作關(guān)系的本地倉(cāng)庫(kù)進(jìn)行修改仔燕,因此它可能與本地倉(cāng)庫(kù)同步,也可能不同步魔招,但是它的內(nèi)容是最舊的晰搀。

Git常用命令

3985563-6b745d5fac15906c.png

Git常用命令速查表

1801651-33d5c72002486bbb.png

初始化倉(cāng)庫(kù)

命令 解釋
git clone <url> #克隆遠(yuǎn)程版本庫(kù),生成.git隱藏文件

打開(kāi)本地生成的.git隱藏文件

文件夾 解釋
hooks 存儲(chǔ)鉤子的文件夾
logs 存儲(chǔ)日志的文件夾
refs 存儲(chǔ)指向各個(gè)分支的指針(SHA-1標(biāo)識(shí))文件
objects 存放git對(duì)象
config 存放各種設(shè)置文檔
HEAD 指向當(dāng)前所在分支的指針文件路徑,一般指向refs下的某文件

創(chuàng)建和添加

創(chuàng)建新項(xiàng)目gittest

創(chuàng)建新文件test.txt

git add <file>

git status顯示有變更的文件

git restore <file> 撤回文件修改內(nèi)容

git commit –m “注釋”

修改內(nèi)容-> 執(zhí)行g(shù)it diff工作區(qū)和本地倉(cāng)庫(kù)的差異

git log顯示當(dāng)前分支的版本歷史

版本回退

git reset --hard HEAD^ 當(dāng)前版本回退到上一個(gè)版本

git reset --hard HEAD^ ^ 當(dāng)前版本回退到上上一個(gè)版本

git reset --hard HEAD~100 回退到前100個(gè)版本

恢復(fù)已經(jīng)刪除的版本

git reflog 展示所有的提交記錄

git reset --hard <版本號(hào)> 回退到指定版本

推送至遠(yuǎn)程分支

git push origin master 將本地master分支推送到遠(yuǎn)程master分支办斑,相當(dāng)于創(chuàng)建遠(yuǎn)程分支

創(chuàng)建與合并分支

git checkout -b dev = git branch dev + git checkout dev 創(chuàng)建并切換分支

git branch 不帶參數(shù)外恕,會(huì)列出所有本地的分支;帶參數(shù)表示創(chuàng)建分支

git branch –d name 刪除本地分支(-D表示強(qiáng)制刪除)

git branch –r 不帶參數(shù)乡翅,會(huì)列出所有遠(yuǎn)程的分支

git branch --set-upstream-to=origin/<branch本地> 本地和遠(yuǎn)程分支關(guān)聯(lián)

git push origin –delete <branch> 刪除遠(yuǎn)程分支

合并分支

git merge release用于合并指定分支到當(dāng)前分支上

注:Fast-forward表示的合并是“快進(jìn)模式”鳞疲,也就是直接把master指向dev的當(dāng)前提交,所以合并速度非橙溲粒快尚洽。在這種模式下,刪除分支后靶累,會(huì)丟掉分支日志信息腺毫。可以使用帶參數(shù) --no-ff來(lái)禁用”Fast forward”模式挣柬。

git merge --no-ff -m “注釋”dev

解決沖突

git checkout release 切換release分支

vim test.txt 修改某條內(nèi)容

git commit test.txt -m “release修改某條內(nèi)容”

git checkout master 切換master分支

vim test.txt 修改某條同release內(nèi)容

git commit test.txt -m “master修改某條內(nèi)容”

git merge release 顯示沖突

git status 顯示沖突提示

Git用<<<<<<<拴曲,=======,>>>>>>>標(biāo)記出不同分支的內(nèi)容凛忿,其中>>>>release 是指release上修改的內(nèi)容
vim test.txt 修改內(nèi)容

git add test.txt

git commit -a -m “fix conflict”

暫儲(chǔ)stash功能

當(dāng)前分支有沒(méi)有提交但也不合適現(xiàn)在就提交的內(nèi)容澈灼,Git提供了暫儲(chǔ)功能stash

1.產(chǎn)生場(chǎng)景

git checkout release

vim test.txt 修改test.txt內(nèi)容

git checkout develop 此時(shí)會(huì)提示Aborting

2.解決方式

Please commit your changes or stash them before you switch branches
git stash

git status 查看當(dāng)前狀態(tài)

Git stash list 查看所有暫儲(chǔ)列表

3.還原暫儲(chǔ)

git stash apply恢復(fù),恢復(fù)后stash內(nèi)容并不刪除,你需要使用命令git stash drop來(lái)刪除叁熔;
另一種方式是使用git stash pop,恢復(fù)的同時(shí)把stash內(nèi)容也刪除了

Git Tag功能

創(chuàng)建Git Tag并推送遠(yuǎn)程服務(wù)器

git tag -a V1.0.0 –m“注釋” //創(chuàng)建TAG

git push origin V1.0.0 //推送到遠(yuǎn)程服務(wù)器

git push origin --tag //提交所有tag至服務(wù)器

git tag -d V1.0.0 //刪除本地標(biāo)簽

git push origin --delete tag <tagname> //刪除遠(yuǎn)程標(biāo)簽

HEAD的理解

HEAD委乌,它始終指向當(dāng)前所處分支的最新的提交點(diǎn)。你所處的分支變化了荣回,或者產(chǎn)生了新的提交點(diǎn)遭贸,HEAD就會(huì)跟著改變

3985563-623d3cefdcb95045.png

Add的理解

add相關(guān)命令很簡(jiǎn)單,主要實(shí)現(xiàn)將工作區(qū)修改的內(nèi)容提交到暫存區(qū)心软,交由git管理壕吹。

git add .添加當(dāng)前目錄的所有文件到暫存區(qū)

git add 添加指定目錄到暫存區(qū),包括子目錄

git add 添加指定文件到暫存區(qū)

3985563-a5f92bd6f800959f.png

Commit的理解

commit相關(guān)命令也很簡(jiǎn)單删铃,主要實(shí)現(xiàn)將暫存區(qū)的內(nèi)容提交到本地倉(cāng)庫(kù)耳贬,并使得當(dāng)前分支的HEAD向后移動(dòng)一個(gè)提交點(diǎn)。

git commit -m 提交暫存區(qū)到本地倉(cāng)庫(kù),message代表說(shuō)明信息

git commit --amend -m 使用一次新的commit猎唁,替代上一次提交

3985563-a5f92bd6f800959f.png

Push的理解

上傳本地倉(cāng)庫(kù)分支到遠(yuǎn)程倉(cāng)庫(kù)分支咒劲,實(shí)現(xiàn)同步。

git push 上傳本地指定分支到遠(yuǎn)程倉(cāng)庫(kù)

git push --force強(qiáng)行推送當(dāng)前分支到遠(yuǎn)程倉(cāng)庫(kù)诫隅,即使有沖突

git push --all推送所有分支到遠(yuǎn)程倉(cāng)庫(kù)

Branch的理解

關(guān)于分支腐魂,大概有展示分支,切換分支逐纬,創(chuàng)建分支蛔屹,刪除分支這四種操作。

git branch列出所有本地分支

git branch -r列出所有遠(yuǎn)程分支

git branch -a列出所有本地分支和遠(yuǎn)程分支

git branch 新建一個(gè)分支豁生,但依然停留在當(dāng)前分支

git checkout -b 新建一個(gè)分支兔毒,并切換到該分支

git checkout 切換到指定分支,并更新工作區(qū)

git branch -d 刪除分支

git push origin --delete 刪除遠(yuǎn)程分支

關(guān)于分支的操作雖然比較多沛硅,但都比較簡(jiǎn)單好記

3985563-04bac8d079111a9f.png

Merge的理解

merge命令把不同的分支合并起來(lái)眼刃。在實(shí)際開(kāi)放中绕辖,我們可能從master分支中切出一個(gè)分支摇肌,然后進(jìn)行開(kāi)發(fā)完成需求,中間經(jīng)過(guò)R3,R4,R5的commit記錄仪际,最后開(kāi)發(fā)完成需要合入master中围小,這便用到了merge。

git merge 合并指定分支到當(dāng)前分支

注:如果在merge之后树碱,出現(xiàn)conflict肯适,主要是因?yàn)閮蓚€(gè)用戶修改了同一文件的同一塊區(qū)域。需要針對(duì)沖突情況成榜,手動(dòng)解除沖突框舔。

3985563-29417c3862d0599c.png

Rebase的理解

rebase又稱為衍合,是合并的另外一種選擇。

在開(kāi)始階段刘绣,我們處于new分支上樱溉,執(zhí)行g(shù)it rebase dev,那么new分支上新的commit都在dev分支上重演一遍纬凤,最后checkout切換回到new分支福贞。這一點(diǎn)與merge是一樣的,合并前后所處的分支并沒(méi)有改變停士。

git rebase dev挖帘,通俗的解釋就是new分支想站在dev的肩膀上繼續(xù)下去。

rebase操作不會(huì)生成新的節(jié)點(diǎn)恋技,是將兩個(gè)分支融合成一個(gè)線性的提交拇舀。

rebase也需要手動(dòng)解決沖突。

3985563-8d4e5fc624c0a23b.png

Merge和Rebase的比較

1.如果你想要一個(gè)干凈的猖任,沒(méi)有merge commit的線性歷史樹(shù)你稚,那么你應(yīng)該選擇git rebase

2.如果你想保留完整的歷史記錄,并且想要避免重寫(xiě)commit history的風(fēng)險(xiǎn)朱躺,你應(yīng)該選擇使用git merge

Reset的理解

reset命令把當(dāng)前分支指向另一個(gè)位置掸刊,并且相應(yīng)的變動(dòng)工作區(qū)和暫存區(qū)。

git reset —soft 只改變提交點(diǎn)雨女,暫存區(qū)和工作目錄的內(nèi)容都不改變

git reset —mixed 改變提交點(diǎn)匿辩,同時(shí)改變暫存區(qū)的內(nèi)容

git reset —hard 暫存區(qū)、工作區(qū)的內(nèi)容都會(huì)被修改到與提交點(diǎn)完全一致的狀態(tài)

3985563-2d41240c43bc3f2e.png

Revert的理解

git revert用一個(gè)新提交來(lái)消除一個(gè)歷史提交所做的任何修改源请。

3985563-02aab40cb9b6efb1.jpeg

Revert與Reset的區(qū)別

在回滾這一操作上看枪芒,效果差不多。git revert是用一次新的commit來(lái)回滾之前的commit谁尸,git reset是直接刪除指定的commit舅踪。

3985563-93d402b6ebda56f8.jpeg

Gitignore 忽略

1.創(chuàng)建gitignore文件

在 Git工作區(qū)的根目錄創(chuàng)建一個(gè)特殊的.gitignore文件。

在.gitignore文件中良蛮,添加需要忽略的文件抽碌。

2.更新gitignore文件

git rm -r --cached . //將倉(cāng)庫(kù)中的index遞歸刪除

git add . //重新添加倉(cāng)庫(kù)索引

git commit -m “update git.ignore” //提交

git branch --set-upstream-to=origin/<branch> <branch> //重現(xiàn)將本地倉(cāng)庫(kù)和遠(yuǎn)程倉(cāng)庫(kù)關(guān)聯(lián)

常用Git建立分支結(jié)構(gòu)

202104201.png

最后,如果此篇博文對(duì)你有所幫助决瞳,別忘了點(diǎn)個(gè)贊喲~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末货徙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子皮胡,更是在濱河造成了極大的恐慌痴颊,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屡贺,死亡現(xiàn)場(chǎng)離奇詭異蠢棱,居然都是意外死亡锌杀,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)泻仙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)抛丽,“玉大人,你說(shuō)我怎么就攤上這事饰豺∫谙剩” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵冤吨,是天一觀的道長(zhǎng)蒿柳。 經(jīng)常有香客問(wèn)我,道長(zhǎng)漩蟆,這世上最難降的妖魔是什么垒探? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮怠李,結(jié)果婚禮上圾叼,老公的妹妹穿的比我還像新娘。我一直安慰自己捺癞,他們只是感情好夷蚊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著髓介,像睡著了一般惕鼓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上唐础,一...
    開(kāi)封第一講書(shū)人閱讀 51,301評(píng)論 1 301
  • 那天箱歧,我揣著相機(jī)與錄音,去河邊找鬼一膨。 笑死呀邢,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的豹绪。 我是一名探鬼主播价淌,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼森篷!你這毒婦竟也來(lái)了输钩?” 一聲冷哼從身側(cè)響起豺型,我...
    開(kāi)封第一講書(shū)人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤仲智,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后姻氨,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體钓辆,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了前联。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片功戚。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖似嗤,靈堂內(nèi)的尸體忽然破棺而出啸臀,到底是詐尸還是另有隱情,我是刑警寧澤烁落,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布乘粒,位于F島的核電站,受9級(jí)特大地震影響伤塌,放射性物質(zhì)發(fā)生泄漏灯萍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一每聪、第九天 我趴在偏房一處隱蔽的房頂上張望旦棉。 院中可真熱鬧,春花似錦药薯、人聲如沸绑洛。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)诊笤。三九已至,卻和暖如春巾陕,著一層夾襖步出監(jiān)牢的瞬間讨跟,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工鄙煤, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留晾匠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓梯刚,卻偏偏與公主長(zhǎng)得像凉馆,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子亡资,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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