Git 工具使用分享
我們工作中或多或少都會使用?Git?作為?Code?分布式版本控制系統(tǒng)墙杯,以下是本人總結(jié)的 Git 常用命令寻馏。
可視化工具?(sourcetree、fork)
配置?(git config / .gitconfig)
忽略文件?(.gitignore / .gitkeep)
倉庫?(git clone / git init / git remote)
分支?(git branch / git checkout)
提交?(git add / git commit / git push)
查看?(git status / git log / git diff / git show)
拉取?(git pull / git fetch)
合并?(git merge)
撤銷/回滾?(git reset)
解決沖突?(git reset)
Tag?(git tag)
Stash?(git stash)
工作區(qū)/工作目錄(Workspace/Working Directory): 就是你平時存放項目代碼的目錄筒扒。
暫存區(qū)(Stage/Index):用于臨時存放你的改動激况,事實上它只是一個文件癣防,保存即將提交到文件列表信息, 一般存放在 ".git目錄下" 下的index文件(.git/index)中忌傻,所以我們把暫存區(qū)有時也叫作索引(index)屁置。
倉庫區(qū)/版本庫(Repository/Git Directory):就是安全存放數(shù)據(jù)的位置,這里面有你提交到所有版本的數(shù)據(jù)朗若。其中HEAD指向最新放入倉庫的版本仿吞。
遠程倉庫(Remote Directory):gitee.com。
一般文件 Git 操作流程:
通過?vim REDEME.md?更改?工作區(qū)?文件內(nèi)容捡偏。
通過?git add?命令將?工作區(qū)?文件添加到?暫存區(qū)(Index/Stage)?。
通過?git commmit?命令提交到?倉庫區(qū)峡迷。
通過?git push?命令推送到?遠程倉庫银伟。
Mac:?brew install git
Git 可視化工具 - 適用于 Mac & Windows 平臺
sourcetree?相比 fork 卡、中文菜單绘搞、Bug?
Git 全局配置, 默認?Git?配置信息存儲在用戶目錄即:?~/.gitconfig?文件中彤避。
git config --global user.name"codezm"git config --global user.email"codezm@163.com"#配置-保存賬號及密碼至本地~/.git-credentials,僅第一次手動錄入賬號及密碼git config --global credential.helper store#配置-全局忽略文件,默認文件不存在自行新建文件即可git config --global core.excludesfile ~/.gitignore# git使用外部工具合并沖突后避免生成多余的.orig備份文件git config --global mergetool.keepBackupfalse#查看Git配置信息夯辖。git config --list
vim ~/.gitconfig
[user]? ? name = codezm? ? email = codezm@163.com[credential]? ? helper =store[core]? ? excludesfile = ~/.gitignore? ? editor = vim[mergetool]? ? keepBackup =false[alias]? ? co = checkout? ? lg = log --graph --pretty=format:'%Cred%h%Creset-%C(yellow)%d%Creset%s%Cgreen(%cr)%C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
Git 全局忽略規(guī)則配置文件琉预,應用于所有 Git 項目,配置文件路徑可使用命令?git config core.excludesfile?查看 ––– 默認不存在需配置蒿褂。
$ vim `git config core.excludesfile`############################################ OS generated files ############################################.DS_Store.DS_Store?*.swp._*.Spotlight-V100.TrashesIcon?ehthumbs.dbThumbs.db################################################# packages #################################################*.7z*.dmg*.gz*.iso*.jar*.rar*.tar*.zip# Compiled source ####################*.com*.class*.dll*.exe*.o*.so*.pyc# Logs and databases #######################*.log*.sqlite
Git 忽略規(guī)則配置文件:?.gitignore圆米,在單個 Git 項目下創(chuàng)建僅適用于此項目。
#忽略項目中所有l(wèi)og文件夾(/runtime/log啄栓、/log):log#忽略項目根路徑下整個runtime文件夾:/runtime/*#但排除runtime根文件夾下某個文件:!/runtime/wechat-post-data.log#注意:若想排除以下文件是無效的娄帖。# !/runtime/pid/swoole/master.pid#解決方案,這也是`忽略某個文件夾昙楚,但又不想忽略這個文件夾下的某個子目錄`的解決方案近速。!/runtime/pid/runtime/pid/*!/runtime/pid/swoole/runtime/pid/swoole/*!/runtime/pid/swoole/master.pid#檢查UI-Images.zip文件被哪個忽略規(guī)則所匹配:git check-ignore -v /tags/UI-Images.zip#忽略規(guī)則強制添加至Git版本庫:git add -f /tags/UI-Images.zip
.gitkeep?文件的作用
Git 默認是不允許提交一個空目錄到版本庫的,可以在空的文件夾里面建立一個?.gitkeep?文件,然后提交去即可削葱。其實在?Git?中?.gitkeep?就是一個占位符奖亚。
示例: 需要 Git 提交 Yaf -?views?空目錄。
基于遠程項目克隆至本地
首先析砸,gitee?創(chuàng)建遠端「 remote 」倉庫: git-demo昔字,然后克隆至本地目錄:
cd~gitclonehttps://gitee.com/codezm/git-demo.git git-democdgit-demo
基于本地項目創(chuàng)建 git 倉庫
cdgit initgit remote add origin https://gitee.com/codezm/git-demo.gitgit add .git commit -m'First commit.'git push origin master
修改本地項目 git 倉庫地址
cdgit remoteset-url origin
新 Git 項目默認 ( git clone ) 所在分支為:?master。
#查看本地所在分支干厚,帶*表示當前所在分支.git branch#查看遠程所有分支# git branch -r#查看所有分支,包含本地和遠程服務器git branch -a#創(chuàng)建分支git branch #示例-于master分支基礎上創(chuàng)建dev分支: git branch dev#創(chuàng)建并檢出至一個新分支git checkout -b #分支切換李滴,切換至dev分支git checkout #刪除本地分支git branch -d #分支重命名# git branch -m <old-branch-name> <new-branch-name>#刪除遠程服務器分支# git push origin --delete <branch-name># git push origin :<branch-name>
注意: 本地分支刪除時需要先切換至其他分支再操作要刪除的分支。
#編輯工作區(qū)項目代碼.echo"test git"> README.md#提交至暫存區(qū).git add README.md#遍歷詢問是否添加-僅限已添加至Git項目文件蛮瞄,新增文件排除所坯。# git add -p#添加工作目錄所有新增/改動文件# git add .#提交至本地倉庫區(qū).git commit -m'Modify README.md'#提交至遠端倉庫-只有提交后他人才可使用你提交的代碼.git push origin master# -u設置origin為默認主機,之后就可以直接使用git push推送至遠程服務器。#默認只推送當前分支: simple方式挂捅。Git 2.0版本之前芹助,默認采用matching方法,會推送所有有對應的遠程分支的本地分支git push -u origin master
查看哪些文件改動了闲先?「?git add?前查看 」
git status
工作區(qū)文件. 「 git 文件差異對比 」
git diff#對比某一文件差異# git diff <file-name>
暫存區(qū)文件:?git add. 「 git 文件差異對比 」
git diff --cached#對比某一文件差異git diff --cached
版本庫文件:?git commit. 「 git 文件差異對比 」
#查看此所有文件更改詳情.git show #示例-僅查看指定文件: git show a09ce4377cd292 README.md#對比兩次的文件更改詳情.# git diff <COMMIT-ID>...<COMMIT-ID> README.md#對比兩次涉及的所有文件名# git diff <COMMIT-ID>...<COMMIT-ID> --name-only
修改了哪些文件状土?「?git commit?后查看 」
gitlog--stat# git show <COMMIT-ID> --name-only#展示最后一次提交修改的文件# git log --stat -n 1#展示 # git log --oneline
git fetch 是將遠程主機的最新內(nèi)容(所有遠程倉庫的 branch、tag)拉到本地伺糠,用戶在檢查了以后決定是否合并到工作本機分支中蒙谓。
git pull 則是將遠程主機的最新內(nèi)容拉下來后直接合并,即:git pull = git fetch + git merge训桶。
git pull origin/master# git fetch# git merge origin/master
git checkout dev# git pull有個前提當前分支dev對應遠程分支origin/dev已存在累驮,此處也可使用: git fetchgit pullgit merge origin/kakaguo#若存在沖突則解決完沖突后還需要執(zhí)行以下操作:# git add .# git commit -m ''git push origin dev
#非Git項目管理文件撤銷「刪除」,即:不在git版本控制下的新增文件rm -f README.md#新增文件撤銷git rm --cached NEW_README.md#工作區(qū)文件撤銷「還原」git checkout -- README.md#暫存區(qū)文件撤銷「取消git add操作」git reset HEAD README.md#本地倉庫文件撤銷「取消git commit操作」gitlog##重置HEAD和索引####此時若是又修改了README.md文件再執(zhí)行g(shù)it reset后文件README.md內(nèi)容會展示什么?git reset 等價于git reset --mixed ##重置HEAD、索引和工作區(qū),會重置以下工作區(qū)域文件: -執(zhí)行此操作是危險的舵揭。## 1.對README.md所有操作丟棄.## 2.若工作區(qū)對README.en.md做了修改但未git commit,即使git add到了暫存區(qū)也會被丟棄谤专。git reset --hard #遠程倉庫撤銷:主要用于撤銷已push的commit操作,即git commit -> git push -> git reset -> git push -fgit push -f
分支 hanlu午绳、kakaguo 同時修改?README.md?文件.
git checkout hanluecho'hanlu'> README.mdgit add .git commit -m'Modify README.md by hanlu.'git push -u origin hanlugit checkout kakaguoecho'kakaguo'> README.mdgit add .git commit -m'Modify README.md by kakaguo.'git pushgit checkout devgit pullgit merge origin/hanlugit push origin devgit merge origin/kakaguo#解決沖突git add .git commit -m'Merge kakaguo'git push origin dev#撤銷合并「注意:僅在合并失敗(快速合并失敗被阻止)時執(zhí)行」,以下命令對工作區(qū)代碼無影響:# git reset --merge# git merge --abort
打標簽置侍、項目版本管理.
#創(chuàng)建Taggit tag #示例-創(chuàng)建1.0.0版本Tag: git tag v1.0.0#顯示所有Taggit tag#加上-l命令可以使用通配符來過濾tag# git tag -l "1.0.*"#給加Tag并添加備注信息.# git tag -a <tag-name> <commit-id> -m <comment-message>#顯示Tag詳情:顯示、Tag備注信息等# git show <tag-name>#推送至遠程倉庫# git push origin <tag-name>#推送本地所有Taggit push origin --tags#切換至某個Tag,與分支類似git checkout #刪除本地某個Tag# git tag -d <tag-name> <tag-name-mores>#刪除遠程倉庫Tag# git push origin --delete tag <tag-name># git push origin :refs/tags/<tag-name>
適用場景: 臨時合并他人分支存在 - 同時更改相同文件拦焚、分支可能存在沖突蜡坊。
git stash#保存stash并設置名稱,simple方式: git stash# git stash save <message>#僅還原# git stash apply#刪除指定stash# git stash drop stash@{0}#還原并刪除stash赎败,git stash apply + git stash dropgit stash pop#列出所有stash# git stash list
注意:?git stash pop?如果存在沖突文件將導致?drop?失敗算色。
每次?git push?前先拉取下?git pull origin master?/?git pull origin dev?代碼。
僅merge部分文件:git rebase -i螟够。
僅stash部分文件:?git stash -p灾梦。