参考文章:https://www.liaoxuefeng.com/wiki/896043488029600
类型:
分布式版本控制系统
集中式版本控制系统:
版本库集中存放在中央服务器,工作时,首先要从中央服务器获取最新的版本,再把自己的东西推送给中央服务器.
缺点:
联网
实际应用软件:
svn(开源,免费)
ClearCase(收费)
vss(不好用)
分布式版本控制系统:
没有中央服务器,每个人电脑上都是一个完整的版本库,多人协作时,只需把自己的修改推送给对方,就可以互相看到对方的修改了.在实际使用分布式版本控制系统的时候,很少在两人之间的电脑上推送版本库的修改,因为可能两人并不在一个局域网内,两台电脑互相访问不了,也可能对方的电脑根本没有开机,所以,分布式版本控制系统通常也有一台充当’中央服务器’的电脑,但这个服务器的作用仅仅是用来方便'交换’大家的修改,没有它大家也一样可以完成工作,只是交换修改不方便而已
优点:
安全性较高,不需要联网
实际应用软件:
git(快速,简单,流行)
BitKeeper(促使git诞生)
Mercurial(类似git)
Bazaar(类似git)
环境:
Linux,Unix,Mac,Windows
安装:
Mac OS:
homebrew安装法
xcode中继承了git,但没有安装,需要在xcode偏好设置里找到Downloads,选择Command Line Tools,install
Windows:
git官网下载,默认选项安装,开始菜单找到git->git bash,如果弹出命令行窗口,安装成功.
完成后,需要在命令行中输入:
$ git config —global user.name “your name”
$ git config —global user.email “email@example.com”
填写自己的用户名和邮箱
--global表示这台机器上的所有git仓库都会使用这个配置
版本库:
又名仓库,简单理解成一个目录,这个目录所有文件都可以被git管理起来,每个文件的修改,删除,git都能跟踪
创建版本库:

创建learngit空目录
进入到空目录中
获取绝对路径
将空目录变成git可以管理的仓库:

注:如果没有看到.git目录,则这个目录默认是隐藏的,使用ls -ah可以看见
将文件添加到版本库
注:所有的版本控制系统,只能跟踪文本文件的改动,例如txt文件,网页,所有的程序代码等.图片,视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只知道图片从100kb改成了120kb,但具体的变化,版本控制系统不知道,所以,如果要真正使用版本控制系统,就要以纯文本方式编写文件,建议使用标准的UTF-8编码.windows系统注意:不要使用windows自带的记事本编辑任何文本文件,建议使用notepad++代替记事本(notepad++默认编码设置为UTF-8 without bom).


改动但没有提交:

回退版本:
head表示当前版本(一个指向当前版本的指针)
head^:上一个版本
head^^:上上个版本
head~100:回退到前100个版本
基本语句:
Git reset —hard head^
查看git日志(查看版本号):
git log
指定版本号进行回退:
Git reset —hard 版本号
保存记录每一次命令:
Git reflog
工作区(Working Directory):
在电脑里能看到的目录,例如learngit
版本库(Repository):
工作区有一个隐藏目录.git,并不属于工作区,而是git的版本库
暂存区(stage)
HEAD:
Git自动创建的第一个分支master,以及指向master的一个指针叫HEAD

Git add:实际上把要提交的所有修改放到暂存区
git commit:一次性把暂存区的所有修改提交到分支
撤销修改:
Git checkout —文件名(包括后缀)
两种情况:
1.txt文件修改后还没有放到暂存区,撤销修改后就回到和版本库一模一样的状态
2.txt文件修改后add到了暂存区,然后又做了修改,这时候撤销修改就回到了存放到暂存区后的状态
总的来说,撤销修改就是让文件回到最近一次git commit或git add时的状态
将暂存区的修改撤销掉:
Git reset HEAD 文件名
手动删除文件并从从版本库中删除文件:
git rm 文件名
git commit
将误删的文件恢复到最新版本:
git checkout —文件名
远程仓库:
github作为git的远程仓库
本地git仓库和github仓库间的传输通过ssh加密
创建ssh key:
1.如果有.ssh->id_rsa(私钥)和id_rsa.pub(公钥),可以直接跳到下一步(command+shift+.可以查看隐藏文件)
2.没有,终端打开,创建ssh key(windows打开git bash):
ssh-keygen -t rsa -C “你的邮箱”
接下来只需要使用默认值即可
add key:
登录github->Account settings->ssh keys->add ssh key->填上任意title,在文本框里粘贴id_rsa.pub文件的内容
为什么github需要ssh key?
github需要识别推送的提交确实是本人推送的,只有知道了公钥,就可以确认只有自己才能推送
github作用:
在本地新建一个git仓库后,在github也新建一个git仓库,这两个仓库之间可以进行远程同步,这样github仓库可以作为备份,也可以让其他人通过该仓库来协作.

