當前位置:首頁 > 公眾號精選 > 架構(gòu)師社區(qū)
[導讀]來自:匠心Java 工作中g(shù)it是一項必不可少的技能,在項目的開發(fā)進程中起著至關(guān)重要的作用 下面介紹一些git在工作中的一些使用實踐、常用流程、常用命令,供大家參考! 一:前言 Git的定義是:分布式版本控制系統(tǒng),用于項目開發(fā)中的版本控制。 從本質(zhì)上來講 Git

收藏!工作中Git使用實踐和常用命令流程合集

來自:匠心Java


工作中g(shù)it是一項必不可少的技能,在項目的開發(fā)進程中起著至關(guān)重要的作用

下面介紹一些git在工作中的一些使用實踐、常用流程、常用命令,供大家參考!

一:前言

Git的定義是:分布式版本控制系統(tǒng),用于項目開發(fā)中的版本控制。

從本質(zhì)上來講 Git 是一個內(nèi)容尋址(content-addressable)文件系統(tǒng),并在此之上提供了一個版本控制系統(tǒng)的用戶界面。

Git 的核心部分是一個簡單的鍵值對數(shù)據(jù)庫(key-value data store)。你可以向該數(shù)據(jù)庫插入任意類型的內(nèi)容,它會返回一個鍵值,通過該鍵值可以在任意時刻再次檢索(retrieve)該內(nèi)容。

git管理的項目工作目錄下的每一個文件都不外乎這兩種狀態(tài):已跟蹤或未跟蹤。

  • 已跟蹤的文件是指那些被納入了版本控制的文件,在上一次快照中有它們的記錄,在工作一段時間后,它們的狀態(tài)可能處于未修改,已修改或已放入暫存區(qū)。

  • 工作目錄中除已跟蹤文件以外的所有其它文件都屬于未跟蹤文件,它們既不存在于上次快照的記錄中,也沒有放入暫存區(qū)。

  • 初次克隆某個倉庫的時候,工作目錄中的所有文件都屬于已跟蹤文件,并處于未修改狀態(tài)。

Git 保存的不是文件的變化或者差異,而是一系列不同時刻的文件快照。

在進行提交操作時,Git 會保存一個提交對象(commit object)。該提交對象會包含一個指向暫存內(nèi)容快照的指針。但不僅僅是這樣,該提交對象還包含了作者的姓名和郵箱、提交時輸入的信息以及指向它的父對象的指針。

二:git存儲

git將項目的存儲分為4部分,每部分有自己作用,見下圖:(圖片來自:博客)收藏!工作中Git使用實踐和常用命令流程合集

  • Workspace:工作區(qū)(當前用戶操作修改的區(qū)域)

  • Index/Stage:暫存區(qū) (add后的區(qū)域)

  • Repository:倉庫區(qū)或本地倉庫(commit后的區(qū)域)

  • Remote:遠程倉庫(push后的區(qū)域)

整體過程可以簡述為:

  • 工作區(qū)--> add-->暫存區(qū)--> commit-->本地倉庫區(qū)--> push-->遠程倉庫區(qū)

  • 遠程倉庫區(qū)--> fetch-->使用refs\remotes下對應分支文件記錄遠程分支末端commit_id 和 本地倉庫區(qū) --> merge-->工作區(qū)

  • 遠程倉庫區(qū)--> pull-->使用refs\remotes下對應分支文件記錄遠程分支末端commit_id and 本地倉庫區(qū) and 工作區(qū)

git pull和git fetch有什么不同呢?下面簡單說一下

想要知道他們得不同,我們需要先了解兩個概念

  • FETCH_HEAD:可以看做是一個版本鏈接,記錄在本地的refs\remotes下對應分支文件中,指向著目前已經(jīng)從遠程倉庫取下來的分支的最新版本的commit_id。

  • commit-id:在每次本地commit來保存當前工作到本地倉庫區(qū)后, 會產(chǎn)生一個commit-id,這是一個能唯一標識一個版本的序列號。在使用git push后,這個序列號還會同步到遠程倉庫。

