Git是什麼?
Git是目前世界上最先進的分佈式版本控制系統(沒有之一)。
Git有什麼特點?簡單來說就是:高端大氣上檔次!
那什麼是版本控制系統?
如果你用Microsoft Word寫過長篇大論,那你一定有這樣的經歷:
- 想刪除一個段落,又怕將來想恢復找不回來怎麼辦?有辦法,先把當前文件“另存爲……”一個新的Word文件,再接着改,改到一定程度,再“另存爲……”一個新文件,這樣一直改下去。
- 過了一週,你想找回被刪除的文字,但是已經記不清刪除前保存在哪個文件裏了,只好一個一個文件去找,真麻煩。
- 看着一堆亂七八糟的文件,想保留最新的一個,然後把其他的刪掉,又怕哪天會用上,還不敢刪,真鬱悶。
- 更要命的是,有些部分需要你的財務同事幫助填寫,於是你把文件Copy到U盤裏給她(也可能通過Email發送一份給她),然後,你繼續修改Word文件。一天後,同事再把Word文件傳給你,此時,你必須想想,發給她之後到你收到她的文件期間,你作了哪些改動,得把你的改動和她的部分合並,真困難。
- 於是你想,如果有一個軟件,不但能自動幫我記錄每次文件的改動,還可以讓同事協作編輯,這樣就不用自己管理一堆類似的文件了,也不需要把文件傳來傳去。如果想查看某次改動,只需要在軟件裏瞄一眼就可以,豈不是很方便?
git的更多解釋,大家可以自行搜索。對於git的優勢就不用多說了。
今天,我們主要對於git的一般操作作一個歸類,便於使用的時候可以一步瞭然,當然網上對於這種乾乾貨很多。
話不多說,action~
首先我們對於git最基本的操作做一個簡單的介紹。
根據如下圖所示箭頭放下,可表示成如下三步:
git add .
git commit -m "comment"
git push
git add .
,表示將所有的文件從工作區存放到暫存區git commit -m "comment"
,表示將所有文件從暫存區提交到本地倉庫git push
,表示將所有文件從本地倉庫推送到遠程倉庫
對於git的理解主要分爲3個操作,4個區,5個狀態。
3個操作
將一個在本地的新文件推送到遠端服務器(github/gitlab)上都需要進行以下基本操作。
- git add .把所有文件放入暫存區
- git commit把所有文件從暫存區提交進本地倉庫
- git push把所有文件從本地倉庫推送進遠程倉庫
4個區
從本地將文件上傳到服務器上的過程中會經過以下四個區域。
- 工作區(Working Area)
- 暫存區(Stage)
- 本地倉庫(Local Repository)
- 遠程倉庫(Remote Repository)
5個狀態
四個區域,對應5個狀態,其中工作區分爲未修改和已修改。
- 未修改(Origin)
- 已修改(Modified)
- 已暫存(Staged)
- 已提交(Committed)
- 已推送(Pushed)
檢查修改
代碼我們修改完了,但是往往會忘記我們自己修改了什麼?提交上去的代碼是否修改正確?別人修改了什麼?
那麼我們需要對各個階段的代碼進行比較。
- 已修改,未暫存 (工作區)
git diff xxx
,xxx
表示需要比較的文件,結果可以查看xxx
在工作區修改前和修改的差別。 - 已暫存,未提交 (暫存區)
git diff --cached xxx
的結果可以查看,暫存區和本地倉庫的區別。 - 已提交,未推送 (本地倉庫)
git diff master origin/master
,其中master就是你的本地倉庫,而origin/master就是你的遠程倉庫,所以結果表示本地倉庫和遠程倉庫的區別。
撤銷修改
前面介紹了基本的git操作,那麼在提交文件的過程中一定會把一部分不需要提交的文件提交上去。
那麼我們在每個階段需要如何撤銷呢?
- 已修改,未暫存 ==>
git checkout .
orgit reset --hard
- 已暫存,未提交 ==>
git reset HEAD xxx
- 已提交,未推送 ==>
git reset --hard origin/master
- 已推送 ==>
git reset --hard HEAD^
,git push -f
- 先恢復本地倉
- 強制push到遠程倉庫
刪除未add的文件
- 顯示要刪除的文件及目錄 ==>
git clean -n
- 刪除文件及目錄 ==>
git clean -df
刪除服務器遠端文件,本地倉不刪除
- 刪除a目錄下的2.txt文件 ==>
git rm -r --cached a/2.txt
- commit ==>
git commit -m "刪除a目錄下的2.txt文件"
- git push
tag操作
- 打標籤 ==>
git tag -a v1.01 -m "Relase version 1.01"
- 註解:git tag 是打標籤的命令,-a 是添加標籤,其後要跟新標籤號,-m 及後面的字符串是對該標籤的註釋。
- 推送指定tag到遠端服務器 ==>
git push origin [tagname]
- 推送所有tag到遠端服務器 ==>
git push [origin] --tags
- 刪除標籤 ==>
git tag -d v1.01
- 刪除遠端標籤 ==>
git push origin :refs/tags/v1.01
- 查看標籤 ==>
git tag
分支操作(本地)
- 查看本地分支 ==>
git branch
- 顯示本地、服務器所有分支 ==>
git branch -a
- 顯示本地分支和服務器分支的映射關係 ==>
git branch -vv
- 創建分支 ==>
git branch mybranch
- 刪除分支 ==>
git branch -d mybranch
- 強制刪除分支 (慎用) ==>
git branch -D mybranch
- 刪除遠端分支 ==>
git push origin :mybranch(origin 後面有空格)
- 列出所有分支 ==>
git branch
- 列出遠端分支 ==>
git branch -a
- 切換分支 ==>
git checkout mybranch
- 創建並切換分支 ==>
git checkout -b mybranch
- 從當前分支創建並切換分支 ==>
git checkout -b myfeature dev
- 切換到master分支 ==>
git checkout master
- 關聯遠端branch ==>
git pull origin/mybranch mybranch
- 發佈分支到遠端分支(local:remote) ==>
git push origin dev:dev
- 創建並切換並關聯遠端branch ==>
git checkout -b mybranch remote_branch(origin/mybranch)
- 把本地分支合併到master ==>
git merge mybranch
- 把master合併到branch上 ==>
git merge master
- 把遠端master合併到branch上 ==>
git merge origin/master
- 合併(保留之前分支的歷史) ==>
git merge --no-ff
- 撤銷merge ==>
git reset --hard HEAD
分支操作流程
將本地創建的分支與遠程倉庫關聯
- git checkout <branch_name>
- git push <server_name> <branch_name>:<remote_branch_name>
- eg:git push origin dev:dev
- git branch --set-upstream-to=<server_name>/<remote_branch_name> <branch_name>
- eg:git branch --set-upstream-to=origin/dev dev
從遠程服務器或者已經創建好的分支
- git checkout -b <branch_name> <server_name>/<remote_branch_name>
- eg:git checkout -b dev origin/dev
刪除本地分支
- git checkout master
- git branch -d <branch_name>
刪除遠程倉庫中的分支
- git push <server_name> :<remote_branch_name>
or - git push <server_name> --delete <remote_branch_name>
git ignore
在git使用中,本地的開發過程中會產生大量的臨時文件,但是我們不需要將臨時文件上傳到遠程倉庫中,也不希望別人將臨時文件上傳,所以我們會在工程的根目錄下創建一個.gitignore
的文件,文件中的代碼的功能就是忽略臨時文件。
vivado_2016_3/*
表示vivado_2016_3的文件夾以下的所有文件及子文件夾忽略。
!vivado_2016_3/*.xpr
表示vivado_2016_3的文件夾中除了*.xpr
文件以外的所有文件及文件夾都忽略。
!表示取反(保留)
vivado_2016_3/*
!vivado_2016_3/*.xpr
!vivado_2016_3/*.bif
!vivado_2016_3/*.tcl
!vivado_2016_3/*.dcp
!vivado_2016_3/*.xdc