上一篇介紹了git的環境安裝配置,本篇對git在工作中常用的用法進行總結,已滿足大部分的日常工作需求,對於其他的一些git命令用法在今後使用到時我也會更新上來,文中如有錯誤,歡迎大家指出來,謝謝~
一、git本地基礎用法
1、建立程式碼倉庫 git init
2、加入所有目錄到倉庫 git add .
3、提交 git commit -m "first commit" 簡寫 git ci
4、檢視git提交狀態 git status 簡寫 git st
5、藉助diff檢視具體修改的地方 git diff 修改的檔案路徑 -號表示刪除的部分 +表示新增的部分
6、撤銷未提交的檔案 git checkout 檔案路徑 簡寫 git co
如果檔案已經add,checkout無法撤銷,先取消新增
git reset HEAD 檔案路徑,然後再checkout就ok
7、檢視記錄 git log
記錄太多,如果想只檢視一條,通過id來檢視
git log 記錄id -1 -p (-1表示只檢視一條,-p表示檢視具體修改了什麼內容)
8、分支操作
更新分支
git fetch -p
檢視分支
git branch -a 檢視全部分支
git branch 檢視本地分支
新建分支
git branch new_branch。新建本地分支
git checkout new_branch. 切換分支
git push origin new_branch。推送到遠端倉庫
刪除分支
git push origin --delete branch。 刪除遠端分支
git branch -d branch。 刪除本地分支
git branch -D branch。 強行刪除本地分支(如果分支程式碼有修改,會提示需要合併分支)
合併分支
例如將遠端master分支合併到當前mis_pro_content分支
git fetch --all
git merge origin/master
git push origin mis_pro_content
9、新增忽略檔案
有些檔案或目錄是不需要提交到git中我們可以將其新增到.gitgnore檔案中,這樣在提交的時候不會提交,比如node_modules依賴檔案
根目錄下新建.gitgnore檔案,將node_modules/新增到檔案中
二、遠端git用法(團隊合作)
1、遠端下載程式碼到本地 git clone https://github.com/example/test.git
2、修改提交程式碼後需同步到遠端版本庫上 git push origin master (origin指定遠端git版本庫的地址)
master部分指定的是同步到哪個分支上
3、同步遠端修改的內容到本地 ,2種方式可以操作(fetch和pull)
--fetch方式同步
將遠端的同步到本地 git fetch origin/master(同步下來的內容會放在分分支origin/master上)
檢視遠端版本庫修改哪些了內容 git diff origin/master
合併分分支origin/master到主分支上 git merge origin/master
--pull方式(將遠端程式碼同步並且合併到本地,相當於將fetch和merge一起執行)
git pull origin master
三、git版本撤銷回滾
使用場景
- 糟了,我剛把不想要的程式碼,commit到本地倉庫中了,但是還沒有做push操作!
- 徹底完了,剛線上更新的程式碼出現問題了,需要還原這次提交的程式碼!
- 剛才我發現之前的某次提交太愚蠢了,現在想要幹掉它!
撤銷
針對場景1,在未進行git push前的所有操作,都是在“本地倉庫”中執行的。我們暫且將“本地倉庫”的程式碼還原操作叫做“撤銷”!
- 情況一,檔案被修改了,但未執行git add操作
git checkout fileName
git checkout .
- 情況二,檔案執行了git add操作,但想撤銷對其的修改
git reset HEAD fileName 取消暫存
git checkout fileName 撤銷修改
- 情況三 ,已在本地進行了多次git commit操作,現在想撤銷到其中某次Commit
git reset [--hard|soft|mixed|merge|keep] [commit|HEAD]
例如:
git reset --hard HEAD^。 回退到上一次版本
git reset --hard 3628164。 回退到指定的某個版本
情況四,將test分支合併到了當前分支,但是想撤銷上一次的合併
git merge --abort
回滾
針對場景2,已進行git push,即已推送到“遠端倉庫”中。我們將已被提交到“遠端倉庫”的程式碼還原操作叫做“回滾”
- 情況一,刪除最後一次遠端提交
方式1:使用revert
git revert HEAD
git push origin master
方式2:使用reset
git reset --hard HEAD^
git push origin master -f
二者區別:
revert是放棄指定提交的修改,但是會生成一次新的提交,需要填寫提交註釋,以前的歷史記錄都在;
reset是指將HEAD指標指到指定提交,歷史記錄中不會出現放棄的提交記錄。
- 情況二,回滾某次提交
# 找到要回滾的commitID
git log
git revert commitID
四、 本地修改暫存
git stash 本地修改暫存
git stash pop 還原本地修改
git stash list 檢視暫存資訊
git stash 可用來暫存當前正在進行的工作, 比如想pull 最新程式碼, 又不想加新commit, 或者另外一種情況,為了fix 一個緊急的bug, 先stash, 使返回到自己上一個commit, 改完bug之後再stash pop, 繼續原來的工作
git stash pop 重新應用快取的stash
當你多次使用’git stash’命令後,你的棧裡將充滿了未提交的程式碼,這時候你會對將哪個版本應用回來有些困惑,
’git stash list’ 命令可以將當前的Git棧資訊列印出來,你只需要將找到對應的版本號,例如使用’git stash apply stash@{1}’就可以將你指定版本號為stash@{1}的工作取出來,當你將所有的棧都應用回來的時候,可以使用’git stash clear’來將棧清空。
五、上傳本地專案到遠端倉庫
- 情況一,不是一個git倉庫
git init
git add README.md
git commit -m "first commit"
git remote add origin git@github.com:fozero/vue-nuxt-ssr.git 關聯遠端倉庫,需先在遠端倉庫建立一個同名倉庫
git push -u origin master
- 情況二,已經是一個本地git倉庫
git remote add origin git@github.com:fozero/vue-nuxt-ssr.git 關聯遠端倉庫
git push -u origin master
注:
若新建遠端倉庫的時候自動建立了README檔案,則在此之前先pull下來,git pull --rebase origin master,避免在push時報錯
六、問題解決
1、分支合併時報錯
https://stackoverflow.com/questions/2314437/resolve-conflict-delete-modify-in-git
git merge origin/feature-wuj-uinfo
CONFLICT (modify/delete): application/views/preorderg3/newshare.html deleted in HEAD and modified in origin/feature-wuj-uinfo. Version origin/feature-wuj-uinfo of application/views/preorderg3/newshare.html left in tree.
CONFLICT (modify/delete): application/views/preorderg3/newpic.html deleted in HEAD and modified in origin/feature-wuj-uinfo. Version origin/feature-wuj-uinfo of application/views/preorderg3/newpic.html left in tree.
Auto-merging application/controllers/api/Reserve.php
Automatic merge failed; fix conflicts and then commit the result.
以上錯誤大致是說那個檔案已經被刪除了,我這邊還存在,通過rm將衝突檔案刪除解決該問題
git rm application/views/preorderg3/newshare.html
git rm application/views/preorderg3/newpic.html
七、最後
有時候可以看到別人提交的時候會顯示emoj表情 ,其實我們在提交的時候也可以使用,對於不同的提交型別 ,使用不同的emoj表情,這樣看起來更加的一目瞭然
在commit時,通過在emoj前面加‘:’,如:
git ci -m ':bug: fix click of get with no feedback'
更多的emoj表情可以檢視
- https://github.com/carloscuesta/gitmoji/
- https://gitmoji.carloscuesta.me/
- https://zhuanlan.zhihu.com/p/29764863
更多的git命令用法可以檢視
- https://git-scm.com/docs