1.git介绍
Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
版本控制:记录文件修改历史记录,从而使用户能够查历史版本,方便版本切换。
就像记录论文版本一样(被图片笑死)
为什么需要版本控制工具:需要团队协作
Git 与 SVN 区别点:
-
1、Git 是分布式的,SVN 不是:这是 Git 和其它非分布式的版本控制系统,例如 SVN,CVS 等,最核心的区别
-
2、Git 把内容按元数据方式存储,而 SVN 是按文件:所有的资源控制系统都是把文件的元信息隐藏在一个类似 .svn、.cvs 等的文件夹里
-
3、Git 分支和 SVN 的分支不同:分支在 SVN 中一点都不特别,其实它就是版本库中的另外一个目录
-
4、Git 没有一个全局的版本号,而 SVN 有:目前为止这是跟 SVN 相比 Git 缺少的最大的一个特征
-
5、Git 的内容完整性要优于 SVN:Git 的内容存储使用的是 SHA-1 哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。
git工作机制
(找到的比较全面的图)
-
工作区(workspace):本地电脑存放项目文件的地方
-
暂存区(Index/Stage):在使用git管理项目文件的时候,其本地的项目文件会多出一个.git的文件夹,将这个.git文件夹称之为版本库。其中.git文件夹中包含了两个部分,一个是暂存区(Index或者Stage)
-
本地仓库(repository):.git文件夹里还包括git自动创建的master分支,并且将HEAD指针指向master分支
-
远程仓库(remote):不是在本地仓库中,项目代码在远程git服务器上,比如项目放在github上,就是一个远程仓库,通常使用clone命令将远程仓库拷贝到本地仓库中,开发后推送到远程仓库中即可
代码托管中心
代码托管中心是基于网络服务器的远程代码仓库
-
局域网:GitLab
-
互联网:GitHub Gitee
2. Git命令
设置用户签名:git config --global user.name
git config --global user.email
git首次安装必须设置一下用户签名,否则无法提交代码
设置完成之后可用cat ~/.gitconfig
查看
初始化本地库: git init
工作目录下生成.git文件夹说明初始化成功
查看本地库状态:git status
对于刚编辑的文件 此时文件的颜色是红色的
添加到暂存区:git add 文件名
将工作区的文件添加到暂存区
其他添加命令:
- 提交工作区所有文件到暂存区:
git add .
- 提交工作区中指定文件到暂存区:
git add <file1> <file2> ...
- 提交工作区中某个文件夹中所有文件到暂存区:
git add [dir]
删除命令:
- 删除工作区文件,并且也从暂存区删除对应文件的记录:
git rm <file1> <file2>
; - 从暂存区中删除文件,但是工作区依然还有该文件:
git rm --cached <file>
; - 取消暂存区已经暂存的文件:
git reset HEAD <file>...
;
提交到本地库:git commit -m "日志信息" 文件名
出现以下提示说明文件被修改
其他提交命令:
- 将所有已经使用git管理过的文件暂存后一并提交,跳过add到暂存区的过程:
git commit -a -m "日志信息"
; - 撤销上一次提交:
git commit --amend
;
查看历史记录:git reflog
版本穿梭:git reset --hard 版本号
3.Git分支
几乎每一种版本控制系统都以某种形式支持分支。使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作
好处:
-
同时并行推进多个功能开发,提高开发效率
-
各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败 的分支删除重新开始即可
分支操作
创建分支:git branch 分支名
查看分支:git branch -v
切换分支:git checkout 分支名
合并分支:git merge 分支名
当合并分支时,可能会出现冲突
冲突产生的原因: 合并分支时,两个分支在同一个文件的同一个位置有两套完全不同的修改。Git 无法替 我们决定使用哪一个。必须人为决定新代码内容。
想将dev分支合并到master分支,操作如下
- 1、首先切换到master分支上:
git checkout master
- 2、把dev分支的代码合并到master上:
git merge dev
- 3、执行下面提交命令:
git push origin master
合并之后的代码应该是怎样的:
1、在同一个地方,master做了修改,dev没有修改,则合并后是修改了的
2、在同一个地方,master没有修改,dev修改了,则合并和还是修改了的
在同一个地方,一个分支做了修改,另一个分支没有做修改,则合并后的结果总是修改了的
3、在同一个地方,两条分支都做了修改,则产生冲突
删除分支:git branch -d <分支名>
把远程分支合并到当前分支:git merge <remote-name>/<branch-name>
4.Git团队协作
团队内协作:
clone 是本地没有 repository 时,将远程 repository 整个下载过来。
pull 是本地有 repository 时,将远程 repository 里新的 commit 数据(如有的话)下载过来,并且与本地代码merge。
5.GitHub操作
查看当前所有远程地址别名:git remote -v
起别名:git remote add 别名 远程地址
将远程地址起一个别名 方便操作
推送本地分支上的内容到远程仓库:git push 别名 分支
将远程仓库的内容克隆到本地:git clone 远程地址
从远程仓库中抓取本地仓库中没有的更新:git fetch 远程地址
将远程仓库对于分支最新内容拉下来后与当前本地分支直接合并: git pull 远程库地址别名 远程分支名
移除远程仓库:git remote rm 远程地址
clone,pull,fetch的区别:
git clone顾名思义就是将其他仓库克隆到本地,包括被clone仓库的版本变化
git pull是相当于从远程仓库获取最新版本,然后再与本地分支merge
git fetch 相当于是从远程获取最新到本地,不会自动merge
文章参考: