git 作為一個當下最流行的版本控制工具,不會git都不好意思(吹)聊(牛)天,但是作為一個剛接觸不久的小編,在使用過程中,還是遇到一些頭疼的地方,所以開個帖,記錄下在學習和使用git的過程中的筆記和一些小技巧。(大佬勿噴~)
常用命令
我們日常使用最多的命令應該就是這些了,也基本上滿足大部分工作流
-
git init
建立版本庫,會在當前根目錄生成.git
資料夾,當前專案的git相關配置都在這個資料夾下 -
git clone
你是我?對,你就是我 -
git add [<options>]
將有變更的檔案新增到暫存區,可以指定檔案或者全部新增git add .
-
git status
顧名思義啦,檢視當前專案狀態,是不是有修改,暫存區是不是有待提交檔案等 -
git commit -m "message"
將暫存區的檔案提交到當前分支中,message
不可以為空,一個好的message可是非常重要的,畢竟哪個開發狗手裡沒個板磚 -
git remote add <name> <url>
當我們本地的程式碼需要上傳到伺服器時,就需要新增個遠端服務的地址,name
指定一個名稱,該名稱在後續的操作非常有用的,url 遠端倉庫的地址 -
git push <remote-name> <branch>
這個命令可以理解為,將本地的修改推送到遠端倉庫裡,remote-name
就是我們在git remote add
設定的名字,branch
指定推送上去的分支 -
git pull <remote-name> <branch>
功能與上一個相反,將遠端的程式碼更新到本地,<remote-name> <branch>
就不多解釋了哈 -
git checkout -b <branch> [<remote-name>/<branch>]
建立分支,有兩種情景,一 在當前分支的基礎上建立的新分支,那麼使用這個git checkout -b <branch>
或者git branch <branch>
,在hot fix 的時候就非常適用;二 想從遠端拉取個新的功能分支,那麼來發這個git checkout -b <branch> <remote-name>/<branch>
指定遠端和具體分支,適合多分支同時開發的場景 -
git checkout <branch>
切換分支 -
git branch [--list]
檢視分支列表 -
git branch -d <branch>
刪除分支,say goodbye -
git fetch <remote-name>
將本地庫所關聯的遠端庫的commit id更新至最新,如果大家使用 git pull 來更新程式碼,那基本上不會使用該命令,不過在當我們不想更新遠端倉庫,卻又想檢視遠端倉庫的最新提交歷史的時候,這就派上用場啦
更新本地倉庫
通常有兩種方式
-
git pull <remote-name> <branch>
從遠端獲取最新版本並merge到本地,相當於是git fetch
和git merge
一併執行了 - 先使用
git fetch <remote-name>
更新狀態;git rebase <remote-name>/<branch>
或者git merge <remote-name>/<branch>
更新程式碼,個人推薦rebase
解決衝突
對小白來說,最可怕的莫過於,程式碼擼完了,一提交,臥槽!有衝突!
好吧,衝突其實並(非)不(常)可怕。
衝突建議在本地進行解決,不建議在網頁上操作,因為會預設雙向合併,親自測出來的
- 使用
git pull
方式更新的程式碼,那麼分別將衝突的檔案逐一修改,完成後,git add <conflict file>
git commit -m "merge conflict"
這種方式會產生一次額外的 commit - 使用先
fetch
後rebase
的方式更新程式碼,根據提示,解決後,git add <conflict file>
,注意此時不需要git commit
! 只需要git rebase --continue
即可,這中方式不會生成新的 commit記錄,使得我們的提交記錄乾淨一些,且合併到一半,心情不好,我們還可以git rebase --abort
取消本次合併,下(吃)班(飯)再說
撤銷修改
誰沒寫過bug的時候,但被眼光犀利的我們發現了,我們用如下操作將其roll-back。有以下三種場景
修改還沒有加入暫存區
還沒有執行 git add
git checkout -- <file>
該檔案的修改,將被啪嘰打回最初狀態,不過若是某一處地方需要還原,這個操作就不適合了,手動修改即可
修改還在暫存區
已經git add
, 但未 git commit
提交
git reset HEAD <file>...
將檔案從暫存區撤銷掉
修改已經提交到分支上
頭腦混亂的小編,已經把bug commit 上去了(寫bug我們從來不含糊),如果是這個bug涉及的程式碼量非常多,需要完全重新寫過那種,那可以通過回滾的方式git reset --hard HEAD~
回退到上一個版本 ,或者回滾到指定的版本號
檔名大小寫
某個已經提交的檔案,想要修改檔名稱的大小寫,啪嘰,改完,發現git沒檢查出有變更,心理mmp,莫慌,git 預設對於檔名大小寫是不敏感的,所以git認為當前程式碼無任何改動,那麼如何才能讓 git 識別檔名大小寫變化呢
有兩種方式
- 修改配置檔案
git config core.ignorecase false
設定為大小寫敏感,但據說設定後會有奇奇怪怪的小問題,我還沒試過,大家可以嘗試看看哈~ -
git mv <old-file> <new-file>
取巧的方式,但肥腸好用
.gitignore
顧名思義,指定檔案或目錄,git將其視為空氣。
有個情景,若某個已經版本管理中的檔案,想不要納入版本管理中,可如下操作
-
.gitignore
中新增規則 -
git rm [-f] <filename>
將檔案從版本控制中刪除,同時本地檔案也會被物理刪除git rm --cached <filename>
僅從版本庫中刪除,本地檔案仍然保留 git commit -m "remove file from git"
提交空資料夾
git會無視我們的空資料夾,但當我們又不得不提交的時候,我們可以建立個對專案無影響的檔案,如 .gitkeep
名字大家隨意即可
設定別名
如果你使用的是視覺化工具,那當我沒說~
早上 git xxx,下午git xxx ,時間久了,大夥一定發現,常用的那些命令每天都要敲個幾百遍,肌肉都有記憶了,敲快一點,還不小心敲錯了。放心,我們可以設定別名,讓大家少敲幾個單詞啦
git config --global alias.<alias-name> <name>
告訴git,以後 alias-name
就是 name
了
以下是我設定的別名列表
git config --global alias.co checkout
git config --global alias.cm commit
git config --global alias.br branch
git config --global alias.fu `fetch upstream`
git config --global alias.po `push origin`
git config --global alias.lg "log --color --graph --pretty=format:`%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset` --abbrev-commit"
大家根據自己的習慣折騰就好啦,--global
指的是全域性設定,若想檢視配置資訊, cd ~ ; cat .gitconfig
即可檢視
視覺化工具
這方面的工具,市面上一大把了,比如
[Git GUI] gitk
即可開啟,一個非常淳樸的GUI
小編用過sourcetree,感覺還不錯,非常直觀,個人不推薦小白入門使用圖形化工具,萬一不小心點錯了,真不知道該如何處理~ (來自一個制帳加手殘的小編的溫馨提醒)
———————–我是分割線————————–
子模組
git -help
git <command> <-help | -h >
可以檢視命令的引數和簡要介紹git <command> --help
通過瀏覽器開啟該命令的詳細介紹