Git知識梳理及基礎(chǔ)操作

概念相關(guān)

Git概念

  • Git 是目前業(yè)界最流行的分布式版本控制系統(tǒng)(Version Control System),本質(zhì)上來說Git是個軟件
    • 分布式
      • 客戶端并不只提取最新版本的文件快照, 而是把代碼倉庫完整地鏡像下來,包括完整的歷史記錄。 這么一來,任何一處協(xié)同工作用的服務(wù)器發(fā)生故障,事后都可以用任何一個鏡像出來的本地倉庫恢復(fù)
    • 版本控制
      • 版本控制是一種記錄一個或若干文件內(nèi)容變化,以便將來查閱特定版本修訂情況的系統(tǒng)

Git概念的理解

這里用大學(xué)生寫論文這個事做比對,加深理解

  1. 你準備寫論文,先立題,然后開始收集資料,最后開始動筆。這個過程就可以看作使用git軟件在本地創(chuàng)建倉庫(或者是從github/gitlab上拉代碼下來),準備完成項目的初始版本
  2. 論文初稿寫好了,要仔細檢查一遍,然后提交給老師。這個過程可以理解為使用git將寫好的項目發(fā)送到github/gitlab,準備接下來的測試,需求對接,以及找bug
  3. 然后在接下來的2個月內(nèi),老師來來回回的給你提出了10多個甚至更多的問題,你就來來回回的改。這個過程就可以理解為每當(dāng)你發(fā)現(xiàn)了代碼有問題,就使用git用你的修改后的代碼更新github/gitlab上的代碼,每次更新負責(zé)檢查你的代碼的人都看得到,并且還會提過新的問題
  4. 老師說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)所有登錄的用戶都有效,用的不多
  1. 顯示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)建本地版本庫

  1. 創(chuàng)建一個準備放完整項目的文件夾(mkdir your_project_name)

  2. cd 到新創(chuàng)建的文件夾 (cd your_project_name)

  3. 在文件夾里面初始化倉庫 (git init)

  4. 將本地所有內(nèi)容(包括不同分支)推送到遠程倉庫

    git remote add origin https://github.com/user/repo.git
    git push --all
    

克隆遠端版本庫

  1. 從遠程拉取master代碼,建立本地庫和遠端的連接(git clone gitlab/github倉庫地址)
    • https方式
    • ssh方式
      • 需要配置密鑰
  2. 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
    • 將文件重命名
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容