Git是一種分佈式版本控制系統,由Linux之父Linus開發。html
所謂分佈式版本管理系統,就是在每一臺機器上都有一個完整的倉庫。前端
Git官網:gitvue
在官網上能夠獲取Git的安裝軟件。git
除此以外,還能夠下載《progit》——這是最棒的Git學習資料,並且有中文版本。github
從 https://git-scm.com/downloads
官方下載地址下載對應的操做系統版本一步步安裝便可。數據庫
安裝完成以後,在任意目錄下,右鍵 Git Bash Here
vim
全局配置郵箱和用戶名(–global
表示全局配置,也能夠不配置,每一個倉庫單獨配置)bash
$ git config --global user.name "test" $ git config --global user.email test@qq.com
Git有四個工做區域:app
工做區編輯器
簡單說工做區就是咱們項目的目錄。
倉庫區/本地倉庫
工做區有一個.git
目錄,其實這個不是工做區,是Git的版本庫,存儲了Git倉庫的全部版本信息
暫存區
暫存區域是一個文件,保存了下次將提交的文件列表信息,通常在 Git 倉庫目錄中。 有時候也被稱做「索引」,
不過通常說法仍是叫暫存區域。
遠程倉庫
對於分佈式版本管理系統,遠程倉庫不是必須存在的,可是一般項目都會有遠程倉庫。例如Github
就是咱們很是熟悉的遠程倉庫。
基本的Git工做流程以下:
以上幾個區域的關係能夠用下圖表示:
分支是爲了將修改記錄的整個流程分開存儲,讓分開的分支不受其它分支的影響,因此在同一個數據庫裏能夠同時進行多個不一樣的修改。
Git 爲咱們自動建立的第一個分支,也叫主分支,通常其它分支開發完成後都要合併到 master
在git中,文件主要有四種狀態:
Untracked: 未跟蹤, 此文件在文件夾中, 但並無加入到git庫, 不參與版本控制. 經過git add
狀態變爲Staged
.
Unmodify(Committed): 文件已經入庫, 未修改, 即版本庫中的文件快照內容與文件夾中徹底一致. 這種類型的文件有兩種去處, 若是它被修改, 而變爲Modified
. 若是使用git rm
移出版本庫, 則成爲Untracked
文件
Modified: 文件已修改, 僅僅是修改, 並無進行其餘的操做. 這個文件也有兩個去處, 經過git add
可進入暫存staged
狀態, 使用git checkout
則丟棄修改過, 返回到unmodify
狀態, 這個git checkout
即從庫中取出文件, 覆蓋當前修改
Staged: 暫存狀態. 執行git commit
則將修改同步到庫中, 這時庫中的文件和本地文件又變爲一致, 文件爲Unmodify
狀態. 執行git reset HEAD filename
取消暫存, 文件狀態爲Modified
看完上面的Git基礎,你可能有一些迷惑,接下來,咱們以實際工做中開發的流程來加深對Git的理解吧。
能夠經過在工做區使用git init
來初始化一個Git倉庫,但一般開發中咱們不會這樣作,由於實際的項目大部分已經進行了部分開發,並進行了版本管理,因此咱們首先作的是從遠程倉庫克隆項目。
這裏我從Gitee(通常開發項目的遠程倉庫是部署在內網的GitLab) fork
了一個開源項目,將這個項目做爲遠程倉庫的項目:
點擊克隆下載
,能夠看到項目的路徑,
HTTPS
是憑據式的路徑,使用此路徑,向遠程倉庫推送代碼的時候須要憑據(帳號密碼);
這種方式向遠程倉庫提交,會要求帳號密碼,輸入完成以後,Win10操做系統能夠選擇記住憑據,這樣就不用每一次都輸入了,Win10操做系統管理憑據
控制面板 → 用戶賬戶 → 憑據管理器 → Windows憑據
SSH
是祕鑰式的路徑,向遠程倉庫推送代碼的時候,須要本地的私鑰和遠程倉庫的公鑰對應。
SSH配置能夠參考 Windows配置Github、Gitee共存的Git環境,這裏就不詳細展開講解。
我已經進行了公私鑰的配置,因此這裏選擇SSH。
使用git clone
命令克隆項目
項目已經成功克隆,接下來要進行咱們的開發了。
一般開發不是在Master
分支上,而是在開發分支上,使用 git branch develop
建立一個新分支:
能夠經過git branch
命令列出全部分支:
能夠看到咱們新建的分支。
使用git checkout develop
命令切換到新建的develop分支:
接下來,咱們再develop分支上進行一些開發操做,我這裏對 redeme 進行了一些修改,須要把修改添加到暫存區。
首先經過 git status
命令查看工做區文件狀態
接下來使用 git add README.md
命令(可使用git add .
添加全部修改)將更改添加到暫存區
能夠看到文件已經添加。
接下來使用git commit -m "😀修改了redeme"
,將修改提交到倉庫
這裏值得一提的是,咱們的提交信息儘可能遵循某種規範,例如在提交信息中體現本次提交的類型:
- feat :新功能
- fix : bug修復
- docs :文檔變動
- style :與樣式相關的全部變更
- refactor :既不是bug修復也未添加功能的代碼更改
- test :與測試有關全部變更
- chore :改變了構建任務,程序包管理器配置等
規範而精確的提交信息不只能幫助咱們的同事快速瞭解咱們的提交,也對咱們本身的開發和重構有很大的幫助。我喜歡用表情包標註提交類型,這樣從遠程倉庫看提交記錄比較好看😄
能夠經過git log
命令查看提交歷史:
可使用git push origin develop
命令將修改推送到遠程倉庫,在推送以前,一般經過git pull origin develop
(本實例遠程倉庫不存在develop分支,因此直接推送)命令來拉取遠程倉庫——這個是爲了不本地版本落後的狀況,固然若是衝突你也能夠強制提交,只是你的同事會作出什麼過激行爲不敢保證。😂
在咱們的遠程倉庫就能夠看到此次提交了:
最終咱們的提交都是要合併到master
分支的,首先切換到master
分支,接着經過命令,git merge develop
命令,將develop
分支合併到master
。
咱們這個分支是沒有衝突的,可能在合併的過程當中會出現衝突的狀況,能夠經過 git status
查看衝突的文件,手動解決衝突。固然,能夠藉助一些開發工具來完成這個工做,下文再講。
假如說,咱們發現此次提交不是咱們想要的,能夠經過 git reset --hard HEAD^
回退到上一次提交
假如咱們要發佈一個版本,咱們一般會給此次提交打一個標籤 git tag publish/0.0.1
能夠經過git tag
命令來查看咱們打的標籤。
在上面有這樣一張圖片,基本上平常使用記住這6個命令就能夠了,可是要想熟練使用,可能就須要記住更多命令了,這裏整理了一些經常使用的命令。
# 在當前目錄新建一個Git代碼庫 $ git init # 新建一個目錄,將其初始化爲Git代碼庫 $ git init [project-name] # 下載一個項目和它的整個代碼歷史 $ git clone [url]
Git的設置文件爲.gitconfig,它能夠在用戶主目錄下(全局配置),也能夠在項目目錄下(項目配置)。
# 顯示當前的Git配置 $ git config --list # 顯示 Git 的某一項配置 $ git config <key> # 編輯Git配置文件 $ git config -e [--global] # 設置提交代碼時的用戶信息,選擇global即全局配置 $ git config [--global] user.name "[name]" $ git config [--global] user.email "[email address]"
這裏的增長/刪除文件指的是向暫存區增長/刪除文件。
# 查看文件狀態,查看當前工做區新增、更改或刪除的文件 $ git status # 添加指定文件到暫存區,能夠添加多個文件,中間以空格隔開 $ git add [file1] [file2] ... # 添加指定目錄到暫存區,包括子目錄 $ git add [dir] # 添加當前目錄的全部文件到暫存區 $ git add . # 添加每一個變化前,都會要求確認 # 對於同一個文件的多處變化,能夠實現分次提交 $ git add -p # 刪除工做區文件,而且將此次刪除放入暫存區 $ git rm [file1] [file2] ... # 中止追蹤指定文件,但該文件會保留在工做區 $ git rm --cached [file] # 更名文件,而且將這個更名放入暫存區 $ git mv [file-original] [file-renamed] # 臨時保存修改,可跨分支 # save爲可選項 $ git stash [save message] # 全部保存的記錄列表 $ git stash list # 恢復工做進度到工做區,此命令的stash@{num}是可選項,在多個工做進度中能夠選擇恢復,不帶此項則默認恢復最近的一次進度至關於git stash pop stash@{0} $ git stash pop [stash@{num}] # 恢復工做進度到工做區且該工做進度可重複恢復,此命令的stash@{num}是可選項,在多個工做進度中能夠選擇恢復,不帶此項則默認恢復最近的一次進度至關於git stash apply stash@{0} $ git stash apply [stash@{num}] # 刪除一條保存的工做進度,此命令的stash@{num}是可選項,在多個工做進度中能夠選擇刪除,不帶此項則默認刪除最近的一次進度至關於git stash drop stash@{0} $ git stash drop stash@{num} # 刪除全部保存 $ git stash clear
# 提交暫存區到倉庫區,若是不加-m,會進入vim編輯器 $ git commit -m [message] # 提交暫存區的指定文件到倉庫區 $ git commit [file1] [file2] ... -m [message] # 提交工做區自上次commit以後的變化,直接到倉庫區 $ git commit -a # 提交時顯示全部diff信息 $ git commit -v # 使用一次新的commit,替代上一次提交 # 若是代碼沒有任何新變化,則用來改寫上一次commit的提交信息 $ git commit --amend -m [message] # 重作上一次commit,幷包括指定文件的新變化 $ git commit --amend [file1] [file2] ...
# 列出全部本地分支 $ git branch # 列出全部遠程分支 $ git branch -r # 列出全部本地分支和遠程分支 $ git branch -a # 新建一個分支,但依然停留在當前分支 $ git branch [branch-name] # 新建一個分支,並切換到該分支 $ git checkout -b [branch] # 新建一個分支,指向指定commit $ git branch [branch] [commit] # 新建一個分支,與指定的遠程分支創建追蹤關係 $ git branch --track [branch] [remote-branch] # 切換到指定分支,並更新工做區 $ git checkout [branch-name] # 切換到上一個分支 $ git checkout - # 創建追蹤關係,在現有分支與指定的遠程分支之間 $ git branch --set-upstream [branch] [remote-branch] # 合併指定分支到當前分支 $ git merge [branch] # 查看分支合併狀態 $ git rerere status # 顯示合併衝突解決方案的當前狀態——開始解決前與解決後的樣子 $ git rerere diff # 選擇一個commit,合併進當前分支 $ git cherry-pick [commit] #分支重命名 $ git git branch -m [oldName] [newName] # 刪除分支 $ git branch -d [branch-name] # 刪除遠程分支 $ git push origin --delete [branch-name] $ git branch -dr [remote/branch]
# 列出全部tag $ git tag # 新建一個tag在當前commit $ git tag [tag] # 新建一個tag在指定commit $ git tag [tag] [commit] # 刪除本地tag $ git tag -d [tag] # 刪除遠程tag $ git push origin :refs/tags/[tagName] # 查看tag信息 $ git show [tag] # 提交指定tag $ git push [remote] [tag] # 提交全部tag $ git push [remote] --tags # 新建一個分支,指向某個tag $ git checkout -b [branch] [tag]
# 顯示有變動的文件 $ git status # 顯示當前分支的版本歷史 $ git log # 顯示commit歷史,以及每次commit發生變動的文件 $ git log --stat # 搜索提交歷史,根據關鍵詞 $ git log -S [keyword] # 顯示某個commit以後的全部變更,每一個commit佔據一行 $ git log [tag] HEAD --pretty=format:%s # 顯示某個commit以後的全部變更,其"提交說明"必須符合搜索條件 $ git log [tag] HEAD --grep feature # 顯示某個文件的版本歷史,包括文件更名 $ git log --follow [file] $ git whatchanged [file] # 顯示指定文件相關的每一次diff $ git log -p [file] # 顯示過去5次提交 $ git log -5 --pretty --oneline # 顯示全部提交過的用戶,按提交次數排序 $ git shortlog -sn # 顯示指定文件是什麼人在什麼時間修改過 $ git blame [file] # 顯示暫存區和工做區的差別 $ git diff # 顯示暫存區和上一個commit的差別 $ git diff --cached [file] # 顯示工做區與當前分支最新commit之間的差別 $ git diff HEAD # 顯示兩次提交之間的差別 $ git diff [first-branch]...[second-branch] # 顯示今天你寫了多少行代碼 $ git diff --shortstat "@{0 day ago}" # 顯示某次提交的元數據和內容變化 $ git show [commit] # 顯示某次提交發生變化的文件 $ git show --name-only [commit] # 顯示某次提交時,某個文件的內容 $ git show [commit]:[filename] # 顯示當前分支的最近幾回提交 $ git reflog
# 克隆遠程倉庫 $ git clone [url] # 下載遠程倉庫的全部變更 $ git fetch [remote] # 顯示全部遠程倉庫 $ git remote -v # 顯示某個遠程倉庫的信息 $ git remote show [remote] # 增長一個新的遠程倉庫,並命名 $ git remote add [shortname] [url] # 取回遠程倉庫的變化,並與本地分支合併 $ git pull [remote] [branch] # 拉取遠程分支,同時建立本地分支 $ git fetch [remote] 遠程分支名x:本地分支名x # 拉取遠程分支,同時建立本地分支,且切換到該分支 $ git checkout -b [branch] [origin/遠程分支名] # git pull至關於如下兩步 # 一、拉取遠程分支 $ git fetch [remote] [branch] # 二、合併到當前分支 git merge [remote/branch] # 上傳本地指定分支到遠程倉庫 $ git push [remote] [branch] # 強行推送當前分支到遠程倉庫,即便有衝突 $ git push [remote] --force # 推送全部分支到遠程倉庫 $ git push [remote] --all # 更新遠程分支列表 $ git remote update [remote] --prune $ git remote update [remote] -p # 刪除和遠程倉庫的關聯 $ git remote rm [remote]
# 恢復暫存區的指定文件到工做區 $ git checkout [file] # 恢復某個commit的指定文件到暫存區和工做區 $ git checkout [commit] [file] # 恢復暫存區的全部文件到工做區 $ git checkout . # 重置暫存區的指定文件,與上一次commit保持一致,但工做區不變 $ git reset [file] # 重置暫存區與工做區,與上一次commit保持一致 $ git reset --hard # 重置當前分支的指針爲指定commit,同時重置暫存區,但工做區不變 $ git reset [commit] # 回退到上一次提交 $ git reset --hard HEAD^ # 重置當前分支的HEAD爲指定commit,同時重置暫存區和工做區,與指定commit一致 $ git reset --hard [commit] # 重置當前HEAD爲指定commit,但保持暫存區和工做區不變 $ git reset --keep [commit] # 新建一個commit,用來撤銷指定commit # 後者的全部變化都將被前者抵消,而且應用到當前分支 $ git revert [commit] # 暫時將未提交的變化移除,稍後再移入 $ git stash $ git stash pop
在Git中一些操做例如解決衝突
、分支比較
等等使用圖形化的操做可能會更加方便快捷。
TortoiseGit是一款不錯的圖形化Git工具,是一個不錯的選擇,下載地址:https://tortoisegit.org/download/
固然,使用開發工具集成Git,也是一個不錯的選擇。
IDEA是當前最好用的Java開發IDE,IDEA默認集成了對Git的支持,只須要配置設置執行程序便可。
File
--> Settings
--> Version Control
--> Git
,修改Git執行路徑爲本身安裝的Git路徑。Idea中能夠很是便捷的進行遠程倉庫相關的操做。
經過Idea能夠直接拉取遠程倉庫的代碼
File
--> New
---> Project From Version Controller
--> Git
Clone
這樣遠程倉庫的代碼就克隆到了本地。
上面咱們拉取的是遠程倉庫主幹代碼,咱們也能夠拉取遠程分支代碼。右下角,點開分支。
能夠看到 Remote Branchs
,下面就是遠程倉庫的分支。點擊遠程分支,Checkout As
,就能夠把遠程分支拉到本地了。
咱們在提交代碼前最好先更新下遠程倉庫的代碼到本地倉庫,這樣能夠減小沒必要要的衝突,更新update能夠直接經過快捷鍵 Ctrl + T
,也能夠經過工具欄上按鍵來實現:
在IDEA中開發好本身的代碼以後如何提交到遠程倉庫呢?右鍵項目
-->Git
在IDEA中,咱們會看到文件被標識着不一樣顏色:紅色,綠色,藍色。它們分別表明什麼意思呢?
紅色:未被版本控制的文件,即未添加到版本控制的文件,例如咱們添加到ignore中的文件。
綠色:新加入版本的文件,即咱們新建立的文件,還未提交到遠程倉庫。
藍色:修改過的文件,即遠程倉庫中已有該文件,咱們此次對它進行了修改,可是還未提交。
這裏再接着看看幾個按鍵的做用:
2.Add:把本地文件從工做目錄添加到本地倉庫的stage區,對應Git的Add命令。
3.Compare with Branch…:與遠程分支比較。咱們提交前能夠經過此功能比較下咱們工做目錄中代碼和遠程分支代碼的異同。
4.Show History:查看歷史修改版本記錄。
5.Revert:回滾,會將你的本地修改回滾。
6.Repository:各類倉庫命令。
點擊New Branch能夠新建分支
在Idea中這些功能的使用也常簡單,點擊分支,點擊要操做的分支,就能夠看到這些選項
再Version Controller
裏log
能夠查看提交歷史
上面咱們提了分支合併,能夠從本地分支合併,也能夠從遠程倉庫合併,通常兩個並行開發的分支合併都是會有衝突,Idea中合併衝突是很是方便的。
Merge
Version Controller
中處理VS Code是當前最流行的前端開發工具,VS Code對Git的支持不是那麼強大,可是能夠經過插件來加強Git功能。
個人VS Code配置了中文包。
點擊左側Git標識,能夠看到不少的操做。
當對文件進行修改後,有三種狀態
文件按鈕的的意思。
(對應 git add 命令)
確認了文件以後,在輸入框輸入此次更新的內容,而後點擊打勾就能夠保存這一次更新了 (對應 git commit 命令)
若是當前全部的 Changes 都要 commit ,那能夠直接輸入上傳的信息而且打勾就能夠快速 commit 了。
完成提交之後,vscode 的左下角就會出現上箭頭的數字爲 1 (上箭頭是 push 的更新,下箭頭是能夠 pull 的更新)
固然若是以前沒有 push 過代碼的話,這個可能會沒有數字顯示。
這個時候就能夠將代碼推送到 遠程倉庫上了 (對應 git push 命令)
OK,遠程倉庫就能夠看到咱們的提交了。
也能夠經過 vscode 左下角的下箭頭看到倉庫是否能夠 拉取,而後點擊菜單的 git pull 進行倉庫更新 (對應 git pull
命令)
vscode 能夠直接在左下角建立分支,也能夠切換分支。
上面的功能知足了基本要求,若是還須要
代碼比對
,解決衝突
,能夠選擇插件,目前公認的最好用的插件是GitLens。
打開插件商店,搜索 GitLens
,安裝便可。
安裝完成以後側邊的工具欄會多出一個 git 分支圖標,點擊就能夠查看更詳細的信息了。
同時發現,每一行代碼都會顯示提交人和提交信息
修改文件後,Gitlens 側邊會有顏色塊告訴你代碼的更新狀況:
在右上角點擊查看更改
,能夠查看當前文件的更改。
VScode 內置的 git 會告訴你有衝突的文件,而後經過 Gitlens 能夠快速調整衝突。
參考
【1】:Git 從入門到放不下
【2】:經常使用Git命令整理
【3】:Git分支管理策略
【4】:vue-blog
【5】:《progit》