所以他們之間的不同在于:

  • git pull 直接將遠程分支的修改更新到本地倉庫區(qū)和本地工作區(qū),我們就可以在本地工作區(qū)中看到最新代碼

  • git fetch 只將遠程分支的修改拉取到本地倉庫,并更新到FETCHHEAD,記錄遠程分支最新的commitid,不會更新本地工作區(qū)代碼,只有使用了 git merge 才會將提交更新到本地倉庫區(qū)和工作區(qū)

其他想要了解更多git內(nèi)部消息請移步我的另一篇博文:git內(nèi)部存儲實現(xiàn)機制

git status的體現(xiàn),見下圖:收藏!工作中Git使用實踐和常用命令流程合集

  • Changesto be committed::代表被add的文件,被加載到了暫存區(qū)

  • Changesnotstagedforcommit:代表在當前分支中被修改的文件,還沒有被add,存儲在工作區(qū)

  • Untrackedfiles :代表不被git追蹤的文件,可以理解為不被git管理的文件

  • 如果沒有Changes to be committed和Changes not staged for commit說明現(xiàn)階段所有的修改已經(jīng)被commit到本地倉庫

  • 如果git status后出現(xiàn)下述情況,說明還有已經(jīng)的commit到本地倉庫的還未被push到遠程倉庫

   
  1. $ git status

  2. On branch master

  3. Your branch is ahead of 'origin/master' by 2 commits.

  4. (use "git push" to publish your local commits)

Git 作為一個系統(tǒng),是以它的一般操作來管理并操縱(HEAD、index、Working Directory)三棵樹的

  • HEAD 是當前分支引用的指針,它總是指向該分支上的最后一次提交。這表示 HEAD 將是下一次提交的父結(jié)點。通常,理解 HEAD 的最簡方式,就是將它看做 你的上一次提交的快照。

  • index index索引是你的 預期的下一次提交。我們也會將這個概念引用為 Git 的 “暫存區(qū)域”,這就是當你運行 git commit 時 Git 看起來的樣子。Git 將上一次檢出到工作目錄中的所有文件填充到索引區(qū),它們看起來就像最初被檢出時的樣子。之后你會將其中一些文件替換為新版本,接著通過 git commit 將它們轉(zhuǎn)換為樹來用作新的提交。

  • WorkingDirectory最后,你就有了自己的工作目錄。另外兩棵樹以一種高效但并不直觀的方式,將它們的內(nèi)容存儲在 .git 文件夾中。工作目錄會將它們解包為實際的文件以便編輯。

如下圖:

 收藏!工作中Git使用實踐和常用命令流程合集

三:git提交規(guī)則

首先,有個問題需要確認一下,提交信息是使用中文還是英文呢?

如果你的項目是開源項目并且面向國際的開源項目,類似于阿里的Druid\PingCAP的TiDB等,那么一定要是用英文提交信息的!如果你的項目是公司內(nèi)部使用或者只會被公司內(nèi)部開發(fā)修改,那么中文也是不錯的,更加便于查看和管理。當然,開發(fā)組中的英文能力都不錯的話,用英文也是可以的。

分支Branch管理:如果沒有一個好的branch管理的話,可能會有下述圖的情況,刺不刺激~收藏!工作中Git使用實踐和常用命令流程合集推薦的分支管理:

  • master 分支為主分支(保護分支),禁止直接在master上進行修改代碼和提交,此分支的代碼可以隨時被發(fā)布到線上;

  • develop 分支為測試分支或者叫做合并分支,所有開發(fā)完成需要提交測試的功能合并到該分支,該分支包含最新的更改;

  • feature 分支為開發(fā)分支,大家根據(jù)不同需求創(chuàng)建獨立的功能分支,開發(fā)完成后合并到develop分支;

  • fix 分支為bug修復分支,需要根據(jù)實際情況對已發(fā)布的版本進行漏洞修復;

標簽Tag管理:Tag采用三段式:v版本.里程碑.序號(v2.3.1)

  • 架構(gòu)升級或架構(gòu)重大調(diào)整,修改第1位

  • 新功能上線或者模塊大的調(diào)整,修改第2位

  • bug修復上線,修改第3位

