原文地址:https://blog.dpf114.top/posts/git-often-used/html
單獨的講版本控制咱們或許不知道它是什麼,可是舉個咱們生活中的小例子,咱們很容易明白它是什麼。java
例如咱們畢業修改無數遍的論文:git
畢業論文最終版 畢業論文最最終版 畢業論文最最最終版 畢業論文最最最最終版 畢業論文最終不改版 畢業論文最終真不改版 畢業論文最終真真不改版 畢業論文最終打死不改版 畢業論文最終打死不改版 2 ...
這裏有不少版本,而版本控制系統就是對咱們寫的內容不一樣版本進行控制的系統。github
經常使用的版本控制系統有SVN
和Git
。咱們在實際開發中Git使用的比較多。shell
Windowssegmentfault
對於windows只要下載安裝包直接安裝便可。windows
Linux工具
使用apt-get工具下載安裝gitlab
apt-get update sudo apt-get install git
Macpost
使用brew工具下載安裝
brew install git
不論是 Windows 安裝仍是 Linux 安裝,安裝好以後,咱們都先經過以下兩行命令作一個基本配置,目的是爲了區分不一樣開發人員的身份,即每次提交都是由誰提交的。配置方式以下:
git config --global user.name 'username' git config --global user.email 'username@qq.com'
配置完成後配置信息存儲在~/.gitconfig
文件中
在基本操做以前咱們要了解一下Git使用的分區
git add
提交後臨時存放代碼的地方git commit
提交後存放代碼的地方,本地庫保存着歷史版本相關信息。初始化倉庫有兩種方式,一種是經過從遠程倉庫克隆,另一種是直接從當前目錄初始化,命令以下:
git init
執行完成後當前目錄下會多出一個 .git
的隱藏文件夾,全部 git
須要的數據和資源都存放在該目錄中。
經過git status
命令能夠查看倉庫的狀態。剛初始化的倉庫查看狀態以下:
修改工做區後查看狀態以下圖:
提交暫存區後查看狀態以下圖:
提交到本地倉庫後查看狀態以下圖:
經過git add
能夠將工做區的內容提交到暫存區,有如下幾種使用狀況:
git add 具體文件 git add . git add *
.
和*
都表明提交工做區的全部文件。
經過git commit
將暫存區內容提交到本地倉庫,具體使用以下:
git commit -m '提交描述內容'
注意:描述內容不能爲空。建議每次提交寫清楚提交內容,可用於版本回退。
若是是經過克隆的方式初始化倉庫,提交到本地庫後,能夠直接經過git push
直接提交到遠程倉庫,若是是經過git init
初始化,須要遠程遠程建立好對應倉庫後,讓本地倉庫跟遠程倉庫關聯,讓後再用 git push
提交。
關聯遠程倉庫
用git remote
命令關聯遠程倉庫,格式git remote add 別名 遠程倉庫url
,舉例以下
git remote add origin https://github.com/xiaoxiaoshou/testgit.git
這裏的url你可能兩種類型,分別爲https://github.com/username/reponame.git
和git@github.com:username/reponame.github.io.git
,表明着git兩種不一樣的鏈接方式。
其餘關聯遠程倉庫相關命令:
# 查看關聯了哪些遠程分支 git remote -v # 刪除關聯分支 git remote remove 別名
提交到遠程倉庫
提交命令格式git push 別名 分支名
,舉例以下:
git push origin master
經常使用有如下兩種方式:
1.使用git clone
默認從遠程master分支拉取:
git clone 遠程url地址
指定分支拉取:
git clone -b 分支名稱 遠程url地址
使用git pull
使用格式git pull <遠程主機名> <遠程分支名>:<本地分支名>
。
例如咱們要將遠程 origin 的 master 分支拉取過來,與本地的 master 分支合併
git pull origin master:master
咱們也能夠簡化爲
git pull origin master git pull origin git pull
git pull = git fetch+git merge
,fetch的做用是從遠程拉取代碼,merge的做用是合併代碼(後面分支管理有詳細解析)
使用git log
能夠查看提交過的信息,每次提交(git commit
)到本地倉庫的詳細信息,每條提交信息大體以下:
commit cdc2ac8c3b6d9f8bde05140aca484aa4482f8895 Author: xiaoxiaoshou <446933040@qq.com> Date: Tue Dec 1 15:41:13 2020 +0800 提交描述內容
commit後面的編號是每次提交的一個索引(咱們能夠叫它版本號),用於版本前進或後退
使用git log
顯示的內容過多,咱們通常使用下面兩個比較簡潔的查看方式:
# 推薦使用 git reflog git log --online
可能有一天你正在寫代碼,寫了好久發現寫錯了,想恢復到一開始的狀態,一個笨辦法就是把剛剛寫的代碼一行一行的刪除,不過這種方式成本過高,能夠經過 git checkout -- <file>
命令來撤銷工做區的代碼修改。以下圖:
想要撤銷提交到暫存區的代碼分如下兩步:
git reset HEAD
git checkout -- file
基於索引版本回退(推薦使用)
1.查看提交歷史
2.使用git reset --hard [局部索引值]
回退(可前進和後退)
使用^符號
git reset --hard^
一個
^
回退一步
使用~符號
git reset --hard~n
n表明後退步數
git reset 中三個參數比較
git reset --soft git reset --mixed git reset --hard
--soft
--mixed
--hard
因爲遠程倉庫與本地倉庫內容一致,因此須要遠程倉庫版本回退只須要本地版本回退再提交到遠程倉庫便可。
咱們在完成一個項目時,不多是「單線程」開發的,不少時候任務是並行的。舉個栗子:項目 2.0 版本上線了,如今要着手開發 3.0 版本,同時 2.0 版本可能還有一些 bug 須要修復,這些 bug 修復以後咱們可能還會發 2.1,2.2,2.3 這些版本,咱們不可能等全部 bug 都修復完了再去開發 3.0 版本,修復 2.0 的 bug 和開發 3.0 的新功能是兩個並行的任務,這個時候咱們 3.0 的功能開發直接在 master 分支上進行確定不合適,咱們要保證有一個穩定,能夠隨時發版本的分支存在(通常狀況下這個角色由 master 分支來扮演),此時咱們就能夠靈活的使用 Git 中的分支管理功能:
咱們可使用命令git branch
來查看當前倉庫有哪些分支和咱們當前所處的分支
前面帶*
的分支爲咱們當前所處分支。
第一種方法
git branch 分支名
建立分支git checkout 分支名
切換分支第二種方法
使用git checkout -b 分支名
建立和切換分支一步到位。
分支的整合有兩種形式,一種是merge
,另一種是rebase
merge
使用命令git merge [有新內容的分支名]
合併分支。
上圖解釋:主分支在m1時發現有bug,因而切出一個分支bugFix,通過一段時間,主分支開發到m3,bugFix分支(已提交爲m2)bug已經解決,這時候須要將bugFix分支合到主分支即便用命令git merge bugFix
。
rebase
rebase 又叫變基,使用命令git rebase [有新內容的分支]
能夠變基。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-asHdOBrc-1607004130806)(/Users/dpf/Library/Application Support/typora-user-images/image-20201202213338236.png)]
上圖解析:上圖是在主分支使用命令git rebase bugFix
進行整合分支,整合過程是將bugFix的提交記錄在主分支自底向上再提交一遍。
merge和rebase的區別
rebase過程當中可能產生衝突,解決衝突後繼續提交
git add .
git rebase --continue
如下是衝突部份內容
<<<<<<< HEAD 須要合併分支的內容 ======= 當前分支內容 >>>>>>>
咱們能夠給某一個提交打上一個標籤,以示重要。比較有表明性的打標籤用它來發布對應的應用的版本好比v1.0、v2.0。Git支持兩種標籤:輕量標籤(lightweight)與附註標籤(annotated)。
咱們能夠用如下命令查看倉庫中全部標籤:
git tag
輕量標籤很像一個不會改變的分支——它只是某個特定提交的引用。輕量標籤本質上是將提交校驗和存儲到一個文件中——沒有保存任何其餘信息。
輕量標籤打標籤格式git tag 標籤名稱
,舉例以下:
git tag v0.0
輕量標籤默認是對最新的commit
進行。
咱們也能夠對指定commit
進行打標籤,格式git tag 標籤名稱 commi對應索引
。舉例以下
# 查看commit索引 git reflog # 打標籤 git tag v0.01 bcde256
咱們也能夠刪除掉本地倉庫上的標籤,格式git tag -d 標籤名稱
,舉例:
git tag -d v0.01
附註標籤是存儲在倉庫中一個完整對象,它有本身的校驗和信息,其中包含標籤者的名字、電子郵件、日期時間,此外還有一個標籤信息。可使用 GNU Privacy Guard (GPG)
簽名並驗證。
打附註標籤格式 git tag -a 標籤名稱 -m '標籤信息'
,舉例以下:
git tag -a v1.0 -m 'my version 1.0'
默認狀況下,git push
命令並不會傳送標籤到遠程倉庫。須要咱們手動將標籤推送到遠程倉庫,推送格式git push 遠程分支別名 標籤名
,舉例:
git push origin v1.0
參考資料:
https://git-scm.com/book/zh/v2
https://www.runoob.com/git/git-tutorial.html