Git学习笔记

来源:互联网 发布:linux cp参数个数 编辑:程序博客网 时间:2024/06/09 16:33

为了防止自己忘记的太快,所以看完教程还是回顾一下吧。
参考教程:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

前言部分大概了解了版本控制可以说是一个记录什么时候改变了什么,以及方便恢复到指定版本,以及方便团队成员协作的功能(个人喜欢这么理解吧)。
Git的诞生故事看看就好。
集中式跟分布式的区别,目前只觉得集中式依赖于网络,没网络就提交不了,而且风险较大(万一中央服务器挂了…),而分布式中,每台机器都是一个版本库,自己改自己提交(拉取推送还是依赖网络吧),风险较小,一台机器挂了,还有多台机器上存有版本库,克隆一下就好。
Git安装:由于自己用Windows,没用Mac os,也懒得在虚拟机上搞Linux,所以就在Windows上搞了。
Linux命令:sudo apt-get install git 或者 sudo apt-get install git-core。
Mac os:不管了反正自己用不上。
Windows:下载安装包,双击打开一路下一步即可,装完,任意目录下鼠标右键->Git Bash。
全局配置:git config –global user.name “yourname”
git config –global user.email “youremail”
创建版本库:git init 初始化版本库,当前目录下生成.git目录,一般不要手动改里面的东东。
git add filename 添加文件到仓库,可同时添加多个,只有添加后的文件才受到仓库的管理,仓库只能跟踪文本文件的内容改变,其他二进制文件的内容改变,仓库是无法知道的。
git commit filename -m “your message” 提交改变到本地仓库。
查看状态或比较文件:git status 查看当前工作区间文件状态(修改了没有,添加了没有,提交了没有)。
git diff filename(different)比较工作区间文件与仓库文件。
查看日志:git log 或者 git log –pretty=oneline。只查看当前分支当前提交点之前的日志?
版本切换:git reset –hard HEAD^ 或者 git reset –hard commit_id。
【Git内部有一个HEAD指针,指向当前分支,当前分支指向的最近一次提交点,版本切换只是把当前分支的指向移动到另一个提交点】。
查看提交或切换日志:git reflog。
【工作区可以理解为操作系统下看得见的目录,暂存区可以理解为Git提供的一个git add之后git commit之前的存放改变的空间,git add将工作区的改变添加到暂存区,git commit将暂存区的改变提交到仓库】。
管理修改:【理解Git跟踪管理的是改变而非文件,改变通过git add添加到stage,然后通过git submit提交到仓库,Git内部有HEAD指针,HEAD指向一个分支,Git内部有多个分支,分支是一条由多个提交点(改变)串起来的线,分支指向这条线上的一个提交点】。
撤销修改:
1、撤销工作区间修改(暂存区的改变依然生效):git checkout – file。
2、撤销暂存区以及工作区间的修改:git reset HEAD file。
3、撤销已经提交的修改(版本回退):git reset –hard commit_id。
删除文件:在磁盘上删除文件后,还要git rm(理解为一个改变还是理解为此文件不再受仓库管理?),git commit。
远程仓库:
1、GitHub上申请仓库地址。
2、创建SSH Key:ssh-keygen -t rsa -C “youremail”。
3、上传公钥。
添加远程仓库:git remote add origin git@server-name:path/repo-name.git。origin是远程库,Git默认叫法。
首次推送:git push -u origin master。首次推送master分支到关联远程库的origin中。
非首次推送:git push origin master。
克隆远程库:git clone git@server-name:path/repo-name.git。
【Git支持多种协议,https速度慢点且每次连接需要输入口令,原生ssh最快但某些只开放http端口的公司中无法使用】。
分支管理:不同的开发者在不同分支下工作,工作互不影响。
创建/合并分支:【Git内部有HEAD指针指向一个分支,Git内部有多个分支,每个分支是由多个提交点串起来的线,分支只是指向这条线上的一个点,
创建分支就是创建一个新分支,新分支指向当前分支指向的提交点,并以这个点为起始点,
切换分支就是HEAD指向移动到新分支,
在新分支上提交就是添加一个提交点,新分支指向新提交点,新分支上的线与新提交点连成线,其他分支不受影响,
合并分支就是,当前分支指向被合并分支最近提交点,当前分支的线连上这个提交点,
删除分支就是把分支上的线取消,但是上面的点不变??】
创建分支:git branch name。
切换分支:git checkout name。
创建并且换分支(切换分支,如果分支不存在就创建并切换?):git checkout -b name。
查看分支:git branch。当前分支前面有*号。
合并分支:git merge name。
删除分支:git branch -d name。
合并冲突:当不同分支对同一文件修改时,容易冲突,Git无法快速合并。解决冲突后添加提交即可完成合并。
查看分支图:git log –graph –pretty=oneline –abbrev-commit。
分支管理策略:默认情况下,Git使用快速合并,会丢失原来分支的信息??,在合并时可使用git merge –no-ff -m “message” name禁用快速合并,禁用快速合并相当于创建一个新的提交点。
通常一个项目需要一个稳定版本的master分支,非稳定版本的dev分支,开发者需要在dev分支下起新的分支完成开发,开发完毕后合并到dev分支,版本发布时master分支合并dev分支。
Bug分支:在功能开发未完成时,临时开新的分支修复Bug,可以使用git stash暂存当前工作环境。Bug修复完毕后,可使用git stash apply恢复最近暂存的工作环境,git stash drop删除最近暂存的工作环境。git stash pop恢复并删除最近暂存的工作环境。
强制删除分支:git branch -D name。未合并的分支不能普通删除。
团队协作:
查看远程库信息git remote -v。
建立对应分支:git checkout -b branch-name origin/branch-name。本地分支跟远程分支名称最好一致。
分支关联:git branch –set-upstream branch-name origin/branch-name。
抓取:git pull。
解决冲突。
推送:git push origin branch-name。
标签管理:
git tag查看所有标签。
git tag name HEAD 或 git tag name commit_id新建标签,可以省略HEAD。
git tag -a name -m “blablabla…”指定标签信息。
git tag -s name -m “blablabla…”用PGP签名标签,需安装gpg以及找到密钥对。
git show name查看标签详情。
git push origin name推送一个本地标签。
git push origin –tags推送全部未推送过的本地标签。
git tag -d name删除一个本地标签。
git push origin :refs/tags/name删除一个远程标签。
【使用GitHub Fork任意开源仓库,自己只能有Fork后仓库的读写权限,可推送pull request贡献代码】。
自定义Git:举个栗子:git config –global color.ui true,不过对我估计默认配置就行了。
忽略特殊文件:配置.gitignore文件,https://github.com/github/gitignore 。
配置别名:教程上感觉有意义的也就:git config –global alias.unstage ‘reset HEAD’ 和 git config –global alias.lg “log –color –graph –pretty=format:’%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset’ –abbrev-commit” 。
配置文件位置:.git/config。
搭建Git服务器:
安装sudo apt-get install git。
添加用户sudo adduser git。
创建证书登录,公钥导入到/home/git/.ssh/authorized_keys,一行一个。
初始化仓库sudo git init –bare simple.git。
禁用shell登录/etc/passwd文件git用户权限git:………/git-shell。
克隆远程仓库git clone git@server:/srv/sample.git。
管理公钥Gitosis。
管理权限Gitolite。

0 0