Git是最先进的分布式版本控制系统,相比SVN具有强大的分支管理以及处理速度。如果你仍然在使用SVN,也许应该考虑下使用git了。
设置个人信息
首先在git bash中设置个人的账户信息,global参数声明此配置应用于全局git仓库,你也可以对不同版本库指定不同的账户信息。
git config --global user.name "your name"
git config --global user.email "your email address"
生成公钥与私钥,执行后会让你指定一些配置信息,如密钥位置,密码。可以一路回车使用默认配置。生成的位置在C:\Users\userName\.ssh中,其中id_rsa为你的私钥,不可以泄露,id_rsa.pub是你的公钥,会被用到。
ssh-keygen -t rsa -C "your email address"
尝试使用Git
进入你想要建立git版本库的目录下初始化git仓库,比如F:\repo
git init
可以在此目录下发现多了一个.git目录,这个目录是用来跟踪管理版本库以及记录个人配置信息用的,不要没事乱改。
在repo下新建test.txt,并在其中记录一些内容。
通过git status查看当前仓库状态。
git status
添加文件到仓库。
# 添加指定文件 git git add <fileName>
git add test.txt
# 添加全部文件
git add .
把文件提交到仓库。
# -m后输入本次提交的说明 git commit -m <message>
git commit -m "commit info"
查看上次修改内容。
git diff
# 与仓库里面最新版本的区别
git diff HEAD -- test.txt
查看提交记录,每一次提交对应一个commit id。
git log
# 简略信息
git log --pretty=oneline
# 分支合并图
git log --graph
git log --graph --pretty=oneline --abbrev-commit
之所以需要添加和提交两步,是因为git存在暂存区的概念。
git add将文件添加到暂存区,git commit把暂存区的所有内容提交到当前分支,仓库创建后只有唯一一个分支,也就是master分支,所以当前就是向master分支上提交。
多次提交后进行版本回退。
Git在内部有一个指向当前版本的HEAD指针,当回退版本的时候,Git仅仅是修改HEAD的指向,速度自然非常之快。
# 回退至上一个版
git reset --hard HEAD^
# 回退至上上一个版
git reset --hard HEAD^^
# 往上10个版本
git reset --hard HEAD~10
# 查看历史命令 可以确定commit id
git reflog
# 指定回退版本
git reset --hard <commitId>
如果文件还没有添加到暂存区,那么就是还原到版本库中的状态;如果已经添加到了暂存区,那么就是还原到暂存区的状态。 总之,就是让这个文件回到最近一次git commit或git add时的状态。
# 文件还原
git checkout -- <fileName>
# 撤销掉暂存区中的修改
git reset HEAD <fileName>
删除文件。
# 物理上删除文件后
# 从版本库中删除该文件 并且提交
git rm test.txt
git commit -m "remove"
远程仓库
SVN是集中式的版本控制系统,仓库是集中存放在SVN服务器中的。如果服务器宕机了,那么大家也就没法干活了。
Git是分布式版本控制系统,也就是说每个人都有一个独立的、完整的本地仓库,彼此之间可以互相推送。
Git中也有充当类似于SVN服务器的存在,也就是Git服务器,通过Git服务器可以方便大家的交换,而Git服务器上的仓库就是远程仓库。
本地仓库关联远程仓库。
# 在本地仓库下执行 关联本地仓库 远程库的名称是origin
git remote add origin git@<path>/<repoName>.git
# 第一次推送本地内容到远程仓库 -u 参数将本地与远程的master分支关联起来
git push -u origin master
# 以后就不需要 -u 了
git push origin master
通常我们更喜欢先建立远程仓库,再从远程仓库克隆。
git clone git@<path>/<repoName>.git
开发中使用分支
git中一个产品应当只有一个主分支,主分支存放稳定的代码,只用来发版。
开发模式为先拉取master分支,之后创建自己的本地分支,完成需求开发后切换到master分支拉取代码,回到本地分支合并主分支,处理冲突,切换回master分支,合并代码,推送代码至远程仓库。
# 列出当前全部分支 带*标记的为当前所处分支
git branch
# 创建分支
git branch local
# 切换分支
git checkout <name>
# 创建并切换至此分支
git checkout -b <name>
# 合并指定分支到当前分支
git merge <name>
# 禁用Fast forward模式
git merge --no-ff -m "merge with no-ff" <name>
# 删除分支
git branch -d <name>
# 强制删除分支 某个没有被合并的分支如果删除掉就会丢失修改,需要强制删除
git branch -D <name>
如果我们开发过程中需要先去处理优先级更高的事情,可以把当前分支添加、提交后建立新分支处理需求,如果当前不方便提交,则可以将当前工作区的修改暂存起来。
# 将当前工作区的修改暂存起来
git stash
# 查看
git stash list
# 回复并删除stash信息
git stash pop
# 恢复指定的stash
git stash apply stash@{0}
# 删除stash
git stash drop
协作开发时,应到在本地解决冲突后再推送。
# 查看远程库信息
git remote
# 详细信息
git remote -v
# 拉取最新代码
git pull
# 解决冲突后提交
git push
# git push origin <branchName>
git push origin master
从远程创建分支与关联。
# 从本地创建和远程分支对应的分支 同一个分支建议用相同名称 不要没事折腾自己
git checkout -b <branchName> origin/<branchName>
# 将本地分支与远程分支建立关系
git branch --set-upstream-to <branchName> origin/<branchName>
Rebase操作用来把本地未push的分叉提交历史整理成直线,便于查看历史变化。
git rebase
使用标签,标签其实是与commit id做关联的,相比commit id自然更加易读。
# 查看所有标签
git tag
# 查看某个标签的信息
git show <tagName>
# 给当前分支打标签
git tag <tagName>
# 关联某个commit id
git tag <tagName> <commitId>
git tag -a <tagName> -m <tagInfo> <commitId>
# 推送指定标签
git push origin <tagName>
# 推送全部标签
git push origin --tags
# 删除标签
git tag -d <tagName>
# 删除远程仓库标签
git push origin :refs/tags/<tagName>
忽略文件
开发过程中并不是所有的文件都需要往远程仓库中推送的,比如java编译后产生的.class文件,或是打包后产生的jar包等等。
在仓库的根目录下创建.gitignore文件,把要忽略的文件名或是通配类型填进去,git就会自动忽略这些文件。
可以看看一些固定的搭配套路:https://github.com/github/gitignore
如果某些文件被匹配到了,而仍想提交,则可以强制添加。
git add -f <fileName>
or
看看是哪一条规则匹配到了,去考虑完善规则。
git check-ignore -v <fileName>