git笔记
版本控制系统——只能跟踪文本文件的修改,而非文件,建议用VSCode代替笔记本
# 创建版本库
git init #将目录变成可以被git管理的仓库
git add <file> #将文件添加到仓库 暂存区
git commit -m "描述性信息" #将文件提交到仓库 由暂存区提交到HEAD
# 时光穿梭机
git status #查看仓库当前的状态
git diff <file> #查看当前文件与上一次提交的区别
git log #显示最近到最远的提交记录
# HEAD #表示当前版本的提交码,HEAD^ #表示上一次提交版本码,HEAD^^ #表示上上一次,若为100次前的版本,简写为HEAD~100
git reset --hard HEAD^ #表示版本回退到上一次提交的版本,也可以不用HEAD来表示,直接写提交码
git reflog #打印git记录的每一次提交和reset的命令记录,其中包括每一次命令导致的提交码,这样可以根据这个提交码进行恢复
git diff HEAD -- readme.txt #命令可以查看工作区和版本库里面最新版本
# 工作区和暂存区
电脑中的目录是工作区,工作区有一个隐藏目录.git,是git版本库
git版本库中存有称为stage的暂存区,git为我们自动创建的第一个分支master,以及指向master的一个指针HEAD。
# 撤销修改
git checkout -- <file> #放弃<file>在工作区的修改,如果暂存区有暂存修改,则回归到暂存区保存的状态,如果暂存区没有保存的修改,则回归到HEAD
git reset HEAD <file> #放弃<file>暂存区的修改
git rm <file> #从版本库中删除<file>,再提交
# 远程仓库
git remote add origin https://gitee.com/agnes001/learngit.git #关联到远程库
git push -u origin master #第一次推送master分支的所有内容
git push origin master #后续推送用此命令,将本地master分支的最新修改推送至远程仓库
git clone <远程仓库地址> #从远程仓库克隆
# 创建与合并分支
git checkout -b <name> / git switch -c <name> #创建并切换到<name>分支
git branch <name> #创建<name>分支
git checkout <name> / git switch <name> #切换到<name>分支
git branch #查看所有分支,结果中带×号的表示是当前分支
git merge <name> #合并<name>分支到当前分支
git branch -d <name> #删除<name>分支
# 解决冲突
在合并两个分支时,如果有冲突,就必须先解决冲突,再向前进行一次提交,然后进行合并
git log --graph --pretty=oneline --abbrev-commit (git log --graph 可以看到分支合并图)
# 分支管理策略
通常,合并分支时,Git会尽可能的使用Fast forward模式,即只更改分支的指针指向,但这会带来一个问题,在分支上的提交,在合并后,把分支删除后,会丢掉分支信息。在merge时使用--no-ff,Git在merge时就会生成一个新的commit,然后merge到该commit上
git merge --no-ff -m "描述" dev
分支策略
master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
干活都在
dev
分支上,也就是说,dev
分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev
分支合并到master
上,在master
分支发布1.0版本;你和你的小伙伴们每个人都在
dev
分支上干活,每个人都有自己的分支,时不时地往dev
分支上合并就可以了。
# Bug分支
当在dev分支干活时,突然被告知master分支上有个bug issue1需要被修复,但由于dev下的工作还未完成不能提交,此时
git stash #存储工作现场
然后切换到master分支,新建一个issue-1分支,修改完毕后,将其合并到master分支,然后删除issue-1分支,最后切换到dev分支,
git stash list #查看所有保存的工作现场
git stash pop #恢复最后一个工作现场,并将其从工作现场保存列表中删除
git stash apply <工作现场序号> #恢复工作现场,如:stash@{0} 但不删除保存的工作现场
git stash drop <工作现场序号> #删除保存的工作现场
在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick <commit>命令,把bug提交的修改“复制”到当前分支,避免重复劳动。
git cherry-pick 4c805e2 #复制一个特定的提交到当前分支
# 多人协作
git remote #查看远程库的信息
git remote -v #显示更详细的信息,如果没有推送权限,就看不到push的地址
git push origin <branch-name> #从本地推送分支到远程
从远程库clone时,默认只能看到本地的master分支,如果要在dev分支上开发,需要创建远程origin的dev分支到本地
git checkout -b <branch-name> origin/<branch-name> #在本地创建和远程分支对应的分支
如果推送失败,就说明远程的版本比本地的新,就
git pull #抓取远程的新提交到本地
git branch --set-upstream-to=origin/dev dev #设置dev和origin/dev进行链接
本地解决冲突,合并后,再提交和push
# 标签管理
标签是版本库的一个快照,它就是一个指向commit的指针,区别在于分支可以移动,而标签不可以移动,既然有了commit,为什么要有标签?如果有个标签叫v1.1,某一天,我们需要打包发布某个提交,就可以用v1.1,而不是一串字母数字了。所以,Tag就是一个有意义的名字,和一个commit绑定
git tag <tag-name> #创建标签
git tag #查看所有标签
默认创建的标签打在最近的一次提交上
git log --pretty=oneline --abbrev-commit #查看提交记录
git tag <tag-name> <commit-id> #在某一次提交上打标签
git show <tag-name> #标签不是按照时间顺序列出,而是按照字母顺序列出,查看标签的详细信息
git tag -a <tag-name> -m "描述" <commit-id> #创建带有说明的标签,-a指定标签名,-m指定标签信息
git tag -d <tag-name> #删除标签
git push origin <tag-name> #创建的标签都储存在本地,不会自动推送到远端,将标签推送到远端
git push origin --tags #一次性推送所有尚未推送到远程的本地标签
如果要删除远端已提交的标签,就先删除本地标签,然后用如下命令
git push origin :ref/tags/<tag-name>
# 自定义git
git显示颜色,让关键信息更醒目
git config --global color.ui true
# 忽略特殊文件
有时候,我们必须把某些文件放到Git工作目录中,但是我们又不能提交他们,比如保存了数据库密码的配置文件等等,每次用git status都会提示未跟踪的文件,有强迫症的人肯定受不了。可以在Git工作目录创建一个特殊文件.gitignore 忽略文件的原则是: 1.忽略操作系统自动生成的文件,比如缩略图等; 2.忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件; 3.忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
该文件中以#开头的为注释,*.exe表示忽略以exe为后缀的文件,dist表示忽略名字为dist的目录,ab[cde].ini表示忽略abc.ini、abd.ini、abe.ini文件,然后将.gitignore文件也一并提交到仓库就可以了
git add -f app.class 表示强行将被忽略的app.class文件加入git的追踪
如果发现可能是由于.gitignore文件写的有问题导致有文件提交不上去,可以通过下述命令检查
git check-ignore -v <file>
# 搭建git服务器
收集所有需要登录用户的.pub公钥,把所有公钥导入到.ssh/authorized_keys文件里,一行一个
选定一个目录作为Git仓库,假定是~/sample.git,在~目录下输入命令:
git init --bare sample.git
然后就可以通过git克隆使用了
git clone git@192.168.1.7:/home/fenghaojie/sample.git
公钥管理可以使用 gitosis
权限管理可以使用 gitolite