Git小结

集中式版本控制

SVN所有东西都存在服务器,不连网不能同步和切换,需要定期备份。

分布式版本控制

Git,每个人保存的都是所有版本

git组成部分

工作区 –add-> 暂存区 –commit-> 本地仓库 –push-> 远程
工作区 <-checkout– 暂存区 <-reset– 本地仓库 <-fetch/clone– 远程
工作区 <-checkout HEAD– 本地仓库
工作区 <-pull– 远程

git配置

1
2
3
4
5
6
7
8
9
10
11
12
13
git config 

--local --global --system 配置影响的范围,本仓库、本用户、本系统

不加后面具体值表示查看
--list 查看config信息
user.name "" 用户名
user.email "" 用户邮箱
core.autocrlf true\input\false 提交为lf取出改为crlf、提交改为lf、什么也不改
core.safecrlf true\false\warn 拒绝包含混合的文件、允许、给予警告
credential.helper store --file .m_credentials 保存密码存证,Push到https连接时,可不输入密码,--file后面是目录地址
alias 别名 alias.ci 'commit' 以后可以用ci表示commit 后面不是git命令 可以用!表示,如'!gitk'
https.proxy http://127.0.0.1:1080 和 --unset https.proxy 设置和取消代理

git常用

1
2
3
4
5
6
7
8

HEAD 最后的提交
HEAD^ 倒数第二提交
HEAD^^或者HEAD~2 倒数第三

init 在工作目录创建主分支
clone 克隆 -b 分支名 --depth 次数(不想把记录也搞下来可以为1) 地址
stash 暂存 save "信息" 暂存且指定名字 list 查看暂存 pop 弹出暂存 apply 类似pop,但是pop会删除暂存 drop 名称 移除 show -p 查看差异,p是详细

git查看

1
2
3
4
5
6
log 查看日志 --stat 显示简短内容 --name-only 仅显示文件清单 --name-status 仅显示增删改的文件清单 --author="author" 列出该用户 --grep="" 过滤,可加--all--match表示同时满足 file 可以指定文件,查看某文件
status 当前状态
blame -L <start>,<end> 文件名 查看文件历史,从第start行到end行
diff 查看工作与暂存的差异 --cached <reference> 查看暂存和某次提交的差异,默认是HEAD
show <reference>/标签名 查看某提交信息
tag 给提交或者仓库打标签 名/名 <reference> 给当前仓库/提交打标签 -d 名 删除标签 -m "" 注释信息

git删除

1
2
3
clean 清除没有被跟踪的文件 -n 查看要清除什么 -f 执行清除 -x 连ingore的都删除 -X 只删除ignore -d 删除目录 path 指定目录,不加则为整仓库
rm 文件名 将文件移除 --cached 从暂存区移除
reset [--soft | --mixed | --hard] [HEAD] --soft 工作区不变,暂存区不变,本地仓库回滚 --mixed 默认参数,工作区不变,暂存区回滚,本地仓库回滚,需重新add --hard 三个区都回滚

git拉取提交

1
2
3
4
5
6
7
add 文件名 添加文件,用.表示所有
commit --amend 结合上次提交一起 -m "" 注释 -a 跳过暂存区,直接到本地仓库
pull <远程主机名>(origin) <远程分支名>:<本地分支名> 拉取远程主机,分支与本地分支合并 --rebase 执行rebase不执行merge 实际该指令大概可以理解为fetch + merge
push <远程主机名> <本地分支名>:<远程分支名> -u 名 指定默认主机 --force 强制推送,冲掉差异 --tags 推送标签
fetch <远程主机名> <分支名> 从远程获取最新版本,不指定分支名即全部
merge 分支名 合并该分支到当前分支
rebase 分支名 将另一分支合并到当前,不留痕迹,不像merge那样,将提交合并成patch,然后转到当前分支apply,当有冲突时,解决完用add后,执行--continue则继续执行apply,或者用--abort结束

git分支

1
2
3
4
branch 列出本地所有分支;分支名 创建分支;-b 分支名 创建并切换分支;-a 列出所有分支;-m 名1 名2 将名1改为名2;-d 名 删除分支
checkout 文件名;分支名 切换分支;-b 名 [commit id] 创建并切换;commit id 切换到某提交;
chrry-pick <commit id>【..<commit id>】 将提交应用到其它分支
remote

git补丁

1
2
3
4
format-patch <commit id> -n 打包id和之前n-1个到patch,patch是一个提交一个;<id>..<id> 打包之间的;--stdout > fiilename.patch 指定名字
diff <id> <id> > filename.diff 打包到diff,只有一个
apply --check filename 应用 但是不创建提交
am filename 应用且创建提交

git文件

1
2
3
4
5
6
7
8
9
10
11
12
13
.gitignore
filename 忽略指定文件
filepath 忽略指定文件夹
* 统配符
!xxx 这xxx文件不忽略
/xxx 表示忽略最上层的xxx
git check-ignore检查

..gitmodules
git submodule add <url> <path> 添加子模块,path为保存路径
git submodule update --init --recursive 拉取子模块

移除子模块->移除目录、移除.gitmodules信息、移除.git/config信息、移除.git/module/ 对应信息