GIT&GITHUB
Git&GitHub
版本控制
个人版本控制
在进行开发的时候,程序需要经常性的修改,那么修改的时候就存在备份问题,当代码量较大修改频繁时,备份的及时性和备份的困难度就增加了。
团队版本控制
当团队中多人协同开发同一个功能时,可能存在开发人员之间的版本互相覆盖问题。
版本控制特点
-
协同修改
对人可以并行地修改同一个文件。
-
数据备份
不仅保存数据当前地实际状态,还能保存文件提交地历史状态,可以回滚操作。
-
版本管理
保存版本时不保存重复数据,节约存储,提高运行效率。
-
权限控制
对团队中参与开发的人员进行权限控制,对其他开发人员贡献的代码进行审核。
-
历史记录
查看提交修改历史,版本回滚
-
分支管理
允许开发团队在工作过程中多条生产线同时推进任务,提高效率。
工具简介
集中式:SVN、CVS、VSS。以服务器为核心,容易出现单点故障问题。
分布式:GIT、Mercurial、Bazaar、Darcs,避免了单点故障。
GIT
优势
- 版本控制可在本地完成
- 完整性保证
- 添加大于删除和修改
- 分支操作快捷流畅
- bash融合
结构
- Directory:使用Git管理的一个目录,也就是一个仓库,包含我们的工作空间和Git的管理空间。
- WorkSpace:需要通过Git进行版本控制的目录和文件,这些目录和文件组成了工作空间,除了.git之外的都属于工作区。
- .git:存放Git管理信息的目录,初始化仓库的时候自动创建。
- Index/Stage:暂存区,或者叫待提交更新区,在提交进入repo之前,我们可以把所有的更新放在暂存区。
- Local Repo:本地仓库,一个存放在本地的版本库;HEAD会只是当前的开发分支(branch)。
- Stash:是一个工作状态保存栈,用于保存/恢复WorkSpace中的临时状态。
本地操作
初始化本地库
git init //在目录中将创建一个.git目录
设置签名
设置一个用户信息,用于唯一标示身份,仅用于区分开发人员,信息和远程仓库无关。
签名分为项目级别和系统级别,签名的作用域不同,项目/仓库级别在本仓库中有效,优先使用仓库级别。签名必须设置才能执行操作。
git config user.name xxx
git config user.email xxx@xxx.com
git config --global user.name xxx
git config user.email xxx@xxx.com
$ cat ~/.gitconfig
[user]
email = 1958862281@qq.com
name = Wan9huan
//全局签名存储在全局配置文件中
//仓库签名保存在.git/config中
常用命令
git status #查看状态
git add #添加文件到缓存区
git remove --cached #移除已经add的文件
git commit #提交
git commit -a -m"This is Message" #提交附带注释
git log #查看日志
git log --oneline #简洁查看
git relog #查看日志和回滚步数
git reset --hard HEAD^ #后退一步
git reset --hard HEAD~3 #后退三步
git reset --hard 2fedc85 #回到指定版本
------------------------------------------------------------------------
$ git status
On branch master
No commits yet
nothing to commit (create/copy files and use "git add" to track)
------------------------------------------------------------------------
$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
ReactDemo/
2017-09-07.png
nothing added to commit but untracked files present (use "git add" to track)
------------------------------------------------------------------------
$ git add 2017-09-07.png
$ git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage) // 从缓存区移除
new file: 2017-09-07.png
Untracked files:
(use "git add <file>..." to include in what will be committed)
------------------------------------------------------------------------
$ git commit
[master (root-commit) c40dd30] Changes to be committed: new file: 2017-09-07.png
//版本号
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 2017-09-07.png
-----------------------------------------------------------------------
$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
nothing to commit, working tree clean
------------------------------------------------------------------------
$ git log --oneline
8b6ba42 (HEAD -> master) Create A Book Text
37c34e8 deleted: Photoshop_Set-Up.exe
4cfa483 (origin/master) last
a2858e8 new
4b3e03e aa
dc03544 Merge branch 'master' of https://github.com/wan9huan/myfiles
9b3d010 all
9382437 Delete background.png
bb31bd9 Changes to be committed: new file: icon 2.png
b386c61 a
4366632 a
fc86b6a png for background
------------------------------------------------------------------------
$ git reflog
8b6ba42 (HEAD -> master) HEAD@{0}: commit: Create A Book Text
37c34e8 HEAD@{1}: commit: deleted: Photoshop_Set-Up.exe
4cfa483 (origin/master) HEAD@{2}: commit: last
a2858e8 HEAD@{3}: commit: new
4b3e03e HEAD@{4}: commit: aa
dc03544 HEAD@{5}: pull: Merge made by the 'recursive' strategy.
9b3d010 HEAD@{6}: commit: all
bb31bd9 HEAD@{7}: commit: Changes to be committed:
b386c61 HEAD@{8}: commit: a
4366632 HEAD@{9}: commit: a
fc86b6a HEAD@{10}: commit (initial): png for background
------------------------------------------------------------------------
$ git reflog book.txt
5997266 (HEAD -> master) HEAD@{0}: commit: 第四次修改
2fedc85 HEAD@{1}: commit: 第三次修改
af72196 HEAD@{2}: commit: add a string
8b6ba42 HEAD@{3}: commit: Create A Book Text
------------------------------------------------------------------------
//回滚、回到指定版本
$ git reflog book.txt
5997266 (HEAD -> master) HEAD@{0}: commit: 第四次修改
2fedc85 HEAD@{1}: commit: 第三次修改
af72196 HEAD@{2}: commit: add a string
8b6ba42 HEAD@{3}: commit: Create A Book Text
$ cat book.txt
This is a Book Text
333333333333333
444444444444444
$ git reset --hard af72196
HEAD is now at af72196 add a string
$ cat book.txt
This is a Book Text
$ git reset --hard 2fedc85
HEAD is now at 2fedc85 第三次修改
$ cat book.txt
This is a Book Text
333333333333333
------------------------------------------------------------------------
$ git reset --hard HEAD^ 后退一步
$ git reset --hard HEAD~3 后退三步
Rest指令
git rest --soft #移动本地库指针
git rest --mixed #移动本地库、重置暂存区
git rest --hard #移动本地库、重置暂存区、重置工作区
比较文件差异
git diff #暂存区比较
git diff Head #比较某一版本
------------------------------------------------------------------------
$ git diff book.txt
diff --git a/book.txt b/book.txt
index 48d8508..f2259a8 100644
--- a/book.txt
+++ b/book.txt
@@ -1,2 +1,4 @@
This is a Book Text
-333333333333333
\ No newline at end of file
+333333333333333
+444444444444444
+555555555555555
\ No newline at end of file
分支
- 并行推进多个开发
- 分支彼此独立
- 热修复
git status #查看当前分支
git branch -v #查看所有分支
git branch xxx #创建分支
git checkout xxx #切换分支
------------------------------------------------------------------------
$ git status -v
On branch master //主分支
Your branch is ahead of 'origin/master' by 5 commits.
(use "git push" to publish your local commits)
nothing to commit, working tree clean
$ git branch -v
* master 828b1ab [ahead 5] commit all
$ git branch hot_fix
$ git checkout hot_fix
Switched to branch 'hot_fix'
------------------------------------------------------------------------
#分支合并
1.切换到主分支
2.执行 git merge xxxx
--------------------------------------------------------------------------------
git checkout xxxx
git merge xxxx
------------------------------------------------------------------------
冲突解决
- 发生文件冲突,进入冲突解决状态
- 打开文件可以查看到冲突内容
- 删除冲突标记并修改文件
- 提交完成合并分支
远程操作
基本操作
git remote -v #查看远程仓库
git remote add(remove) xxx ht..com/xxx.git #添加远程仓库
git push xxx master(填写推送分支) #推送到分支
git clone https://git....../xxx/git #克隆远程库
git fetch xxx master #下载远程内容
git checkout xxx/master #切换到某个远程分支
git checkout master #切换到本地分支
git merge xxx/maser #合并本地和远程
git pull #直接合并远程到本地
------------------------------------------------------------------------
$ git remote -v
origin https://github.com/wan9huan/myfiles.git (fetch)
origin https://github.com/wan9huan/myfiles.git (push)
$ git push origin master
Enumerating objects: 15, done.
Counting objects: 100% (15/15), done.
Delta compression using up to 4 threads.
Compressing objects: 100% (11/11), done.
Writing objects: 100% (14/14), 1.22 KiB | 138.00 KiB/s, done.
Total 14 (delta 5), reused 0 (delta 0)
remote: Resolving deltas: 100% (5/5), completed with 1 local object.
To https://github.com/wan9huan/myfiles.git
4cfa483..828b1ab master -> master
------------------------------------------------------------------------
#必须是远程仓库的成员才可以进行推送
冲突解决
#当不是基于最新版做出的修改无法进行推送
#拉去远程资源进入冲突解决状态,解决冲突
#提交再推送即可成功完成推送操作
跨团队协作
- Fork一个远程仓库
- 进行修改开发
- 发起Pull Request
- 原仓库所有人审核
- 审核完毕,合并代码
SSH
ssh-keygen -t rsa -C|github账号
# 生成 .ssh/ 目录 生成 id_rsa id_rsa.pub
# 将公钥添加到远程端
git remote add xxxx ssh版本的.git
git push xxxx master
#使用 ssh push
Linux搭建
依赖安装
yum -y install policycoreutils openssh-server openssh-clients postfix policycoreutils-python
#启动项
systemctl enable postfix && systemctl start postfix
下载安装包
https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum #选择一个安装包
wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-11.0.6-ce.0.el7.x86_64.rpm
#选择自己的安装包 e16 centos6 e17 centos7
rpm -i gitlab-ce-11.0.6-ce.0.el7.x86_64.rpm
*. *.
*** ***
***** *****
.****** *******
******** ********
,,,,,,,,,***********,,,,,,,,,
,,,,,,,,,,,*********,,,,,,,,,,,
.,,,,,,,,,,,*******,,,,,,,,,,,,
,,,,,,,,,*****,,,,,,,,,.
,,,,,,,****,,,,,,
.,,,***,,,,
,*,.
_______ __ __ __
/ ____(_) /_/ / ____ _/ /_
/ / __/ / __/ / / __ `/ __ \
/ /_/ / / /_/ /___/ /_/ / /_/ /
\____/_/\__/_____/\__,_/_.___/
Thank you for installing GitLab!
gitlab-ctl reconfigure
//需要等待较长时间
gitlab-clt restart
原理
Hash算法
哈希加密算法,不管运算前的数据有多大,进行哈希运算后,能得到固定长度的加密结果,同样的数据经过相同的算法,都能输出同样的结果,不同的数据得到同一个哈希值的可能性极小,不可逆。
版本控制机制
数据保存为小型文件系统的一组快照,创建分支时,新建一个指向当前版本的指针。