概念相關(guān)
Git概念
- Git 是目前業(yè)界最流行的分布式版本控制系統(tǒng)(Version Control System),本質(zhì)上來說Git是個軟件
- 分布式
- 客戶端并不只提取最新版本的文件快照, 而是把代碼倉庫完整地鏡像下來,包括完整的歷史記錄。 這么一來,任何一處協(xié)同工作用的服務(wù)器發(fā)生故障,事后都可以用任何一個鏡像出來的本地倉庫恢復(fù)
- 版本控制
- 版本控制是一種記錄一個或若干文件內(nèi)容變化,以便將來查閱特定版本修訂情況的系統(tǒng)
- 分布式
Git概念的理解
這里用大學(xué)生寫論文這個事做比對,加深理解
- 你準備寫論文,先立題,然后開始收集資料,最后開始動筆。這個過程就可以看作使用git軟件在本地創(chuàng)建倉庫(或者是從github/gitlab上拉代碼下來),準備完成項目的初始版本
- 論文初稿寫好了,要仔細檢查一遍,然后提交給老師。這個過程可以理解為使用git將寫好的項目發(fā)送到github/gitlab,準備接下來的測試,需求對接,以及找bug
- 然后在接下來的2個月內(nèi),老師來來回回的給你提出了10多個甚至更多的問題,你就來來回回的改。這個過程就可以理解為每當(dāng)你發(fā)現(xiàn)了代碼有問題,就使用git用你的修改后的代碼更新github/gitlab上的代碼,每次更新負責(zé)檢查你的代碼的人都看得到,并且還會提過新的問題
- 老師說OK了,可以提交論文,算你過了。這個過程就可以理解為你的本地代碼經(jīng)過了無數(shù)的更改后,終于穩(wěn)定了,可以拿給客戶用了,更新最終版本到github/gitlab上,部署上線···
GitHub
- GitHub 本質(zhì)上是一個代碼托管平臺,它提供的是基于 Git 的代碼托管服務(wù)。
- 對于一個團隊來說,即使不使用 GitHub,他們也可以通過自己搭建和管理 Git 服務(wù)器來進行代碼庫的管理
Git三大區(qū)域
- 工作區(qū)
- 就是你寫代碼的地方,代碼在哪個文件夾下
- 暫存區(qū)
- 暫存區(qū)是用來存放你使用git軟件跟蹤文件具體變化的區(qū)域。要注意的是,工作區(qū)的代碼在沒有使用git軟件管理前,和版本庫沒有任何關(guān)系
- 版本庫
- 是指代碼托管平臺,存儲你上傳的每次更改結(jié)果,當(dāng)然也可以拉取遠程代碼到本地
分支
- 一般每個代碼都有master分支,master分支包含了上線版本的完整代碼。
- 在開發(fā)測試階段,有可能master分支代碼有問題,那么就可以基于master代碼做出代碼更改,但是代碼更改又不是全部更改,可能指更改幾行,或者添加新的文件等等,那么此時就要創(chuàng)建新的分支(粗俗的理解為復(fù)制master代碼一份,(但是真實情況,是用指針指向?qū)崿F(xiàn)的,不是復(fù)制),指針同時指向新創(chuàng)建的分支以及master,此時還沒有做任何更改),然后更改新分支內(nèi)容的文件,修改好沒有問題,就可以提交新分支到代碼托管平臺,此時遠端就可以看得到新的一個分支的產(chǎn)生,再決定是否需要合并到master分支
Git準備
安裝Git
# Ubuntu上安裝
sudo apt install git-all
# mac會提示你進行安裝
git --version
設(shè)置Git的user信息
三個不同的作用域,默認為local
-
git config --local user.name
- 如果在本地環(huán)境中需要管理多個git用戶,一般在某個你需要管理的本地git倉庫內(nèi)設(shè)置(局部倉庫生效)
-
git config --global user.email
- 一般來講第一次設(shè)置或者是只有一個賬戶需要管理的話,設(shè)置全局用戶信息即可,完整命令如下
- git config --global user.email your_email@domain.com
- git config --global user.name your_name
-
git config --system
- 針對系統(tǒng)所有登錄的用戶都有效,用的不多
-
顯示git 本機的配置
git config --list --local
git config --list --global
git config --list --system
配置優(yōu)先級
local > global
- 如果全局配置已經(jīng)配置好,那么在當(dāng)前倉庫下可以重新設(shè)置本地的user.name和user.email,那么之后的提交(commit)都以本地的user.name 和user.email為準
基本命令
初始化倉庫
創(chuàng)建本地版本庫
創(chuàng)建一個準備放完整項目的文件夾(mkdir your_project_name)
cd 到新創(chuàng)建的文件夾 (cd your_project_name)
在文件夾里面初始化倉庫 (git init)
-
將本地所有內(nèi)容(包括不同分支)推送到遠程倉庫
git remote add origin https://github.com/user/repo.git git push --all
克隆遠端版本庫
- 從遠程拉取master代碼,建立本地庫和遠端的連接(git clone gitlab/github倉庫地址)
- https方式
- ssh方式
- 需要配置密鑰
- cd your_project_name
- 可以進行新建分支,更改代碼等操作了
管理分支
理解
舉例來說,從遠端第一次clone代碼下來,默認是master分支,那么在本地就會生成遠端master的鏡像,此時本地分支的名稱也是master,一般來講不推薦在本地的master分支上做協(xié)同開發(fā),而是要基于master創(chuàng)建一個新的分支,在此分支上進行相應(yīng)的開發(fā)工作
查看分支
- git branch -a
- 查看所有分支
- git branch -v
- 查看本地分支
- git branch -r
- 查看所有遠程分支
- git branch -vv
- 查看本地分支和遠程分支的關(guān)系以及版本情況
創(chuàng)建本地新分支(基于當(dāng)前所在分支)
以下這幾個命令都可以達成目的
- git checkout -b branch_name
- 創(chuàng)建分支branch_name,并切換到branch_name分支
- git switch -c branch_name
- 創(chuàng)建分支branch_name,并切換到branch_name分支
- git branch branch_name
- 創(chuàng)建分支
- git checkout branch_name
- 切換分支
拉取最新代碼
一般在改動前,都要先更新下最新代碼(將遠端代碼拉下來,避免別人修改過和你的版本有沖突)
- git pull
- 一般不指定的情況下,將當(dāng)前工作區(qū)的分支名稱的最新版本代碼拉取下來
- git pull origin branch_name
- 拉取遠端指定分支代碼,更新本地
- git checkout -b new_branch origin/new_branch
- 基于遠端分支創(chuàng)建本地分支并切換到本地分支
- git fetch + git merge
- 基于遠端同一個分支做更改,可能會產(chǎn)生沖突,先fetch看下和本地當(dāng)前分支有哪些不同,沒有問題就將遠程修改合并到我當(dāng)前的本地分支
- 對于不同人對不同文件在遠端內(nèi)容的修改,git會自動檢測合并,不會發(fā)生沖突
修改工作區(qū)內(nèi)容并提交
工作區(qū)的內(nèi)容變更需要先提交到暫存區(qū),然后確認無誤后可以確認并推送到遠端進行版本的更新,如果有問題,也可以撤銷修改等
- git add 你修改的文件/新添加的文件
- add的作用就是將工作區(qū)(你修改的內(nèi)容)內(nèi)容的變動提交到暫存區(qū),后面可以提交,也可以撤銷,如果是新文件,則是將此文件開始納入被git跟蹤版本的范圍
- -u
- 參數(shù),如果一次修改了多個文件,不需要帶文件名,可以將已經(jīng)被git管理的文件一次性添加到暫存區(qū)
- git commit -m "你本次提交對于版本內(nèi)容變更的描述,越詳細越好"
- 將暫存區(qū)的變動確認,生成新的版本號信息,本地新版本生成,之后就可以推送到遠端了
- git commit -am "你本次提交對于版本內(nèi)容變更的描述,越詳細越好"
- 這是上面add + commit命令的合并,這一條命令即可生成一個新的版本號,之后可以推送到遠端版本庫
推送分支到遠端倉庫
本地版本生成后(有了commit ID之后),雖然你本地的代碼已經(jīng)更新了,但是遠端并不知道,別人也就看不到,這時候可以選擇推送到遠端進行合并操作,推送過去別人就能看到你的代碼更新內(nèi)容了
- git push
- 推送當(dāng)前分支版本內(nèi)容到遠程分支(遠程如果有此分支,則是更新操作,如果沒有此分支,則會創(chuàng)建一個新的分支,名稱和你本地的當(dāng)前分支名稱一樣)
- git branch --set-upstream-to origin/分支名
- 如果當(dāng)前分支和云端分支沒有關(guān)系的情況下(一般來講第一次,會有提示),那么這樣可以建立關(guān)系
- git branch --unset-upstream
- 刪除本地當(dāng)前分支和遠程分支的映射關(guān)系
合并其他分支代碼到master分支
一般來講,其他分支的修改都是會最終合并到一個分支上的(這里以master為例)
- git merge branch_name
- 將branch_name的分支合并到當(dāng)前所在分支
刪除分支
刪除分支要注意的是,不能在當(dāng)前分支刪除當(dāng)前分支,至少先要切換到別的分支
- git checkout -d branch_name
- 在本地修改完了分支內(nèi)容之后,可對分支進行刪除操作
- git branch -D branch_name
- 強制刪除一個還沒有合并的分支
- git push origin --delete <branch_name>
- 刪除遠程分支,按照分支名稱刪除
- git push origin --delete tag <tag_name>
- 刪除遠程分支(按照標簽)
工作區(qū)/暫存區(qū)撤銷
-
git reset HEAD -- filename
- HEAD表示拉取最新代碼下來沒有做改動的版本(最新版本)
- 暫存區(qū)內(nèi)容都不要了,恢復(fù)到和HEAD版本一樣
-
git reset HEAD
- 將暫存區(qū)所有改動清空,返回當(dāng)前指向的HEAD版本內(nèi)容
-
git checkout -- filename
- 將工作區(qū)內(nèi)容和暫存區(qū)內(nèi)容同步(j舉例來說,暫存區(qū)已經(jīng)保存了一次修改(add),然后工作區(qū)對相同的代碼做更改,但是覺得還沒有保存在暫存區(qū)的內(nèi)容好,那么就可能要將工作區(qū)的內(nèi)容恢復(fù)到和暫存區(qū)一致)
版本回退
想要回退版本,一般都是本地先回退版本到某個分支,然后再推到遠程,再合并
- git reset --hard HEAD^
- 將當(dāng)前分支回退一個版本
- git reset --hard HEAD^^
- 回退到上上個版本, 版本號可以回退的版本為head-100
- git reset --hard 版本號
- 回退到具體某個版本
查看版本號
各種分支的每一次commit都會生成一個版本號
- git log
- 只顯示當(dāng)前分支的 版本變化
- git log --oneline
- 顯示版本號以及每次commit的變動內(nèi)容(commit -m "變動信息"),列表的形式展示
- git log -n4
- 代表著最近4個記錄
- git log -n4 --oneline
- 最近4次記錄,列表的形式展示
- git log --all
- 列出本地所有分支的歷史版本
- git log --all --graph
- 以樹形圖的方式展示所有版本歷史信息
- git log --pretty=oneline
- 查看版本信息,比較美觀,列表形式展示
其他基礎(chǔ)命令
查看每次更改內(nèi)容及版本差異
- git diff
- 還沒有add之前,可以通過這個命令看到對哪些文件做了更改
- git diff 版本號1 版本號2
- 可以查看兩個版本有哪些不同
- git diff -- filename
- 只比較工作區(qū)和暫存區(qū)某個文件的差異
- 可以比較多個指定文件,空格分開文件名
- git diff --cached
- 暫存區(qū)和HEAD之間的差異(add命令之后)
- git status
- 查看當(dāng)前工作區(qū)內(nèi)容和暫存區(qū)內(nèi)容情況
刪除git管理的文件
- git rm filename
- 從git 版本庫刪除文件
重命名git管理的文件
- git mv filename new_filename
- 將文件重命名