如今大部分的開發團隊都以 Git 做爲本身的版本控制工具,須要對 Git 的使用很是的熟悉。這篇文章中本人整理了本身在開發過程當中常用到的 Git 命令,方便在偶爾忘記時速查。使用 GUI 工具的同窗,也能夠對照起來看看。git
1. 在安裝完成 Git 後,開始正式使用前,是須要有一些全局設置的,如用戶名、郵箱。github
設置的主要命令是 git config
:小程序
git config --global user.name "your name" // 設置全局用戶名 git config --global user.email "your email" // 設置郵箱
其中, --global
指定爲全局配置,不使用該參數,則爲當前所在倉庫配置。微信
2. 除了用戶名、郵箱以外,還有不少的配置能夠用來自定義 Git,如:網絡
git config --global color.ui true // 讓 Git 顯示不一樣的顏色 git config core.ignorecase true // 讓 Git 對倉庫中的文件大小寫敏感
3. 查看全部的已經作出的配置:app
git config -l
在本地建立 Git 版本庫,須要使用 git init
命令。ssh
首先,你須要新建一個存放版本庫的目錄,而後進入到該目錄所在路徑,而後執行:ide
git init
而後查看目錄結構中,就能夠看到包含有 .git
子目錄,這就說明建立版本庫成功了。工具
要將一個文件歸入到版本庫管理,首先要將其添加到暫存區(這裏不作深刻介紹),而後才能提交到倉庫中。fetch
2.1 將文件添加到暫存區,使用的是 git add
:
git add Readme.md // 添加單個文件到暫存區 git add . // 將當前目錄下全部修改添加到暫存區,除按照規則忽略的以外
注意:這邊空文件夾是不會被添加到暫存區中的。
2.2 將暫存區中的文件,提交到倉庫中。須要使用 git commit
:
git commit // 若是暫存區有文件,則將其中的文件提交到倉庫 git commit -m 'your comments' // 帶評論提交,用於說明提交內容、變動、做用等
注意:這邊直接用
git commit
提交,會先彈出添加評論的頁面。
不論咱們是新建了文件,將文件加入暫存區,或者其餘的修改等等,咱們均可以經過:
git status
來隨時查看倉庫中文件的狀態。這個應該是使用 Git 作版本控制過程當中,我使用最多的一個命令。
很常常的,咱們對某個文件作了修改,但過不久就忘記了。這時候就能夠經過 git diff
來查看具體的修改內容。
git diff // 查看版本庫中全部的改動 git diff Readme.md // 查看具體文件的改動
有的時候,你會須要查看本身作過哪些提交,來回顧本身完成的部分。或者須要尋找某個具體的提交來查看當時的代碼。這裏須要用到:
git log // 顯示全部提交的歷史記錄 git log --pretty=oneline // 單行顯示提交歷史記錄的內容
在 git log
的輸出內容中,能夠看到每次提交的 ID,是一個 40 位的字符串。
有了 git log
來查看提交的歷史記錄,咱們就能夠經過 git reset --hard
來回退到咱們須要的特定版本,而後使用當時的代碼進行各類操做。
git reset --hard HEAD^ // 回退到上一個提交版本 git reset --hard HEAD^^ // 回退到上上一個提交版本 git reset --hard 'commit_id' // 會退到 commit_id 指定的提交版本
當退回到某個提交的版本之後,再經過 git log
是沒法顯示在這以後的提交信息的。可是,經過 git reflog
能夠獲取到操做命令的歷史。
所以,想要回到將來的某個提交,先經過 git reflog
從歷史命令中找到想要回到的提交版本的 ID,而後經過 git reset --hard
來切換。
git reflog git reset --hard 'commit_id'
撤銷修改一樣包括兩方面的內容,因爲倉庫中的文件在提交以前,可能在工做區中,還沒有在版本控制範圍內,也可能在暫存區中。
8.1 丟棄工做區中文件的修改
git checkout -- Readme.md // 若是 Readme.md 文件在工做區,則丟棄其修改 git checkout -- . // 丟棄當前目錄下全部工做區中文件的修改
注意:
git checkout --
中的--
是必須的。
8.2 丟棄已經進入暫存區的修改
git reset HEAD Readme.md // 將 Readme.md 恢復到 HEAD 提交版本的狀態
在文件未添加到暫存區以前,對想刪除文件能夠直接物理刪除。或者經過 git checkout -- file
來丟棄。若是文件已經被提交,則須要 git rm
來刪除:
git rm Readme.md // 刪除已經被提交過的 Readme.md
注意:
git rm
只能刪除已經提交到版本庫中的文件。其餘狀態的文件直接用這個命令操做是出錯的。
git rm
與 先 rm 而後 git add
的區別
更詳細的能夠參考:"git rm" 和 "rm" 的區別
注意:上圖中的結果是在 git 1.9.1 版本上的操做。在 git 2.0 以上二者沒有區別了。
分支是版本控制系統中很重要的一個概念,在 Git 中新建、合併等分支的操做很是輕量便捷,所以咱們會很常常的用到。
查看分支使用 git branch
:
git branch // 查看本地分支信息 git branch -v // 查看相對詳細的本地分支信息 git branch -av // 查看包括遠程倉庫在內的分支信息
注意:在
git branch
的輸出內容中,有一個分支,前面帶有*
號,這標識咱們當前所在的分支。
當咱們要修復一個 Bug,或者開發一個新特性,甚至是在初學的時候怕打亂原來的代碼,均可以新建一個分支來避免對原來代碼的影響。
git branch dev // 新建一個名稱爲 dev 的分支
當咱們建立完分支之後,咱們須要切換到新建的分支,不然,全部的修改,仍是在原來的分支上。事實上,全部的改動,只能影響到當前所在的分支。
git checkout dev // 新建完 dev 分支之後,經過該命令切換到 dev 分支
git checkout -b dev // 新建 dev 分支,並切換到該分支上
這個命令合併了前兩個獨立的命令,日常使用中通常這樣使用。
當咱們修復完成一個 Bug,或者開發完成一個新特性,咱們就會把相關的 Bug 或者 特性的上修改合併回原來的主分支上,這時候就須要 git merge
來作分支的合併。
首先須要切換回最終要合併到的分支,如 master
:
git checkout master // 切換回 master 分支 git merge dev // 將 dev 分鐘中的修改合併回 master 分支
合併回主分支的時候,後面可能會面臨到衝突的問題。衝突的解決暫不在這裏說明。
當以前建立的分支,完成了它的使命,如 Bug 修復完,分支合併之後,這個分支就不在須要了,就能夠刪除它。
git branch -d dev // 刪除 dev 分支
上面的全部命令都是針對本地倉庫的操做。當咱們但願多我的來協做時,會將代碼發佈到一個統一的遠程倉庫,而後多我的在本地操做之後,在推送到遠程倉庫。其餘人協做時,須要先同步遠程倉庫的內容,再推送本身的修改。
若是你本地沒有倉庫,但願從已有的遠程倉庫上覆制一份代碼,那麼你須要 git clone
。
git clone https://github.com/git/git.git // 經過 https 協議,克隆 Github 上 git 倉庫的源碼 git clone linfuyan@github.com/git/git.git // 經過 ssh 協議,克隆 Github 上 git 倉庫的源碼
注意:
git clone
後面的倉庫地址,能夠支持多種協議,如 https, ssh 等。
若是你已經有了一個本地倉庫,如以前建立的 git-guide
,而後你打算將它發佈到遠程,供其餘人協做。那麼使用:
git remote add origin your_remote_git_repo // 爲本地倉庫添加遠程倉庫
當本地倉庫中,代碼完成提交,就須要將代碼等推送到遠程倉庫,這樣其餘協做人員能夠從遠程倉庫同步內容。
git push -u origin master // 第一次推送時使用,能夠簡化後面的推送或者拉取命令使用 git push origin master // 將本地 master 分支推送到 origin 遠程分支
注意:
git push -u origin master
,第一次使用時,帶上-u
參數,在將本地的 master 分支推送到遠程新的 master 分支的同時,還會把本地的 master 分支和遠程的 master 分支關聯起來。
在多人協做過程當中,當本身完成了本地倉庫中的提交,想要向遠程倉庫推送前,須要先獲取到遠程倉庫的最新內容。
能夠經過 git fetch
和 git pull
來獲取遠程倉庫的內容。
git fetch origin master git pull origin master
git fetch
和 git pull
之間的區別:
git fetch
是僅僅獲取遠程倉庫的更新內容,並不會自動作合併。git pull
在獲取遠程倉庫的內容後,會自動作合併,能夠當作 git fetch
以後 git merge
。注意:建議多使用
git fetch
。
git remote [-v] // 顯示遠程倉庫信息
在本地倉庫中的分支和遠程倉庫中的分支是對應的。通常狀況下,遠程倉庫中的分支名稱和本地倉庫中的分支名稱是一致的。
有的時候,咱們會須要指定本地分支與遠程分支的關聯。
git branch --set-upstream 'local_branch' origin/remote_branch
當遠程的倉庫地址發生變化時,須要修改本地倉庫對應的遠程倉庫的地址。主要應用在工程遷移過程當中。
git remote set-url origin url
在項目開發過程當中,當一個版本發佈完成時,是須要對代碼打上標籤,便於後續檢索。獲取處於其餘的緣由,須要對某個提交打上特定的標籤。
git tag -a 'tagname' -m 'comment' 'commit_id'
-a
參數指定標籤名, -m
添加備註信息, 'commit_id' 指定打標籤的提交。
git tag // 查看本地倉庫中的全部標籤
git show tagname
若是打的標籤出錯,或者不在須要某個標籤,則能夠刪除它。
git tag -d tagname
git push origin :refs/tags/tagname git push origin --delete tagname git push origin :tagname
打完標籤之後,有須要推送到遠程倉庫。
6.1 推送單個標籤到遠程倉庫
git push origin tagname
6.2 一次性推送全部標籤到遠程倉庫。
git push origin --tags
在執行不少的 Git 操做的時候,是須要保持當前操做的倉庫/分支處於 clean 狀態,及沒有未提交的修改。如 git pull
, git merge
等等,若是有未提交的修改,這些將沒法操做。
可是作這些事情的時候,你可能修改了比較多的代碼,卻又不想丟棄它。那麼,你須要把這些修改臨時保存起來,這就須要用到 git stash
。
1.1 臨時保存修改,這樣倉庫就能夠回到 clean 狀態。
git stash // 保存本地倉庫中的臨時修改。
注意:能夠屢次的
git stash
來保存不一樣的臨時修改。
1.2 查看臨時保存。當你臨時保存之後,後面仍是要取回來的,那它們在哪裏呢?
git stash list // 顯示全部臨時修改
1.3 當咱們處理完其餘操做時,想要恢復臨時保存的修改。
git stash apply // 恢復全部保存的臨時修改 git stash pop // 恢復最近一次保存的臨時修改
1.4 或者,咱們後面以爲臨時保存不想要了,那能夠丟棄它。
git stash clear // 丟棄全部保存的臨時修改
這些是我目前在項目中常常會用到的操做,這裏整理下來,能夠做爲一個手冊。對於 Git 的理解或者更多的解釋,並不在這裏體現。你們能夠參考其餘更多的資料。
文中的思惟導圖因爲從源文件導出成圖片以後會變得模糊,關注微信公衆號 ID: up2048,回覆「腦圖」能夠免費獲取思惟導圖源文件。