Git 工具使用分享
我们工作中或多或少都会使用 Git 作为 Code 分布式版本控制系统,以下是本人总结的 Git 常用命令。
目录
基本概念
安装
Windows
Mac
可视化工具 (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 命令推送到 远程仓库。
安装
Windows
Mac: brew install git
Git 可视化工具 - 适用于 Mac & Windows 平台
sourcetree 相比 fork 卡、中文菜单、Bug?
fork
配置
Git 全局配置, 默认 Git 配置信息存储在用户目录即: ~/.gitconfig 文件中。
git config --global user.name"codezm"git config --global user.email"[email protected]"#配置-保存账号及密码至本地~/.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 = [email protected][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
注意: 本地分支删除时需要先切换至其他分支再操作要删除的分支。
提交
#编辑工作区项目代码.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
暂存区文件: git add. 「 git 文件差异对比 」
git diff --cached#对比某一文件差异git diff --cached
版本库文件: git commit. 「 git 文件差异对比 」
#查看此所有文件更改详情.git show #示例-仅查看指定文件: git show a09ce4377cd292 README.md#对比两次的文件更改详情.# git diff
giteem - 对比视图 | 示例
修改了哪些文件?「 git commit 后查看 」
gitlog--stat# git show
拉取
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
Tag
打标签、项目版本管理.
#创建Taggit tag #示例-创建1.0.0版本Tag: git tag v1.0.0#显示所有Taggit tag#加上-l命令可以使用通配符来过滤tag# git tag -l "1.0.*"#给加Tag并添加备注信息.# git tag -a
Stash - 贮藏
适用场景: 临时合并他人分支存在 - 同时更改相同文件、分支可能存在冲突。
git stash#保存stash并设置名称,simple方式: git stash# git stash save
注意: git stash pop 如果存在冲突文件将导致 drop 失败。
结语
每次 git push 前先拉取下 git pull origin master / git pull origin dev 代码。
仅merge部分文件:git rebase -i。
仅stash部分文件: git stash -p。