Git 工具使用分享
我们工作中或多或少都会使用 Git 作为 Code 分布式版本控制系统,以下是本人总结的 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)
工作区/工作目录(Workspace/Working Directory): 就是你平时存放项目代码的目录。
暂存区(Stage/Index):用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息, 一般存放在 ".git目录下" 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
仓库区/版本库(Repository/Git Directory):就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本。
远程仓库(Remote Directory):gitee.com。
一般文件 Git 操作流程:
通过 vim REDEME.md 更改 工作区 文件内容。
通过 git add 命令将 工作区 文件添加到 暂存区(Index/Stage) 。
通过 git commmit 命令提交到 仓库区。
通过 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 全局忽略规则配置文件,应用于所有 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 忽略规则配置文件: .gitignore,在单个 Git 项目下创建仅适用于此项目。
#忽略项目中所有log文件夹(/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文件被哪个忽略规则所匹配:git check-ignore -v /tags/UI-Images.zip#忽略规则强制添加至Git版本库:git add -f /tags/UI-Images.zip
.gitkeep 文件的作用
Git 默认是不允许提交一个空目录到版本库的,可以在空的文件夹里面建立一个 .gitkeep 文件,然后提交去即可。其实在 Git 中 .gitkeep 就是一个占位符。
示例: 需要 Git 提交 Yaf - views 空目录。
基于远程项目克隆至本地
首先,gitee 创建远端「 remote 」仓库: git-demo,然后克隆至本地目录:
cd~gitclonehttps://gitee.com/codezm/git-demo.git git-democdgit-demo
基于本地项目创建 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#创建分支git branch #示例-于master分支基础上创建dev分支: git branch dev#创建并检出至一个新分支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>
注意: 本地分支删除时需要先切换至其他分支再操作要删除的分支。
#编辑工作区项目代码.echo"test git"> README.md#提交至暂存区.git add README.md#遍历询问是否添加-仅限已添加至Git项目文件,新增文件排除。# git add -p#添加工作目录所有新增/改动文件# git add .#提交至本地仓库区.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
工作区文件. 「 git 文件差异对比 」
git diff#对比某一文件差异# git diff <file-name>
暂存区文件: 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 是将远程主机的最新内容(所有远程仓库的 branch、tag)拉到本地,用户在检查了以后决定是否合并到工作本机分支中。
git pull 则是将远程主机的最新内容拉下来后直接合并,即: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#若存在冲突则解决完冲突后还需要执行以下操作:# git add .# git commit -m ''git push origin dev
#非Git项目管理文件撤销「删除」,即:不在git版本控制下的新增文件rm -f README.md#新增文件撤销git rm --cached NEW_README.md#工作区文件撤销「还原」git checkout -- README.md#暂存区文件撤销「取消git add操作」git reset HEAD README.md#本地仓库文件撤销「取消git commit操作」gitlog##重置HEAD和索引####此时若是又修改了README.md文件再执行git reset后文件README.md内容会展示什么?git reset 等价于git reset --mixed ##重置HEAD、索引和工作区,会重置以下工作区域文件: -执行此操作是危险的。## 1.对README.md所有操作丢弃.## 2.若工作区对README.en.md做了修改但未git commit,即使git add到了暂存区也会被丢弃。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#撤销合并「注意:仅在合并失败(快速合并失败被阻止)时执行」,以下命令对工作区代码无影响:# git reset --merge# git merge --abort
打标签、项目版本管理.
#创建Taggit tag #示例-创建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。