将本地仓库与github仓库同步,并且将分支推送到github上
推送时所需要的用户名和密码:
shiguoqian
pineapple1310204
从远程库克隆:
Git clone git@github.com:shiguoqian/gitskills.
分支管理:

master:指向最新的提交,master分支是主分支
HEAD:指向master,即HEAD指向的就是当前分支

Dev:创建的新的分支,HEAD指向它,代表当前分支在dev上

新的提交后,就知识针对dev分支了,而master指针不变

当我们完成了dev分支上的工作后,可以把dev合并到master上,即让master指向dev的当前提交
合并完成后,可以把无用的dev分支删掉,即将dev指针删掉(使用fast forward模式可以在合并完成后删除无用的分支)
创建dev分支并切换到当前分支:
Git checkout -b dev
-b:创建并切换分支(branch+checkout)
查看当前分支:
Git branch(列出所有分支,*表示当前分支)
Dev分支完成后,切换到master分支:
git checkout master
删除dev分支:
git branch -d dev
合并分支:
Git checkout master
Git merge -no-ff -m “提交时的message” dev(禁止使用fast forward,合并完成后不删除原来的分支)

错误分支:
当接到一个修复错误的任务时,需要建立一个分支进行修复,但如果自己手头的分支工作还未完成,就不能提交,也就不能进行修复错误工作,这时就可以通过stash功能,把当前工作现场'储存起来’,等到错误修复后,恢复现场继续工作
保存现场:
git stash
查看保存的现场:
git stash list
恢复现场:
git stash apply(恢复但并不删除stash中存储的)
git stash drop(删除存储的)
git stash pop(恢复并删除stash中存储的)
Feature分支:
开发一个新功能,使用feature分支,当不需要改功能时,可以随时删除该分支(未合并前删除,需要进行强制删除-D)
Git branch -D 分支名
多人协作:
远程仓库默认名称origin
当你从远程仓库克隆时,实际上git是自动把本地的master分支和远程的master分支对应起来了
查看远程库的信息:
git remote
查看更详细的信息:
git remote -v(可以抓取推送的origin的地址)
推送分支(把该分支上的所有本地提交推送到远程库):
git push 远程仓库名 分支名
master分支是主分支,要时刻与远程同步
Dev分支是开发分支,也需要远程同步
bug分支只用于在本地修复bug,没必要推送到远程
feature分支是否推送取决于是否在上面合作开发
在远程仓库中的dev分支开始开发:
Git checkout -b dev origin/dev(将github上的dev同步到本地仓库)
修改后将dev分支推送到远程仓库:
git commit -m “添加dev分支信息”
如果同时多人对dev分支进行修改,必定会产生冲突,解决方法:
git pull(前提是当前所在分支就是dev)将最新的dev分支从origin/dev抓下来,本地合并,解决冲突后再重新推送
如果git pull失败,原因是没有指定本地dev分支与远程origin/dev分支的链接,设置origin/dev和本地dev链接:
git branch —set-upstream-to=origin/dev dev(创建分支链接)

将本地为push的分叉提交历史整理成直线:
git rebase(使查看历史提交的变化时更容易)
标签管理:(不按时间顺序列出,而是按字母排序)
每发布一个版本时,通常在版本库中打一个标签(tag),唯一确定了打标签时刻的版本,无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来,标签也是某个历史版本的别名
git的标签是指向某个commit的指针(分支可以移动,标签不能移动),创建和删除标签都是瞬间完成的,但是因为commit号杂乱难记,所以用一个和commit绑定的标签进行使用
创建标签:(为某个分支打上标签,实际上当该分支提交后,tag标签就指向了该commit)
git tag v1.0(在当前分支上打标签)
创建标签并指定标签信息:
git tag -a 标签名 -m “message"
查看所有标签:
git tag
为某个提交打标签:
git tag v0.9 commit号
标签总是和某个commit挂钩,如果这个commit既出现在master分支又出现在dev分支,那么在这两个分支上都可以看到这个标签
删除本地仓库标签:
git tag -d 标签名
创建的标签只存储在本地,不会自动推送到远程
将标签推送到远程:
git push origin 标签名
删除远程仓库标签:
git push origin:refs/tags/标签名
自定义git:
让git显示颜色:
git config —global color.ui true
忽略特殊文件:
有时候,必须要把某些文件放到git工作目录中,但又不能提交他们,可以让git忽略某些特殊文件,从而不会每次都提示:
https://github.com/github/gitignore
编写完.gitignore文件后也要将其提交到git中,以便生效
配置别名:
让命令更加简洁容易记住:
git config —global alias.st status
这样,就可以用st替代status单词了
git status == git st
每个仓库的git配置文件都放在.git/config文件中
输入q退出显示界面