what git?
来源linux, 天生分布式的版本控制工具
与svn区别
svn是集中式的
与svn的版本机制不同
Git 只关心文件数据的整体是否发生变化,而SVN这类版本控制系统则只关心文件内容的具体差异(git的冲突到文件, svn到行)
这类系统(如SVN)每次记录有哪些文件作了更新,以及都更新了哪些行的什么内容,然而Git 并不保存这些前后变化的差异数据。实际上,Git更像是把变化的文件作快照后,记录在一个微型的文件系统中。每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照的索引。为提高性能,若文件没有变化,Git 不会再次保存,而只对上次保存的快照作一链接。
所以git只有一个.git文件, svn每个文件夹下面都有.svn, svn更加适合做excel数据统计类的集中式管理的需求
GIT不需要联网
SVN 断开网络或者断开VPN就无法commit代码,但是Git 可以先commit到本地仓库。
长时间不commit代码会丢失大量开发进程的历史纪录。有个比喻是:不能commit就像用word写文档不能save一样危险
Git 的内容完整性要优于SVN
因为Git 在commit(存储在本地)或者push(上传到远程仓库)之前,通过对文件的内容或目录的结构计算出一个 SHA-1哈希值,作为指纹字符串进行内容的校验,并将此结果作为数据的唯一标识和索引,在远处仓库接受到commit的文件之后,会再计算一遍哈希值然后跟传递过来的哈希值做比较,如果不一致,说明文件在传输时变得不完整,或者磁盘损坏导致文件数据损坏。另外在 Git 数据库中的东西都是用此哈希值来作索引,而不是靠文件名
为什么要用Git?
- git每台电脑都有一个版本库,可以在本地做版本管理;
- 速度快。git的速度远超大部分版本管理系统,包括svn
- 强大的分支管理功能
- 活跃的开源社区,如最著名的github,国内的gitee
Git与GitHub
gitHub是一个面向开源及私有软件项目的托管平台,因为只支持git 作为唯一的版本库格式进行托管,故名gitHub。(hub: 中心)
git 常用命令使用
配置命令
用户信息查看
git config user.name
git config user.email
用户信息设置
git config user.name yourname
git config user.email youremail
通过gittortoise找到配置文件位置
编辑, 然后另存为地址就是文件的存放位置类
全局配置位置:
"C:\Users\yourname\.gitconfig"
[user]
name = yourname
email = *@163.com
[credential]
helper = manager-core
"D:\Git\etc\gitconfig"
[diff "astextplain"]
textconv = astextplain
[filter "lfs"]
clean = git-lfs clean -- %f
smudge = git-lfs smudge -- %f
process = git-lfs filter-process
required = true
[http]
sslBackend = openssl
sslCAInfo = D:/Git/mingw64/ssl/certs/ca-bundle.crt
[core]
autocrlf = input
fscache = true
symlinks = false
editor = \"D:\\\\Program Files (x86)\\\\Notepad++\\\\notepad++.exe\" -multiInst -notabbar -nosession -noPlugin
[pull]
rebase = false
[credential]
helper = manager-core
[credential "https://dev.azure.com"]
useHttpPath = true
[init]
defaultBranch = main
所以你可以直接手动编辑文件
设置你可以自定义目录
[xx] # git叫做目录
yy = zz
> git config xx.yy
zz
> git config xx.yy "ooxx" # 但是不能操作
fatal: not in a git directory
初始化库
git init 让git开始管理这个文件夹,在同级目录下会出现一个隐藏的.git文件。
git init
提交版本
检查版本状态
git status
提交本地
git add ./-A/filename (. 代表所以的新增和修改, -A 新增,修改删除, 所以我们尽量使用-A)
git commit -m comment
# 二合一步骤
git commit -am comment 加入缓冲区并提交
如果只执行git init后没有执行git commit的话,可以使用一个命令把索引信息删除
git rm --cached
如果你修改了文件名,使用git commit -am 的话,可以也有对应的文件修改记录
虽然git mv 原来的文件名 新文件名可以做到 ,但是提交中一样可以做到,所以mv基本上使用得比较少
忽略文件
.gitignore只能忽略那些原来没有被追踪的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。那么解决方法就是先把本地缓存删除(改变成未被追踪状态),然后再提交:
git rm -r --cached
git add -A
git commit -m 'update .gitignore'
补充说明:
-
“.gitignore”文件的影响范围是它所在的文件夹和所有的子文件夹
-
每一个文件夹都可以创建自己的“.gitignore”文件,如果它上层的文件夹也有“.gitignore”文件,这个文件夹也会受到它的影响。
-
“.gitignore”文件中可以使用“#”字符开头表示注释,文件夹路径是用“/”字符,文件名可以使用通配符“*”,另外还可以使用“!”字符表示排除。
不使用/既可以是路径,可以是文件, 所以以/结尾的都是路径, 最后一个/后面的既可以是路径也可以是文件
只能从当前目录开始写路径, 就是说不能使用绝对路径和上级路径
例如:
gitig/a
a文件和a目录都会忽略
gitig/a/
只有a目录会被忽略
分支
git branch -a 查看分支
git branch youbranch 创建分支
git checkout newbranch 切换分支
处理冲突
提交两个分支的内容
git commit -am comment
git merge otherbranch 其他分支合并到当前分支, merge只能在本地完成(本地是相对的)
日志
git log
简化成一行
git log --oneline
简化成一行,同时显示分支
git log --oneline --graph
* 3d36fb0 all
|\
| * 4c2f973 main v1.1
* | fe63aaf all
* | 6854d6f dev v1.2
|/
* fb9d691 v0
* 1a244dd v
|\
| * a23d43f dev
* | 648bd04 v1.0
git提交点
在命令行使用gitk可以展示简单的git界面。
gitk命令的位置"D:\Git\cmd\gitk.exe", 所以gitk不是gittortoise命令
gitk
commit的中的这些字母和数字就是commit节点的标识(比如最新的提交点是 1a244d5)
标签
# 给1a244d5提交打一个标签
git tag -a v1.0 1a244d5
恢复
回退(reset)、反做(revert)
在Git里,有一个HEAD指针指向当前分支(只有一个分支的情况下会指向master,而master是指向最新提交)
git reset的作用是修改HEAD的位置,即将HEAD指向的位置改变为之前存在的某个版本。(比如需要回到到V0.3)
git log --oneline --graph
使用“git reset --hard 目标版本号”命令将版本回退
git reset --hard ccf4298
git log --oneline --graph
git revert的作用通过反做创建一个新的版本,这个版本的内容与我们要回退到的目标版本一样,但是HEAD指针是指向这个新生成的版本,而不是目标版本。
使用“git revert HEAD”撤销前一次的commit
git revert HEAD
看log信息,revert已经把新建了一个提交点9a26e6b,这个点的内容和ccf4298提交点的内容是一样。区别就是新建了一个commit点
Git远程仓库
ssh
生成和配置RAS秘钥
ssh-keygen -t rsa -C 12345678@qq.com
配置公钥到github中
本地与远程仓库通讯(使用https的方式,第一次提交时需要输入密码)
git remote add [源名称 源地址]
gti remote [-v] 查看远程连接[详情]
git push --set-upstream original branch
# 可简化
git push -u original branch
git fetch 提取远程仓库(如果服务器有修改,不会到本地)
git merge 合并冲突(如果只是本地或远程一端修改的话,就不会冲突)
git clone github地址 ---在命令目录下会自动生成一个对应项目的目录
git clone github地址 文件夹 -- 会在文件夹中clone对应的内容