常用 Git 命令使用教程
下面整理一下自己在開發過程中經常使用到的 Git 命令。使用 GUI 工具的同學,也可以對照起來看看。
Git 配置
1. 在安裝完成 Git 後,開始正式使用前,是需要有一些全局設置的,如用戶名、郵箱。
設置的主要命令是 git config
:
1 2 | git config --global user.name "your name" // 設置全局用戶名 git config --global user.email "your email" // 設置郵箱 |
其中, --global
指定為全局配置,不使用該參數,則為當前所在倉庫配置。
2. 除了用戶名、郵箱之外,還有很多的配置可以用來自定義 Git,如:
1 2 | git config --global color.ui true // 讓 Git 顯示不同的顏色 git config core.ignorecase true // 讓 Git 對倉庫中的文件大小寫敏感 |
3. 查看所有的已經做出的配置:
1 | git config -l |
基礎操作
創建 Git 版本庫
在本地創建 Git 版本庫,需要使用 git init
命令。
首先,你需要新建一個存放版本庫的目錄,然後進入到該目錄所在路徑,然後執行:
1 | git init |
然後查看目錄結構中,就可以看到包含有 .git
子目錄,這就說明創建版本庫成功了。
將文件添加到版本庫
要將一個文件納入到版本庫管理,首先要將其添加到暫存區(這裏不做深入介紹),然後才能提交到倉庫中。
1. 將文件添加到暫存區,使用的是 git add
:
1 2 | git add Readme.md // 添加單個文件到暫存區 git add . // 將當前目錄下所有修改添加到暫存區,除按照規則忽略的之外 |
註意:這邊空文件夾是不會被添加到暫存區中的。
2. 將暫存區中的文件,提交到倉庫中。需要使用 git commit
:
1 2 |
git commit // 如果暫存區有文件,則將其中的文件提交到倉庫
git commit -m ‘your comments‘ // 帶評論提交,用於說明提交內容、變更、作用等 |
註意:這邊直接用
git commit
提交,會先彈出添加評論的頁面。
查看倉庫的狀態
不論我們是新建了文件,將文件加入暫存區,或者其他的修改等等,我們都可以通過:
1 | git status |
來隨時查看倉庫中文件的狀態。這個應該是使用 Git 做版本控制過程中,我使用最多的一個命令。
查看倉庫中的具體修改
很經常的,我們對某個文件做了修改,但過不久就忘記了。這時候就可以通過 git diff
來查看具體的修改內容。
1 2 | git diff // 查看版本庫中所有的改動 git diff Readme.md // 查看具體文件的改動 |
查看提交歷史記錄
有的時候,你會需要查看自己做過哪些提交,來回顧自己完成的部分。或者需要尋找某個具體的提交來查看當時的代碼。這裏需要用到:
1 2 | git log // 顯示所有提交的歷史記錄 git log --pretty=oneline // 單行顯示提交歷史記錄的內容 |
在 git log
的輸出內容中,可以看到每次提交的 ID,是一個 40 位的字符串。
版本回退
有了 git log
來查看提交的歷史記錄,我們就可以通過 git reset --hard
來回退到我們需要的特定版本,然後使用當時的代碼進行各種操作。
1 2 3 | 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
來切換。
1 2 | git reflog git reset --hard ‘commit_id‘ |
撤銷修改
撤銷修改同樣包括兩方面的內容,由於倉庫中的文件在提交之前,可能在工作區中,尚未在版本控制範圍內,也可能在暫存區中。
1. 丟棄工作區中文件的修改
1 2 | git checkout -- Readme.md // 如果 Readme.md 文件在工作區,則丟棄其修改 git checkout -- . // 丟棄當前目錄下所有工作區中文件的修改 |
註意:
git checkout --
中的--
是必須的。
2. 丟棄已經進入暫存區的修改
1 | git reset HEAD Readme.md // 將 Readme.md 恢復到 HEAD 提交版本的狀態 |
刪除文件
在文件未添加到暫存區之前,對想刪除文件可以直接物理刪除。或者通過 git checkout -- file
來丟棄。如果文件已經被提交,則需要 git rm
來刪除:
1 | 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
:
1 2 3 | git branch // 查看本地分支信息 git branch -v // 查看相對詳細的本地分支信息 git branch -av // 查看包括遠程倉庫在內的分支信息 |
註意:在
git branch
的輸出內容中,有一個分支,前面帶有*
號,這標識我們當前所在的分支。
創建分支
當我們要修復一個 Bug,或者開發一個新特性,甚至是在初學的時候怕打亂原來的代碼,都可以新建一個分支來避免對原來代碼的影響。
1 | git branch dev // 新建一個名稱為 dev 的分支 |
切換分支
當我們創建完分支以後,我們需要切換到新建的分支,否則,所有的修改,還是在原來的分支上。事實上,所有的改動,只能影響到當前所在的分支。
1 | git checkout dev // 新建完 dev 分支以後,通過該命令切換到 dev 分支 |
創建並切換分支
1 | git checkout -b dev // 新建 dev 分支,並切換到該分支上 |
這個命令合並了前兩個獨立的命令,平常使用中一般這樣使用。
合並分支
當我們修復完成一個 Bug,或者開發完成一個新特性,我們就會把相關的 Bug 或者 特性的上修改合並回原來的主分支上,這時候就需要 git merge
來做分支的合並。
首先需要切換回最終要合並到的分支,如 master
:
1 2 | git checkout master // 切換回 master 分支 git merge dev // 將 dev 分鐘中的修改合並回 master 分支 |
合並回主分支的時候,後面可能會面臨到沖突的問題。沖突的解決暫不在這裏說明。
刪除分支
當之前創建的分支,完成了它的使命,如 Bug 修復完,分支合並以後,這個分支就不在需要了,就可以刪除它。
1 | git branch -d dev // 刪除 dev 分支 |
遠程倉庫
上面的所有命令都是針對本地倉庫的操作。當我們希望多個人來協作時,會將代碼發布到一個統一的遠程倉庫,然後多個人在本地操作以後,在推送到遠程倉庫。其他人協作時,需要先同步遠程倉庫的內容,再推送自己的修改。
從遠程倉庫克隆
如果你本地沒有倉庫,希望從已有的遠程倉庫上復制一份代碼,那麽你需要 git clone
。
1 2 | git clone https://github.com/git/git.git // 通過 https 協議,克隆 Github 上 git 倉庫的源碼 git clone [email protected]/git/git.git // 通過 ssh 協議,克隆 Github 上 git 倉庫的源碼 |
註意:
git clone
後面的倉庫地址,可以支持多種協議,如 https, ssh 等。
添加遠程倉庫
如果你已經有了一個本地倉庫,如之前創建的 git-guide
,然後你打算將它發布到遠程,供其他人協作。那麽使用:
1 | git remote add origin your_remote_git_repo // 為本地倉庫添加遠程倉庫 |
推送本地的內容到遠程倉庫
當本地倉庫中,代碼完成提交,就需要將代碼等推送到遠程倉庫,這樣其他協作人員可以從遠程倉庫同步內容。
1 2 | 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
來獲取遠程倉庫的內容。
1 2 | git fetch origin master git pull origin master |
git fetch
和 git pull
之間的區別:
git fetch
是僅僅獲取遠程倉庫的更新內容,並不會自動做合並。git pull
在獲取遠程倉庫的內容後,會自動做合並,可以看成git fetch
之後git merge
。
註意:建議多使用
git fetch
。
查看遠程倉庫信息
1 | git remote [-v] // 顯示遠程倉庫信息 |
建立本地分支和遠程分支的關聯
在本地倉庫中的分支和遠程倉庫中的分支是對應的。一般情況下,遠程倉庫中的分支名稱和本地倉庫中的分支名稱是一致的。
有的時候,我們會需要指定本地分支與遠程分支的關聯。
1 | git branch --set-upstream ‘local_branch‘ origin/remote_branch |
修改本地倉庫對應的遠程倉庫地址
當遠程的倉庫地址發生變化時,需要修改本地倉庫對應的遠程倉庫的地址。主要應用在工程遷移過程中。
1 | git remote set-url origin url |
標簽管理
在項目開發過程中,當一個版本發布完成時,是需要對代碼打上標簽,便於後續檢索。獲取處於其他的原因,需要對某個提交打上特定的標簽。
創建標簽
1 | git tag -a ‘tagname‘ -m ‘comment‘ ‘commit_id‘ |
-a
參數指定標簽名, -m
添加備註信息, ‘commit_id’ 指定打標簽的提交。
查看所有標簽
1 | git tag // 查看本地倉庫中的所有標簽 |
查看具體標簽信息
1 | git show tagname |
刪除本地標簽
如果打的標簽出錯,或者不在需要某個標簽,則可以刪除它。
1 | git tag -d tagname |
刪除遠程標簽
1 | git push origin :refs/tags/tagname |
推送標簽到遠程倉庫
打完標簽以後,有需要推送到遠程倉庫。
1. 推送單個標簽到遠程倉庫
1 | git push origin tagname |
2. 一次性推送所有標簽到遠程倉庫。
1 | git push origin --tags |
進階操作
臨時保存修改
在執行很多的 Git 操作的時候,是需要保持當前操作的倉庫/分支處於 clean 狀態,及沒有未提交的修改。如 git pull
, git merge
等等,如果有未提交的修改,這些將無法操作。
但是做這些事情的時候,你可能修改了比較多的代碼,卻又不想丟棄它。那麽,你需要把這些修改臨時保存起來,這就需要用到 git stash
。
1. 臨時保存修改,這樣倉庫就可以回到 clean 狀態。
1 | git stash // 保存本地倉庫中的臨時修改。 |
註意:可以多次的
git stash
來保存不同的臨時修改。
2. 查看臨時保存。當你臨時保存以後,後面還是要取回來的,那它們在哪裏呢?
1 | git stash list // 顯示所有臨時修改 |
3. 當我們處理完其他操作時,想要恢復臨時保存的修改。
1 2 | git stash apply // 恢復所有保存的臨時修改 git stash pop // 恢復最近一次保存的臨時修改 |
4. 或者,我們後面覺得臨時保存不想要了,那可以丟棄它。
1 | git stash clear // 丟棄所有保存的臨時修改 |
這些是我目前在項目中經常會用到的操作,這裏整理下來,可以作為一個手冊。對於 Git 的理解或者更多的解釋,並不在這裏體現。大家可以參考其他更多的資料。
常用 Git 命令使用教程