Git分布式版本控制工具
每个人都拥有全部的代码!安全隐患!
所有版本信息仓库全部同步到本地的每个用户,这样就可以在本地查看所有版本历史,可以离线在本地提交,只需在连网时push到相应的服务器或其他用户那里。由于每个用户那里保存的都是所有的版本数据,只要有一个用户的设备没有问题就可以恢复所有的数据,但这增加了本地存储空间的占用。
不会因为服务器损坏或者网络问题,造成不能工作的情况!
一、Git配置
-
所有的配置文件,其实都保存在本地!
git config -list
查看所有配置项 -
查看不同级别的配置文件:
#查看系统config git config --system --list #查看当前用户(global)配置 git config --global --list
-
Git相关的配置文件:
1)Gitetcgitconfig :Git 安装目录下的 gitconfig --system 系统级
2)C:UsersAdministrator .gitconfig 只适用于当前登录用户的配置 --global 全局
1.1 设置用户名与邮箱(用户标识,必要)
当你安装Git后首先要做的事情是设置你的用户名称和e-mail地址。这是非常重要的,因为每次Git提交都会使用该信息。它被永远的嵌入到了你的提交中:
git config --global user.name "Q-volcano" #名称
git config --global user.email 24736743@qq.com #邮箱
只需要做一次这个设置,如果你传递了--global 选项,因为Git将总是会使用该信息来处理你在系统中所做的一切操作。如果你希望在一个特定的项目中使用不同的名称或e-mail地址,你可以在该项目中运行该命令而不要--global选项。总之--global为全局配置,不加为某个项目的特定配置。
二、Git基本理论
2.1 三个区域
- 工作区:就是你在电脑里能看到的目录。
- 暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
- 版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。
- Directory:使用Git管理的一个目录,也就是一个仓库,包含我们的工作空间和Git的管理空间。
- WorkSpace:需要通过Git进行版本控制的目录和文件,这些目录和文件组成了工作空间。
- .git:存放Git管理信息的目录,初始化仓库的时候自动创建。
2.2 工作流程
git的工作流程一般是这样的:
1、在工作目录中添加、修改文件;
2、将需要进行版本管理的文件放入暂存区域;
3、将暂存区域的文件提交到git仓库。
2.3 文件的4种状态
版本控制就是对文件的版本控制,要对文件进行修改、提交等操作,首先要知道文件当前在什么状态,不然可能会提交了现在还不想提交的文件,或者要提交的文件没提交上。
- Untracked: 未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过
git add 状态变为Staged.
- Unmodify: 文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改, 而变为Modified.
如果使用git rm移出版本库, 则成为Untracked文件
- Modified: 文件已修改, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处, 通过
git add
可进入暂存staged状态, 使用git checkout
则丢弃修改过, 返回到unmodify状态, 这个git checkout即从库中取出文件, 覆盖当前修改 ! - Staged: 暂存状态. 执行
git commit
则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodify状态. 执行git reset HEAD filename
取消暂存, 文件状态为Modified
2.4 查看文件状态
上面说文件有4种状态,通过如下命令可以查看到文件的状态:
#查看指定文件状态
git status [filename]
#查看所有文件状态
git status
# git add . 添加所有文件到暂存区
# git commit -m "消息内容" 提交暂存区中的内容到本地仓库 -m 提交信息
2.5 忽略文件
有些时候我们不想把某些文件纳入版本控制中,比如数据库文件,临时文件,设计文件等
在主目录下建立".gitignore
"文件,此文件有如下规则:
- 忽略文件中的空行或以井号(#)开始的行将会被忽略。
- 可以使用Linux通配符。例如:星号(*)代表任意多个字符,问号(?)代表一个字符,方括号([abc])代表可选字符范围,大括号({string1,string2,...})代表可选的字符串等。
- 如果名称的最前面有一个感叹号(!),表示例外规则,将不被忽略。
- 如果名称的最前面是一个路径分隔符(/),表示要忽略的文件在此目录下,而子目录中的文件不忽略。
- 如果名称的最后面是一个路径分隔符(/),表示要忽略的是此目录下该名称的子目录,而非文件(默认文件或目录都忽略)。
#为注释
*.txt #忽略所有 .txt结尾的文件,这样的话上传就不会被选中!
!lib.txt #但lib.txt除外
/temp #仅忽略项目根目录下的TODO文件,不包括其它目录temp
build/ #忽略build/目录下的所有文件
doc/*.txt #会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
三、Git基本操作命令
3.1 创建仓库
-
创建本地仓库(一般不用)一般情况直接在GitHub上创建仓库然后clone到本地仓库
git init # 该命令执行完后会在当前目录生成一个 .git 目录。 # 使用我们指定目录作为Git仓库。 git init newrepo #初始化后,会在 newrepo 目录下会出现一个名为 .git 的目录,所有 Git 需要的数据和资源都存放在这个目录中。 git remote add <别名> <url> #添加一个新的远程仓
-
clone 远端仓库到本地仓 (常用)
命令:
git clone <repo>
常见的几种写法
git clone git@github.com:fsliurujie/test.git --SSH协议 git clone git://github.com/fsliurujie/test.git --GIT协议 git clone https://github.com/fsliurujie/test.git --HTTPS协议
-
推送本地到远程仓库
git push <远程仓库地址> 分支名称
git push <远程仓别名> 分支名称
git push -u 远程仓库地址别名 分支名称
-u 记住推送地址及分支,下次推送只需要 git push
3.2 基本命令
菜鸟教程
3.3 Git分支
什么是分支?
分支就像平行宇宙一样,你做你的,我干我的,一般分有3种类型,
master分支, 最稳定
develop分支,基于master分支创建的开发中的分支
feature分支,基于develop创建的某个功能特征的分支
在某个分支开发完毕后,可以合并到主分支,实现协同开发,互不干扰
分支命令:
-
git branch #查看分支
git branch #列出所有本地分支,打*号表示当前分支 git branch -r #列出所有远程分支 git branch -a #列出所有本地分支和远程分支
-
git branch <分支名> #创建分支
git branch develop #创建开发分支
-
git checkout <分支名> #切换分支
git checkout develop
切换分支前记得git status ,若有需要commit的commit后再切换;
切换不同的分支,文件会随之改变
-
git merge <分支名> # 合并分支
# 按照顺序合并分支 即 在 master 合并 develop 在 develop 合并 feature
-
git branch -d <分支名> #只能删除被合并的分支,如果没有的话,默认情况会报错
git branch -D<分支名> #强制删除
小技巧:
在开发中,可以暂时提取分支上所有的改动存储,让开发人员得到一个干净的工作副本,临时转向其他工作。
使用场景:分支临时切换
存储临时改动:git stash
恢复改动:git stash pop
四、多人协作开发流程
- A在本地创建本地仓
- A在远端创建好仓库,编写好部分代码后 push 到远端
- A 向 B发出 开发邀请 , B接受并让 A认证
- B clone 远端仓库到本地
- B 将本地仓库 push 到远端
- A 将远端仓库 拉取 到本地 , 后续 B 一般也是拉取 远端到本地
git clone 完全复制,只需要执行一次就可以
git pull 是拉取远程仓库中最新的版本,前提是已经有了本地仓
git pull <url > <branch> # 如果远程仓版本高于本地仓,则本地仓不能 push,必须先pull 拉取到最新版本 再push
解决冲突
在多人同时开发一个项目的时候,如果两个人修改了同一个文件的同一个地方,就会发生冲突,需要人为解决
为什么有冲突?
多个人同时推送,有先后关系,先推送的人能够推送上,后推送的人由于远程仓库版本高于本地仓,推送失败
所以,后推送的 人需要将远程仓的高版本拉取到本地,拉取到本地发现修改的是同一个文件,即发生了冲突
命令行会有提示,冲突的文件,我们要解决的就是打开 index.html 文件,然后查看冲突代码,修改成需要的
此时 ,后推送的人修改完成后 git add git commit 到本地仓,再推送就能成功
微团队合作
为开源项目找 bug 并改进,然后推送给开源作者
- fork 到自己的远程仓库
2. 从自己的远程仓 clone 到本地 开发
-
本地修复,改进后 推送到自己的远程仓
-
在 GitHub 上创建一个 pull Request请求
-
原作者 查看消息 同时可以回复 ,查看检查代码后,决定是否合并
ssh 免密登入
生成公私钥后
设置本机绑定SSH公钥,实现免密码登录!
#生成公钥
ssh-keygen
# 在 C:UserAdministator.ssh 目录中找到公钥代码复制到Github
# 在本地添加远端仓库别名
git remote add origin_ssh git@github.com:xxxxxxxx
git push origin_ssh master