Git实践
git是一个分布式版本控制软件,最初由林纳斯·托瓦兹创作,于2005年以GPL发布。最初目的是为更好地管理Linux内核开发而设计。
git最初的开发动力来自于BitKeeper和Monotone。git最初只是作为一个可以被其他前端(比如Cogito或Stgit[8])包装的后端而开发的,但后来git内核已经成熟到可以独立地用作版本控制。很多著名的软件都使用git进行版本控制[,其中包括Linux内核、X.Org服务器和OLPC内核等项目的开发流程。
------来自wiki
使用的实践的前提是,本地安装成功git,即:
使用 git --version
命令可以获得版本号
git version 2.26.2.windows.1
Git的三种状态和三个阶段
三个状态:
- 已提交(committed)
表示数据已经安全的保存在本地数据库中。
- 已修改(modified)
表示修改了文件,但是还没保存到数据库中
- 已暂存(staged)
表示对一个已修改的文件当前版本做了标记,使之包含在下次提交的快照中。
三个阶段:
工作区、暂存区以及git目录
工作区,显而易见是在进行文件操作时需要的缓存区域,能够方便使用和修改,其中的文件是从git仓库的压缩数据库中提取出来的。
暂存区(索引)的理解是,一个保存了下次要提交的文件列表信息
git仓库就是git存储项目的元数据和对象数据库的地方。
本地玩转Git
本地尝试功能包含:初始化git仓库,查看和配置本地信息(用户名,邮件是必要配置),添加文件追踪,查看仓库状态,提交事务以及备注,分支操作等。
基本配置
-
初始化仓库
git init
-
配置用户名和邮件
git config --global user.name "John Doe" git config --global user.email johndoe@example.com # 查看配置, --list 可以查看 git config --list --show-origin git config user.name
-
添加文件
# 主要使用.和*进行匹配 git add . # 将所有目录下的文件进行跟踪 git add *.txt
添加文件后git会对添加文件进行追踪,追踪的参数包括修改,删除。
进行这些操作后可以查看仓库的状态。
添加文件时出现:LF will be replaced by CRLF 警告时:
使用:
git config --global core.autocrlf false
即可去除警告。 -
查看仓库状态
git status git status -s 获得更简洁的报告
A 表示被追踪的文件
M文件被修改,
??新添加的未跟踪的文件
两个占位,左栏暂存区,右栏工作区(需要commit后才能有工作区)
-
提交版本
git commit -m ‘message’
如果不添加 -m参数在win上会弹出安装时选择的文本编辑器进行提交信息的编写
-
获取帮助
-h命令,,git 子命令查询如 git add -h
-
获取提交历史
git log
log信息会按照提交时间的先后列出,信息包含commit,Author,date和每次提交的备注信息。
主要的参数包括 -p/–patch -num(定义显示最近的几条数据)
–stat:可以看到每次提交的改动信息的统计
–pretty:自定义显示的结构 :如:–pretty=oneline:每次提交的信息一行显示完
自定义时使用的参数:
撤销操作
-
重新提交
git commit --amend # 该方法会替代上一次的提交
-
取消暂存的文件
git reset HEAD xxxx(文件)
-
撤销对文件的修改
git checkout --<file>
打标签
# 查询标签
git tag -l “标签(可进行匹配搜索)”
# 创建标签,如果不使用-a参数 进行版本信息查询时就看不到额外的标签信息
git tag -a v1.1 -m ‘message’
# 查看版本信息
git show v0.1
# 给历史版本打标签
git tag -a v1.2 9fceb02(部分校验和)
# 删除标签 -d
git tag -d v1.4-lw
如果使用远端服务器,标签需要另外push
Git别名
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status
和github一起使用
简单熟悉本地git的使用后,可以进行远端操作。
多次本地git库关联到github出现错误后,建议构建先创建远端的github仓库,使用git clone 仓库名
命令克隆至本地,再进行git的使用。
当然这里也根据官方文档记录本地连接远端仓库服务器的方法:
- 首先查看本地git仓库是否配置远端服务器:
get remote
如果是克隆的仓库,可以看到origin(git给克隆仓库服务器的默认名字)
使用 -v 可以显示 使用的git的url,主要使用的是https/ssh
可以存在不止一个远端url
- 添加远程仓库
# pd 别名
git remote add pb https://github.com/paulboone/ticgit
# 获取仓库信息,origin 无法获取??
git fetch pb
必须注意 git fetch 命令只会 将数据下载到你的本地仓库——它并不会自动合并或修改你当前的工作
- 推送到远程仓库
# 推送到origin 的master分支
git push origin master
# 展示远程仓库的url和跟踪分支信息,列出了执行git push会自动推送的远程分支
git remote show origin
- 远程仓库的重命名与移除
git remote rename pb paul
git remote remove paul
- 标签的推送(共享标签)与删除(远端)
默认git push 不会传送标签到远端服务器仓库上。
git push origin <tagname>
# 一次性提交多个标签
git push origin --tags
# 删除标签
git push <remote>:refs/tags/<tagname>
git push origin --delete <tagname>
Git分支
分支是一个很好理解的东西,创建新的分支能够保证原有的项目不受影响。也是git官方文档里称之的“必杀技特性”。git鼓励频繁的使用分支和合并。
一般来说执行commit命令后git 中存在三个对象,一个是文件快照对象,树对象(记录文件结构和快照对象的索引,以及提交对象(包含指向前树对象的指针和所有提交信息。
创建分支
# 创建新的分支
git branch testing
创建分支后需要知道如何指向这个分支,git中存在HEAD的特殊指针,通过它进行分支的指定。
# 指向新建的分支
git chechout testing
# 创建分支并立即切换
git checkout -b <newbranchname>
分支的合并
因为在新建的分支上进行修改后,快照是接续主分支的,合并分支就像将把分支的指针指向修改后的快照。在官方文档中把这一操作叫做快进。
# 合并新的分支到当前分支
git merge <newbranch>
分支合并后如需要删除临时新建的分支可以使用:
git branch -d <branch>
特殊情况实例:
当新分支是在当前分支指向的快照之前分出的。如果master中修改的文件和新分支里修改的文件不是同一文件的同一部分。合并的命令不变,git会经过一系列的处理进行合并。
如果产生冲突git不会继续进行,直到你解决了冲突。这里使用git status可以查看冲突的文件。
使用图形化工具会有助于解决该问题。。git mergetool
分支管理
# 查看分支
git branch
git branch -v # 可以查看每个分支的最后一次提交
# --merged :查看哪些分支已经与当前分支合并
# --no-merged 查看所有包含未合并工作的分支,分支中有未合并的工作,不能使用-d删除
# -D 强制删除
.gitignore忽略文件
当一个git库中有不需要上传的文件时 进行配置:
*.[oa]
*~
表示忽略以.a或.o结尾的文件,和忽略名字以~结尾的文件。
案例:
# 先忽略所有的.a文件
*.a
# 但跟踪所有的lib.a文件
!lib.a
# 忽略 当前目录下的TOD文件 而不忽略 xxx/TOD
/TOD
# 忽略任何目录下名为build的文件
build/
# 忽略当前目录下的文件,而不忽略doc/server/a.txt
doc/*.txt
# 忽略所有
doc/**/*.txt
其他.gitignore配置可以在这里看到。