當然,可以根據(jù)實際情況來設(shè)計,比如項目特別大,可以使用四段表達Tag,項目比較小也可以使用二段式Tag,只要符合場景并有實際意義即可 !

提交信息格式:下面只是提供一種建議格式,大家可以根據(jù)自己的項目實際情況來定格式,只要能把當前提交表達清楚,格式統(tǒng)一,方便快速閱讀和定位即可!

1.建議中文示例:

  • <新功能>(urllAnalyz) 添加解析url功能l

  • <修改>(TestServiceImpl) 修改某功能的某個實現(xiàn)為另一個實現(xiàn)

  • (TestUnti) 修復url特殊情況下解析失敗問題 (issue#12)
  • <重構(gòu)>(getData) 重構(gòu)獲取數(shù)據(jù)的方法

  • <測試>(getDataTest) 添加(修改、刪除)獲取數(shù)據(jù)的單元測試代碼

  • <文檔>(doc)修改(添加、刪除)文檔

2.建議的英文示例:

  • feat:新功能(feature)

  • style:格式

  • fix:修補bug

  • refactor:重構(gòu)

  • test:測試相關(guān)

  • docs:文檔(documentation)

3.格式(type:scope:body:issue) <|新功能|修改|Bug修復|重構(gòu)|測試>(影響模塊)提交描述信息(#issue?)

4.優(yōu)點:

  • 與github數(shù)據(jù)issue關(guān)聯(lián),便于通過issue獲取更多信息

  • commit 提交時,格式統(tǒng)一,便于后續(xù)快速準確定位提交

  • 可以更好的將此次提交表述清楚

四:Git操作過程

4.1 初始化項目,并上傳到git服務器

基本過程:創(chuàng)建遠程倉庫、初始化本地git倉庫、將本地倉庫與遠程倉庫關(guān)聯(lián)起來、添加本地倉庫想要提交的代碼到本地git緩沖區(qū),將本地倉庫的本地分支與遠程倉庫的遠程分支關(guān)聯(lián)起來、提交代碼

  1. 在git服務器上創(chuàng)建同名git項目,并獲取http地址

  2. 本地git初始化項目git倉庫,在項目目錄下 git init

  3. 將本地git倉庫和遠程倉庫關(guān)聯(lián)起來,并設(shè)置遠程倉庫名稱 git remote add<name><http地址>

其中http地址為上述第一步獲取的遠程倉庫的地址,name一般為origin,當然也可以設(shè)置其他的名字 例如:git remote add origin http://igit.corp.com/my/test.git

    4. 添加項目文件到本地git緩沖區(qū) git add-A git commit-m '初始化項目' 或者 git commit-a-m '初始化項目'

    5. 將本地分支關(guān)聯(lián)遠程分支并提交,git默認在遠程分支上創(chuàng)建于本地分支同名的分支 git push--set-upstream origin master

這就是將本地的master分支 與 origin遠程倉庫關(guān)聯(lián)起來并在遠程倉庫創(chuàng)建同名master分支,以后本地master都提交到遠程倉庫中的origin/master分支上。

upstream:上游的意思

至此,應該就可以了,我們可以在git服務器上刷新看看是否提交上去了

4.2 提交某一分支的修改

  1. 查看當前分支的修改 git status

  2. 查看想要查看的文件的修改 git diff<file_name>

  3. 確認正確后,提交修改到暫存區(qū) git add-A或者git add<file_name><file_name>

  4. 提交到本地倉庫 git commit-m'提交信息'

  5. 提交到遠程倉庫 git push

4.3 拉取遠程分支修改到本地分支

當遠程分支別人推了一版新的代碼時,我們想要將代碼拉下來,可以采用兩種方式pull 和 fetch+merge:(他們的不同點文章上面已經(jīng)解釋)

使用pull:

  1. 將遠程分支最新代碼更新合并到本地倉庫區(qū)和工作區(qū) git pull

使用fetch:

  1. 將遠程所有分支最新的commitid更新到FETCHHEAD,記錄遠程分支最新的commit_id 和 本地倉庫區(qū) git fetch

  2. 將最新的代碼合并到工作區(qū) git merge

4.4 取消track某一文件

  1. git rm-r--cache<file_name>

untrack后,使用commit -a 時,不會將其添加到暫存區(qū)中

  1. 之后會在.ignore文件中將該untrack的文件添加進去,完成

4.5 保存賬號密碼,避免每次push都要輸入(簡單方法)

  1. 確保在git中手動輸入過賬號和密碼

  2. 輸入下面語句即可 git config--globalcredential.helper store

4.6 暫存自己的修改,便于接著工作(特別有用)

試想一個場景:如果你正在一個分支上工作修改,leader讓你改另外的分支的BUG或者對其他的分支做一些操作。

我們知道如果一個分支上有還沒有commit的修改的話,不可以切換分支,但是又因為自己的工作還未完成,不想commit,此時 git stash 就起作用了。

你要把現(xiàn)在正在工作的分支保存下來,等處理完其他的再回來接著當前分支的修改工作。

    1. 將當前分支的修改暫存起來(此處不等于add+commit) git stash

備份當前的工作區(qū)的內(nèi)容,從最新的一次提交中讀取相關(guān)內(nèi)容,讓工作區(qū)保證和上次提交的內(nèi)容一致。同時,將當前的工作區(qū)修改的內(nèi)容保存到Git棧中暫存起來。

    2. 切換到別的分支工作,完成后切換回原來的工作分支,查看暫存列表 git stash list

顯示Git棧內(nèi)的所有備份,可以利用這個列表來決定從那個地方恢復

    3. 恢復暫存的修改到工作區(qū) git stash apply<stash_name> 恢復暫存之后不刪除暫存

從Git棧中讀取最新一次保存的內(nèi)容,恢復工作區(qū)的相關(guān)內(nèi)容。

    git stash pop 恢復暫存之后刪除暫存

從Git棧中讀取最新一次保存的內(nèi)容,恢復工作區(qū)的相關(guān)內(nèi)容。之后pop會刪除最新的暫存。

    4. 刪除“暫存” git stash drop<stash_name>

從Git棧刪除最舊的一個暫存

結(jié)束

4.7 將文件修改回退到某一狀態(tài)

一些已經(jīng)提交的或者已經(jīng)修改的部分,想要再修改一下,或者刪除已經(jīng)提交的

a. 刪除某些commit,將head重定位到某一commit(回溯到以前的版本) git reset--hard<commit_id> 

注意?。。∩鲜雒顣ommit_id前的所有commit修改刪除
git reset<commit_id> 

上述命令不會將commit_id前的commit刪除,而是會將修改回退到本地工作區(qū) 

git push origin HEAD--force 此步驟將服務器方也設(shè)置為相應的commit

b. 將文件修改恢復到當前已提交分支的原樣(未 git add 情況下) 撤銷修改就回到和版本庫一模一樣的狀態(tài),即用版本庫里的版本替換工作區(qū)的版本

git checkout--<file_name>

c. 將文件修改恢復到當前已提交分支的原樣(已經(jīng) git add 情況下) 

git reset HEAD 將add退回 

git checkout--<file_name>

d. 將文件修改恢復到已提交分支的原樣(已經(jīng) git commit 情況下) 

git reset<commit_id> 此處commit_id可以是任意分支的commit_id 

git checkout--<file_name>

4.8 版本的回溯與前進

有時候需要回溯或前進到以前的版本 或 回溯前進到以前的commit

只要記住commit_id就可以在版本之間來回的穿梭,注意是可以“來回”穿梭哦

  1. 獲取需要回溯到版本的commitid git log --> 復制所需的版本commitid

  2. 回退到該版本 git reset--hard<commit_id>

  3. 如果想讓服務器也回退到該版本的話 git push origin HEAD--force

更多文章,請關(guān)注“匠心Java”公眾號!

五:Git常用命令

初始化項目為git項目 

git init

clone服務器代碼到本地 

git clone<http_url>

添加修改文件到暫存區(qū) 

git add<file_name> 

git add-A 添加所有修改文件到暫存區(qū)

提交修改到本地倉庫 

git commit-m'提交信息' 

git commit-a-m'提交信息' 相當于git add -A + git commit -m 的整合

提交本地倉庫的修改到遠程倉庫 

git push

將遠程庫 的遠程分支 作為當前分支的上游分支  

git push--set-upstream<remote_name><branch_name> 為遠程倉庫的別名,一般為origin

查看文件本次的修改 

git diff 顯示本次所有被修改文件的修改 

git diff<file_name> 顯示該文件本次的修改

查看當前分支下當前狀態(tài) 

git status 顯示出被修改的文件和提交的次數(shù)等

查看提交歷史 

git log 

git log--graph 查看分支合并圖

merge其他分支到當前分支 

git merge<branch_name>

在merge過程如果出現(xiàn)沖突,在解決沖突后會產(chǎn)生一個新的commit,并且HEAD指向該commit 如果沒有沖突,HEAD會在分支的最新commit上

切換到上一個分支 

git checkout-

切換到其他分支 

git checkout<branch_name>

在某一分支基礎(chǔ)上創(chuàng)建新分支 

git checkout<branch_name> 切換到基礎(chǔ)分支

git checkout-b<new_branch_name> 在當前分支基礎(chǔ)上 創(chuàng)建新分支

顯示分支 

git branch 所有本地分支 

git branch-r 所有遠程分支 

git branch-a 所有分支,本地和遠程

刪除本地分支 

git branch-D<branch-name>

刪除遠程分支 

git push origin--delete<branch-name>

添加一個新的遠程倉庫 

git remote add<shortname><url>

在同一個項目的git url中可以添加多個遠程倉庫 每個倉庫相互隔離有自己的分支管理

將本地分支與遠程倉庫中分支聯(lián)系起來 

git push--set-upstream<遠程倉庫名稱><遠程倉庫中分支名稱>

以后本地的該分支的push,會默認提交到設(shè)置的遠程倉庫中遠程分支中

刪除遠程倉庫 git remote rm<遠程倉庫name>

刪除本地tag git tag-d<tag_name>

刪除遠程tag git push origin:refs/tags/<tag_name>

查看tag信息 git show<tag_name>

暫存當前修改 git stash

查看暫存列表 git stash lsit

恢復暫存的修改 

git stash apply (恢復后不刪除暫存) 

git stash pop (恢復后刪除暫存)

刪除暫存 git stash drop

撤回已經(jīng)add到暫存區(qū)的文件到本地工作區(qū) 

git reset HEAD<file_name> 

git reset HEAD 回退所有add

add會被標識為Changes to be committed,取消add后標識為Changes not staged for commit(不等于untrack)

取消track某一文件 git rm-r--cache<file_name>

untrack后,使用commit -a 時,不會將其添加到暫存區(qū)中

只merge某一個分支上的某一個commit git cherry-pick<被merge分支中的某一個commitcommit-id>

撤銷在本地工作區(qū)的文件的修改

撤銷修改就回到和版本庫一模一樣的狀態(tài),即用版本庫里的版本替換工作區(qū)的版本 git checkout--<file_name>

刪除某些commit,將head重定位到某一commit(回溯到以前的版本) 

git reset--hard<commit_id> 

git push origin HEAD--force 此步驟將服務器方也設(shè)置為相應的commit

刪除本地在遠程服務器上不存在的分支 git remote prune origin

拉取遠程分支到本地 git fetch origin<branch_name>

新建一個tag到指定commit 

git tag<tag_name><commit_id> git tag<tag_name> 當前commit

取消當前合并,重建合并前狀態(tài) git merge--abort

總結(jié)

本文介紹了Git是什么、Git的存儲結(jié)構(gòu)、Git的提交規(guī)則和一些工作中常會用到的git操作的過程,最后總結(jié)了常用的命令。Git在工作中的團隊開發(fā)中起著至關(guān)重要的作用,希望本篇文章可以對大家有些許幫助~

特別推薦一個分享架構(gòu)+算法的優(yōu)質(zhì)內(nèi)容,還沒關(guān)注的小伙伴,可以長按關(guān)注一下:

收藏!工作中Git使用實踐和常用命令流程合集

長按訂閱更多精彩▼

收藏!工作中Git使用實踐和常用命令流程合集

如有收獲,點個在看,誠摯感謝

免責聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