版本控制-Git的学习与应用

介绍

Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。

Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。

通俗一点来说就是一个用于控制代码存储仓库以及进行协同开发的工具,同类型的版本控制工具还有cvs、Subversion等

常用的远程库:github、gitee以及gitlab,其实还有阿里仓库、腾讯云仓库等

工作流程

  1. 克隆 Git 资源作为工作目录
  2. 在克隆的资源上添加或修改文件。
  3. 如果其他人修改了,你可以更新资源。
  4. 在提交前查看修改。
  5. 提交修改。
  6. 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。

特性

Git会将每一次提交的所有文件保存为一个快照,如果这次提交的文件没有修改,那么git就会只保留一个链接指向之前存储的文件。

Git几乎不会执行任何可能导致文件不可恢复的操作。

Git 工作区、暂存区和版本库

  • 工作区:就是你在电脑里能看到的目录。
  • 暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)
  • 版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。

左侧为工作区,右侧为版本库。在版本库中标记为 “index” 的区域是暂存区(stage/index),标记为 “master” 的是 master 分支所代表的目录树,HEAD是一个指针

objects 标识的区域为 Git 的对象库,实际位于 “.git/objects” 目录下,里面包含了创建的各种对象及内容。

常用命令

1、这个命令可以将git能找到的配置

1
git config --list

2、初始化git仓库,这条命令会创建一个名为.git的子目录,这里面含有初始化git的所有必须文件,可以为仓库创建.gitignore文件,避免一些无用文件的提交

1
git init

3、查看文件处于什么状态

1
git status

4、命令使用文件或目录的路径作为参数将文件存入暂存区,如果参数是当前目录,则将递归地跟踪该目录下的所有文件,如果运行命令后又对已经跟踪的文件进行了修改那么一定要重新运行git add这条命令,否则所提交的文件就会是之前运行命令时的状态

1
git add <project-name / .>

5、不加入参数调用git diff命令,可以查看尚未暂存的文件更新了哪些部分(与已暂存的版本对比而不是已经提交的版本对比),想要查看已经暂存起来的变化,可以添加–cache

1
git diff --cache

6、可以通过git commit命令将已经暂存的文件进行提交,在提交前应该运行git status查看是否有已修改但未暂存的文件保存在本地,提交后git会 告诉你当前是哪个分支,本次提交的完整校验和,以及本次提交有多少文件被修订过(提交的是放在暂存区域的快照),这样可以将暂存区的所有内容提交到当前分支

1
git commit -m '备注说明'

7、git checkout – ***可以撤销修改,使文件回到最近一次提交的状态

1
git checkout -- <project-name>

8、git push 命令可以将当前分支推送到远程指定分支

1
git push origin <branch-name>

9、危险操作:git remote rm ***可以删除远程指定库

10、git clone命令可以克隆一个与远程仓库一样的本地库

1
git clone <url>

11、在仓库建立的时候会提供一个master分支,而这个分支会指向最新的提交点,而HEAD指向master也就间接指向了最新提交,我们可以新建分支,并将修改提交到新的分支上,这时分支之间就会出现差距,而HEAD可以通过改变指向不同的分支 来查看不同的版本

12、我们可以通过git checkout -b ***来创建一个新分支

1
git checkout -b <new-branch-name>

13、通过git branch可以查看当前仓库所拥有的分支,以及现在HEAD指向的分支,然后通过git checkout ***来切换分支

1
git branch git checkout <branch-name>

14、git merge ***可以将指定的分支合并到当前分支上,这样HEAD与当前分支都会指向最新的版本,这个命令会包含所有分支的所有提交

图片

1
git merge <branch-name>

15、当我们不同的分支中都对同一个进行了不同的修改,这样在合并的时候就会出现冲突,Git会提示我们哪些文件存在冲突,Git会在文件中用<<<<<<<,========,>>>>>>>标记出不同分支下不同的内容,我们做出修改后可以再进行提交。

16、git pull与git push相反,可以从远程仓库拉取指定分支内容到本地

1
git pull origin <branch-name>

17、建立本地分支与远程分支的关联

1
git branch --set-upstream <branch-name> <origin/branch-name>git branch --set-upstream-to=origin/<branch-name> <branch-name>

18、git rebase可以将push的分叉历史整理成直线,直接上图,与上面的merge对比更直观

图片

19、Git可以打标签,使用git tag可以查看已有的标签,Git一共有两种标签:轻量标签与附注标签,轻量标签就像一个永远不会改变的分支,附注标签是一个存储在Git数据库中的完整对象,命令附加-d代表删除,标签同样可以通过git push origin <tag-name / –tags>的方法推送到远程

附注标签:

1
git tag -a <tag-name> -m "标签信息"    

轻量标签:

1
git tag <tag-name / commit id>

学习网站

https://learngitbranching.js.org/?locale=zh_CN

廖雪峰git教程

工具推荐

  1. sourceTree
  2. Fork
  3. WebStorm内部git插件
  4. vscode插件