Git入门

666

1.git介绍

Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。

版本控制:记录文件修改历史记录,从而使用户能够查历史版本,方便版本切换。

就像记录论文版本一样(被图片笑死) image.png

为什么需要版本控制工具:需要团队协作

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 哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。

image.png

git工作机制

image.png

(找到的比较全面的图) image.png

  1. 工作区(workspace):本地电脑存放项目文件的地方

  2. 暂存区(Index/Stage):在使用git管理项目文件的时候,其本地的项目文件会多出一个.git的文件夹,将这个.git文件夹称之为版本库。其中.git文件夹中包含了两个部分,一个是暂存区(Index或者Stage)

  3. 本地仓库(repository):.git文件夹里还包括git自动创建的master分支,并且将HEAD指针指向master分支

  4. 远程仓库(remote):不是在本地仓库中,项目代码在远程git服务器上,比如项目放在github上,就是一个远程仓库,通常使用clone命令将远程仓库拷贝到本地仓库中,开发后推送到远程仓库中即可

代码托管中心

代码托管中心是基于网络服务器的远程代码仓库

  • 局域网:GitLab

  • 互联网:GitHub Gitee

2. Git命令

设置用户签名:git config --global user.name git config --global user.email

git首次安装必须设置一下用户签名,否则无法提交代码

设置完成之后可用cat ~/.gitconfig查看

初始化本地库: git init

image.png

工作目录下生成.git文件夹说明初始化成功

查看本地库状态:git status

image.png

对于刚编辑的文件 此时文件的颜色是红色的

添加到暂存区:git add 文件名

将工作区的文件添加到暂存区

image.png

其他添加命令:

  1. 提交工作区所有文件到暂存区:git add .
  2. 提交工作区中指定文件到暂存区:git add <file1> <file2> ...
  3. 提交工作区中某个文件夹中所有文件到暂存区:git add [dir]

删除命令:

  1. 删除工作区文件,并且也从暂存区删除对应文件的记录:git rm <file1> <file2>;
  2. 从暂存区中删除文件,但是工作区依然还有该文件:git rm --cached <file>;
  3. 取消暂存区已经暂存的文件:git reset HEAD <file>...;

提交到本地库:git commit -m "日志信息" 文件名

image.png

出现以下提示说明文件被修改

image.png

其他提交命令:

  1. 将所有已经使用git管理过的文件暂存后一并提交,跳过add到暂存区的过程:git commit -a -m "日志信息";
  2. 撤销上一次提交:git commit --amend;

查看历史记录:git reflog

image.png

版本穿梭:git reset --hard 版本号

3.Git分支

几乎每一种版本控制系统都以某种形式支持分支。使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作

好处:

  • 同时并行推进多个功能开发,提高开发效率

  • 各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败 的分支删除重新开始即可

分支操作

创建分支:git branch 分支名

查看分支:git branch -v

image.png

切换分支:git checkout 分支名

image.png

合并分支:git merge 分支名

image.png

当合并分支时,可能会出现冲突

冲突产生的原因: 合并分支时,两个分支在同一个文件的同一个位置有两套完全不同的修改。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团队协作

团队内协作:

image.png

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

文章参考:

(git基本操作,一篇文章就够了! (juejin.cn))