上一篇介紹了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命令用法可以查看