Git安装
Git 是一个分布式版本控制及源代码管理工具。Git 可以为你的项目保存若干快照,以此来对整个项目进行版本管理。
windows安装
进入网站git-scm.com/下载安装程序。
安装过程中一路默认,直至安装完成。安装完成后,Git会自动添加到系统路径中。此时在桌面右键选项会出现Git GUI Here和Git Bash Here两个选项。
- Git GUI Here是可视化操作工具
- Git Bash Here是Git配套的控制台
Linux安装
在Ubuntu系统上直接使用apt命令进行安装,如:sudo apt install git。安装路径在/usr路径下。安装完成后使用git --version命令查看git版本。
Git使用
Git安装完成后,需要配置用户名和邮箱,记录开发者的信息。
# 配置自己的姓名
git config --global user.name "Your Name"
# 配置自己的邮箱
git config --global user.email "email@example.com"
上面的两个命令只需要运行一次即可, 如果输入错误, 重新运行命令即可。可以使用 git config -l 命令来查看配置信息。
然后创建自己的本地仓库:
- 创建一个新的文件夹;
- 进入文件夹,右键,点击Git Bash Here 启动命令行;
- 在命令行中输入
git init,对仓库进行初始化;
#一个仓库只运行一次git init
git init
- 创建一个初始化文件 index.html;
- 将文件加入到暂存区;
git add index.html
- 提交到仓库;
git commit -m '文字说明'
Git的常用命令
| 命令 | 作用 |
|---|---|
| git status | 查看版本库状态 |
| git add . | 添加所有修改到暂存区 git add -A / --all / * |
| git ls-files | 查看暂存区文件 |
| git rm --cached | 移除暂存区文件 |
| git commit -m 注释 | 建立存档并添加注释 |
| git restore . | 恢复工作区的内容 |
| git diff | 查看工作区与暂存区的差异(不显示新增文件) |
| git diff --cached | 查看暂存区与仓库的差异 |
Git的理论基础
Git记录的是各个版本的代码文件,当版本的文件发生变动时,Git会复制整个文件并保存。这种设计有益于分支管理。
本地仓库有 Git 维护的三棵“树”组成,这是 Git 的核心框架。这三棵树分别是:工作区域、暂存区域和 Git 仓库
- 工作区域(Working Directory)就是你平时存放项目代码的地方。
- 暂存区域(Stage)用于临时存放你的改动,事实上它只是一个文件,保存即将提交的文件列表信息。
- Git 仓库(Repository)就是安全存放数据的位置,这里边有你提交的所有版本的数据。其中,HEAD 指向最新放入仓库的版本(这第三棵树,确切的说,应该是 Git 仓库中 HEAD 指向的版本)。
Git 的工作流程一般是:
- 在工作目录中添加、修改文件;
- 将需要进行版本管理的文件放入暂存区域;
- 将暂存区域的文件提交到 Git 仓库。
因此,Git 管理的文件有三种状态:已修改(modified)、已暂存(staged)和已提交(committed),依次对应上边的每一个流程。
Git协同开发
有一个项目由好几个人共同开发,组长把底层代码提交到远程仓库中,开发者把代码clone到自己的本地进行编写自己负责的功能,写完就推到远程仓库中这就是协同开发。
一般协同步骤如下:
-
Leader 本地新建项目,基本架构代码开发,然后推送到本地仓库。(如前文的Git使用步骤)
-
Leader 在GitHub上创建组织,邀请成员加入组织(成员需要各自提前注册GitHub账户)
- 首先在GitHub右上角点击“New organization”创建组织;
- 创建组织完成后,可以为组织邀请成员(右边的invite someone按钮)
-
Leader 在组织上创建仓库, 然后推送本地代码到远程仓库, 并打上Tag(v1)
- 接着点击“Create a new repository” 创建仓库;
- 填写同本地仓库中同样的项目名称和其他信息,点击“Create repository” 创建仓库;
- 再根据显示的命令和远程地址, 把本地仓库的代码推送到这个仓库;
- 通过
git log可以看到当前代码的版本信息,再通过git tag -a v1 -m '第一版‘给特定版本号打上标签。 - 然后再通过
git push origin --tags将打上版本号tag的代码推送到远程仓库。
-
Leader 从master分支创建出dev分支用于开发的主分支,并推送到远程仓库。
- 通过
git branch查看当前代码存在的分支,再使用git checkout -b dev生成名为dev的分支; - 再通过
git push origin dev将分支推送到远程仓库。
- 通过
-
开发人员注册GitHub账户,然后Leader 将开发人员邀请进组织。
-
Leader 为成员设置组织权限和项目权限。
-
Leader 把项目远程地址发给开发人员,开发人员克隆代码到自己本地。
-
开发人员从dev分支拉出新的分支进行开发。
-
开发完成后,把代码提交到远程仓库,然后向Leader发起代码review,申请合并分支到dev分支。
-
Leader 进行代码review,确认后合并代码到dev分支。
-
Leader 拉出个分支Release用于上线前的测试(常叫UAT,或者Pre-Prod),如果测试出现bug,则再拉出个bug分支进行修复bug,然后再合并回release和dev分支,测试完成后release和bug分支都可以删除。
-
最后没问题后准备上线,这时可以把稳定的版本再打Tag(v2),把dev分支申请合并到master分支上线(Prod),这一步也可以采用代码review的方式合并,也可以不用。
常见问题
- 推送或克隆github代码时报SSL错误:
fatal: unable to access 'https://github.com/xxx/demo.git/': SSL certificate problem: unable to get local issuer certificate
解决方法:
git config --global http.sslVerify false
- pull 冲突
用git pull来更新代码的时候,遇到了下面的问题:
error: Your local changes to the following files would be overwritten by merge: Please, commit your changes or stash them before you can merge
出现这个问题的原因是其他人修改了某文件并提交到版本库中去了,而你本地也修改了某文件,这时候你进行git pull操作就好出现冲突了。
解决方法有三种:
-
先commit再pull最后再push。commit 是为了告诉 git 我这次提交改了哪些东西,不然你只是改了但是 git 不知道你改了,也就无从判断比较;pull是为了本地 commit 和远程commit 的对比记录,git 是按照文件的行数操作进行对比的,如果同时操作了某文件的同一行那么就会产生冲突,git 也会把这个冲突给标记出来,这个时候就需要先把和你冲突的那个人拉过来问问保留谁的代码,然后再 git add && git commit && git pull 这三连;再次 pull 一次是为了防止再你们协商的时候另一个人给又提交了一版东西,如果真发生了,那流程重复一遍,通常没有冲突的时候就直接给你合并了,不会把你的代码给覆盖掉。
-
忽略本地修改,强制拉取远程到本地,主要是项目中的文档目录,看的时候可能多了些标注,现在远程文档更新,本地的版本已无用,可以强拉 .
# Git fetch:Git fetch会将数据拉取到本地仓库 - 它并不会自动合并或修改当前的工作
git fetch --all
# master为远程分支名称,若远程分支为haha,则 origin/haha 即可
# 抛开我所有的暂存和未分离的更改,忘记当前本地分支上的所有内容,并使其完全相同作为 origin/master或 origin/haha
git reset --hard origin/master
# git pull是从远程获取最新版本并merge到本地,会自动合并或修改当前的工作。
git pull
- 保留本地的方式修改
通过git stash将工作区恢复到上次提交的内容,同时备份本地所做的修改,之后就可以正常git pull了,git pull完成后,执行git stash pop将之前本地做的修改应用到当前工作区。
# 备份当前的工作区的内容,从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一致。同时,将当前的工作区内容保存到Git栈中
git stash
# 拉取服务器上的代码
git pull
# 从Git栈中读取最近一次保存的内容,恢复工作区的相关内容。由于可能存在多个Stash的内容,所以用栈来管理,pop会从最近的一个stash中读取内容并恢复
git stash pop