之前一直借助于 Source-tree 這種圖形化 Git 工具甚牲,一次在幫同事解決 Git 分支合并問(wèn)題時(shí),用的同事電腦,沒(méi)有 Source-tree 牧抽,感覺(jué)完全不會(huì)用了,什么命令也沒(méi)記住遥赚。惡補(bǔ)一下命令扬舒,重新學(xué)一遍 Git 教程,發(fā)現(xiàn)好多常用的操作凫佛,用命令還是非常方便的讲坎。
這里整理匯總下:
一、Git alias
在開(kāi)始常用命令前愧薛,先推薦下使用 alias 定義 git 常用命令的別名晨炕,合理使用簡(jiǎn)寫(xiě)可以大幅提高效率。
常用 git 命令厚满,可以在 ~/.gitconfig
文件中使用 alias 定義簡(jiǎn)寫(xiě)府瞄,以下是我個(gè)人常用 alias:
[alias]
st = status -s
ci = commit
l = log --oneline --decorate -12 --color
ll = log --oneline --decorate --color
lc = log --graph --color
co = checkout
br = branch
ba = branch -a
rb = rebase
dci = dcommit
lg = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
另,
~/.gitconfig
文件中,可以查看當(dāng)前 user 的 git 配置信息
二遵馆、branch 分支操作
查看分支信息
# 列出所有本地分支
// git br
$ git branch
# 列出所有本地分支和遠(yuǎn)程分支
// git ba
$ git branch -a
新建分支
# 從當(dāng)前分支新建一個(gè)分支鲸郊。但依然停留在當(dāng)前分支
// git br [本地xxx]
$ git branch [branch-name]
// 常用于:對(duì)當(dāng)前 分支做個(gè)備份
# 從指定的遠(yuǎn)程分支,拉一個(gè)本地分支货邓。并切換到該分支
// 常用于: 從遠(yuǎn)端 develop 拉一個(gè) 本地 feature/xxx 分支
$ git checkout -b newBrach origin/master
# 新建一個(gè)分支秆撮,指向指定commit。但依然停留在當(dāng)前分支
$ git branch [branch] [commit]
# 新建一個(gè)分支换况。并切換到該分支
// git co -b [local or remote/branch-name]
$ git checkout -b [branch-name]
# 新建一個(gè)分支职辨,指向某個(gè)tag
$ git checkout -b [branch] [tag]
切換分支
# 切換到指定分支,并更新工作區(qū)
// git co [branch-name]
$ git checkout [branch-name]
# 切換到上一個(gè)分支
$ git checkout -
刪除分支
# 刪除本地分支
// git br -d [branch-name]]
$ git branch -d [branch-name]
$ git branch -D //強(qiáng)制刪除
# 刪除遠(yuǎn)程分支
// git br -dr [remote/branch]
// eg: git br -dr origin/xxx_name
$ git branch -dr [remote/branch]
合并分支
# 合并指定分支到當(dāng)前分支
$ git merge [branch]
# 選擇一個(gè)commit戈二,合并進(jìn)當(dāng)前分支
$ git cherry-pick [commit]
三舒裤、tag 分支操作
在 Git 中 tag 可以看做是指向某個(gè) commit 的特殊分支
列顯已有 tag
$ git tag
添加 tag
$ git tag v1.4.0
// 添加一個(gè)帶 commit log 的 tag
$ git tag -a v1.4 -m 'my version 1.4'
// 為某個(gè)指定的 commit 打上 tag
$ git tag -a v1.2 9fceb02
// 查看 tag 信息
$ git show v1.4
推送 tag
// git push 不會(huì)將本地的 tag push 到 origin
# push 指定 tag name
$ git push origin v1.0
# push 全部 tag
$ git push origin --tags
刪除 tag
// 刪除本地 tag
$ git tag -d v0.9
// 刪除遠(yuǎn)端 tag
$ git push origin :refs/tags/0.1.0
## 明確的表示刪除
$ git push --delete origin v1.1
四、git pull
git pull命令的作用是觉吭,取回遠(yuǎn)程主機(jī)某個(gè)分支的更新腾供,再與本地的指定分支合并。
Merge 型 的 pull
如果本地分支鲜滩,在 checkout 后伴鳖,有 commit, git pull 就會(huì)增加一個(gè) Merge log
如果本地分支沒(méi)有 新 commit徙硅,等于直接 fetch榜聂、pull
// 將遠(yuǎn)端的 A 分支的代碼,拉到本地 B 分支 (會(huì)產(chǎn)生一個(gè) Merge log)
$ git pull origin [remote_name]:[local_name]
// 如果是往當(dāng)前 本地分支 pull嗓蘑,則冒號(hào)后面的部分可以省略
$ git pull origin [remote_name]
// 實(shí)質(zhì)上须肆,這等同于先做git fetch,再做git merge桩皿。
$ git fetch origin
$ git merge origin/next
# Git會(huì)自動(dòng)在本地分支與遠(yuǎn)程分支之間休吠,建立一種追蹤關(guān)系(tracking)。 就是說(shuō)业簿,本地的master分支自動(dòng)"追蹤"origin/master分支。
// 如果當(dāng)前分支與遠(yuǎn)程分支存在追蹤關(guān)系阳懂,git pull就可以省略遠(yuǎn)程分支名梅尤。
$ git pull origin
// 如果當(dāng)前分支只有一個(gè)追蹤分支,連遠(yuǎn)程主機(jī)名都可以省略岩调。
$ git pull
// 上面命令表示巷燥,當(dāng)前分支自動(dòng)與唯一一個(gè)追蹤分支進(jìn)行合并
rebase 型 pull
// 如果合并需要采用rebase模式,可以使用--rebase選項(xiàng)号枕。
$ git pull --rebase <遠(yuǎn)程主機(jī)名> <遠(yuǎn)程分支名>:<本地分支名>
// git pull --rebase origin [origin_name]:[local_name]
// 如果是 rebase 到當(dāng)前分支缰揪,可省略 : 后
$ git pull --rebase origin [origin_name]
// 如果 rebase 的遠(yuǎn)端分支,是當(dāng)前分支 track 的,[origin_name] 可省略
$ git pull --rebase origin
五钝腺、Git push
// 將當(dāng)前 loca_name 分支 push 到遠(yuǎn)端抛姑,命名為 new_name
$ git push <遠(yuǎn)程主機(jī)名> <本地分支名>:<遠(yuǎn)程分支名>
// git push origin loca_name:new_name
# 如果當(dāng)前分支與遠(yuǎn)程分支之間存在追蹤關(guān)系,則本地分支和遠(yuǎn)程分支都可以省略艳狐。
# 如果當(dāng)前分支只有一個(gè)追蹤分支定硝,那么主機(jī)名都可以省略。
// 會(huì)將本地所有分支都 對(duì)應(yīng) push (慎用)
$ git push
// push 可以用來(lái)刪除
$ git push origin --delete master
# 如果遠(yuǎn)程主機(jī)的版本比本地版本更新毫目,推送時(shí)Git會(huì)報(bào)錯(cuò)蔬啡,要求先在本地做git pull合并差異,然后再推送到遠(yuǎn)程主機(jī)镀虐。這時(shí)箱蟆,如果你一定要推送,可以使用--force選項(xiàng)刮便。
$ git push --force origin
# 最后空猜,git push不會(huì)推送標(biāo)簽(tag),除非使用--tags選項(xiàng)诺核。
$ git push origin --tags
六抄肖、代碼回滾
快速合并緩存區(qū)到上一個(gè) commit
// 將 add 到緩存區(qū)的內(nèi)容,和上一個(gè) commit 一起窖杀, rebase 成了一個(gè)新的 commit
$ git commit --amend
// 便于將漏修改的漓摩,或是修改錯(cuò)誤的內(nèi)容,合并到上一個(gè) commit 中入客。而不用提交兩個(gè) commit管毙,然后 rebase 成一個(gè)
// 注:如果修改過(guò)了, 只能 push -f 到遠(yuǎn)端
checkout 到指定 commit
這對(duì)于快速查看項(xiàng)目舊版本來(lái)說(shuō)非常有用
$ git checkout [commit id]
// check 到往前指定此的 commit
$ git checkout HEAD~2
git Revert
Revert撤銷(xiāo)一個(gè)提交的同時(shí)會(huì)創(chuàng)建一個(gè)新的提交桌硫。
# 新建一個(gè)commit夭咬,用來(lái)撤銷(xiāo)指定commit
# 后者的所有變化都將被前者抵消,并且應(yīng)用到當(dāng)前分支
$ git revert [commit]
git reset
- 將已經(jīng)加到緩存區(qū)的內(nèi)容(僅打了本地 commit)铆隘,移除到工作區(qū)
$ git reset HEAD
$ git reset HEAD~2
- 從緩存區(qū)重置卓舵,不刪除修改的地方
// 將緩存區(qū)中的指定文件,移到工作區(qū)
// 緩存區(qū)中的膀钠,指的是 add 后的
git reset <file>
// 將緩存區(qū)中的全部文件掏湾,移到工作區(qū)
$ git reset
// 將本地 commit 歷史中的 commit 移除到 工作區(qū) (未 add 狀態(tài))
$ git reset [commit_id]
刪除式 reset
// 緩存區(qū)和工作區(qū)的,都會(huì)被完全移除(刪除)
$ git reset --hard
// 將本地 commit 歷史中的直接刪除
$ git reset --hard <commit>
# 重置當(dāng)前HEAD為指定commit肿嘲,但保持暫存區(qū)和工作區(qū)不變
$ git reset --keep [commit]
參考:
常用 Git 命令清單 - 阮一峰
Git遠(yuǎn)程操作詳解 - 阮一峰
Git 配置別名 - 廖雪峰
果殼中的 Git
特別推薦:
jaywcjlove —— Git常用命令清單