1 Git简介
官网地址:https://git-scm.com/
版本控制工具:协同修改、数据备份、版本管理、权限控制、历史记录、分支管理。
集中式版本控制工具:SVN、VSS
分布式版本控制工具:Git
2 Git的安装
下载地址:Git-2.23.0-64-bit.exe
https://git-for-windows.github.io/ https://git-scm.com/download https://git-scm.com/ Idea插件
安装过程中几个重要的步骤:
①Git Bash需要安装的,其他默认即可,下一步
②默认编辑器
③选择Git命令的执行环境
这里推荐选择第一个,就是单独用户Git自己的命令行窗口
不推荐和windows的命令行窗口混用
④HTTPS传输:使用SSL传输协议
⑤Configuring the line ending conversions选项
第一个选项:如果是跨平台项目,在windows系统安装
第二个选项:如果是跨平台项目,在Unix系统安装
第三个选项:非跨平台项目
⑥terminal emulator选项
第一个选项:使用专用的Git窗口(推荐)
第二个选项:使用windows的cmd命令行窗口。
⑦ 在Configuring extra选项中,默认开启文件缓存即可(推荐)
3 Git的结构
3.1 Git结构
工作区
--git add [filename]–> 暂存区
–git commit [filename]–>本地库
写代码
----> 临时存储
---->历史版本
-
工作区(Working Directory):就是你电脑本地硬盘目录
-
版本库(Repository):工作区有个隐藏目录.git,它就是Git的本地版本库
- 暂存区:存放在git目录下的index文件中(.git/index)中;add后放到暂存区
-
本地库:commit提交到的地方。
3.2 Git和代码托管中心
4 Git命令行操作
4.1 本地初始化
-
git init
4.2 设置签名
级别的优先级:就近原则,项目级别优先级优先于系统级别优先级。
- 二者都有时,采用项目级别的签名。
- 如果只有系统级别的优先级,以系统级别的优先级为准。
- 二者都没有,不允许。
①项目级别签名
- git config user.name 项目级别用户名
- git config user.email 项目级别用户的邮箱
$ git config user.name 'Tom'
$ git config user.email 'codeTom@aliyun.com'
可以在.git/config中查看当前项目的配置信息
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
symlinks = false
ignorecase = true
[user]
name = Tom
email = codejiwei@aliyun.com
②系统级别签名
- git config --global user.name 系统级别用户名
- git config --global user.email 系统级别用户的邮箱
$ git config --global user.name 'Jerry'
$ git config --global user.email 'Jerry@gmail.com'
可以在C:\Users\16222 \ .gitconfig文件查看
[user]
name = Jerry
email = codeJerry@aliyun.com
4.3 基本操作
①状态查看
git status 查看工作区和暂存区状态
$ git status
②添加到暂存区
git add [file name] 将工作区的“新建、修改操作的文件”添加到暂存区
$ git add src/emp.java
③提交到本地库
将暂存区的内容提交到本地库
- git commit [file name] 然后进入vim编辑器编辑日志信息
- git commit -m “commit message” [file name]
$ git commit src/emp.java -m "create emp.java"
④查看历史记录
- git log
$ git log
- git log --pretty=oneline
$ git log --pretty=oneline
- git log --oneline
$ git log --oneline
-
git reflog
记录操作日志,操作日志会保留版本号的前7位
$ git reflog
⑤前进后退
-
基于索引值操作(推荐)
- git reset --hard [局部索引值]
$ git reset 36f9c96 Unstaged changes after reset: D src/student
-
使用^符号:只能后退
- git reset --hard HEAD^
- 注意:一个^表示后退一步
$ git reset --hard HEAD^ HEAD is now at 7b79034 update 333
-
使用~符号:只能后退
- git reset --hard HEAD~n
- 注意:表示后退n步
$ git reset --hard HEAD~2 HEAD is now at 36f9c96 update 222
reset 的三个参数对比
–soft
–mixed
–hard
后退n步,如果会有新的内容文件生成,那么在退回到新文件生成前,那么这个新文件会删除!如果再回到最新版本新文件会重新回来。
-
git reset --hard [指针位置]
先使用reflog查看操作日志,找到最开始的指针位置,然后git reset --hard
⑥撤销
1 撤销是在没有add和commit的情况下!!!
$ git checkout -- src/emp.java
2 那么如果add了之后怎么撤销呢?
# 首先查看修改之后的状态:
$ git status
# 然后add
$ git add huashan/
# 再查看状态:
$ git status
开始撤销~
$ git reset HEAD huashan/
# 这个时候查看状态,又变成了红色的,修改之后的状态了
# 然后撤销
$ git checkout -- src/student.java
# 这个时候就撤销了
3 那么已经commit提交了的呢?
这个时候就得需要需要通过版本的后退,撤销了
git reset --hard HEAD^
⑦删除
$ rm src/student
$ git reset --hard HEAD^
⑧比较文件差异
- git diff [file name] 将工作区的文件与暂存区的文件进行比较
- git diff [本地库中历史版本] [文件名] 将工作区中的文件与本地库历史版本文件比较
- 不带文件名比较多个文件
4.4 分支管理
①分支概念
②分支操作
-
创建分支:git branch [分支名]
$ git branch dev
-
查看分支:git branch -v
$ git branch -v
$ git branch
-
切换分支:git checkout [分支名]
$ git checkout dev Switched to branch 'dev'
-
合并分支:
--1 在dev分支上修改文件student --2 提交文件student --3 切回master分支,看不到我们刚修改的内容。git checkout master --4 合并分支。git merge dev
- 第一步:切换到被合并分支:git checkout [被合并的分支名]
- 第二步:git merge [有新内容分支名]
-
合并分支的同时新建新的分支
$ git checkout -b dev2
-
删除分支
$ git branch -d dev2 Deleted branch dev2 (was 92f0d56).
4.5 合并冲突
冲突一般指同一个文件同一个位置的代码,在两个版本合并时版本管理软件无法判断到底应该保留哪一个版本,因此会提示该文件发生冲突,需要程序员手动判断解决冲突。
步骤1:切换到dev分支
git checkout dev
步骤2:修改内容,添加,提交
git add src/student.java
git commit -m "dev update student.java"
步骤3:切换到master分支
git checkout master
步骤4:修改相同文件相同位置。添加,提交
git add src/student.java
git commit -m "master update student.java"
步骤5:把dev分支合并到master分支
git meger dev
步骤6:查看文件,解决冲突
步骤7:查看状态
git status
步骤8:添加提交
git add src/student.java
git commit -m "merged"
5 GitHub
5.1 创建GitHub账户
-
第一步:注册,登录
-
第二步:创建一个新的远程仓库
设置远程库的名称
5.2 创建远程库地址别名
-
git remote add [别名] [远程地址]
$ git remote add test https://github.com/codejiwei/test01.git
-
git remote -v 查看所有远程地址别名
$ git remote -v # 方式2 $ git remote
5.3 推送到远程库
git push [别名] [分支名]
git push test master
5.4 克隆
项目经理创建的远程GitHub库,对于刚上班的程序猿,会把远程库的url地址发给程序猿。然后程序猿用这个url,使用git clone 的方式克隆到本地。
克隆不需要密码是因为远程库是public项目
git clone [远程地址]
$ git clone https://github.com/codejiwei/huashan.git
克隆clone执行完之后,会自动创建为这个远端地址建一个origion的代号!!!
不然的话,还得问原来项目的作者,这个远端的代码是什么吗???
5.5 权限不足问题
我们一般是不能直接push到远程库的,需要项目经理,把程序猿拉入到合作伙伴才能push。
添加到合作伙伴的方式:
发送添加到合作伙伴的申请者的邮箱后,还需程序猿接受该申请,这个时候就可以push代码了。
5.5 拉取
从GitHub更新项目
pull = fetch + merge
git fetch [远程库地址别名] [远程分支名]
git merge [远程库地址别名/远程分支名]
git pull [远程库地址别名] [远程分支名]
git pull origin master
5.6 协助冲突
上面的冲突是分支间的冲突!这里的冲突是程序猿和程序猿间的冲突
上传代码push的时候,由于成员A和成员B修改了同一个文件中相同位置的代码。先提交的可以提交成功,但是后提交push的时候就会报错!会报一个版本较低的错误!
解决方法:
步骤1:先pull拉取最新的代码,也就是成员A刚提交的代码
步骤2:然后解决冲突
步骤3:add、commit到本地库
步骤4:push到远程库
5.7 Fork
程序猿A不能完成任务,找了一个大神程序猿B来帮忙,这个时候项目经理允许之后,会同意大神B Fork一份项目,然后程序猿B会clone一份到本地。然后修改后push到自己的远程库。然后回pull request给项目经理,项目经理看到后可以在GitHub上merge。
6 IDEA Git操作
6.1 配置IDEA
6.2 共享项目
步骤1:通过share subject把整个项目传入GitHub中
步骤2:使用token令牌登录GitHub
步骤3:新建仓库
步骤4 把选中的代码纳入暂存区,提交本地库(git add、commit)
主要的文件:java文件,pom文件,properties配置文件
idea自动生成的文件一般不要上传。
6.3 手动提交
步骤1:编写代码
步骤2:add和commit
步骤3:push到远程GitHub
步骤4:这个时候就已将提交到GitHub上了
6.4 从远程库Clone
步骤1 通过clone导入远端项目
步骤2:填写远端地址
步骤3:修改代码然后提交
步骤4:推送到GitHub
6.5 与远程库Pull及解决冲突
当出现了冲突怎么解决呢?
步骤1:在[yuebuqun777888]的模块中修改与[linghuchong777888]相同位置的代码
步骤2: 进行之间做过的Commit和Push
步骤3:因为两个人都是提交相同位置的代码
IDEA会弹出如下提示
我们选择Merge操作,把冲突的部分进行手工合并。
三个选择:
-
Accept Yours 接受自己的版本,覆盖掉别人和你冲突的部分(危)
-
Accept Theirs 接受别人的版本,覆盖掉你和别人冲突的部分(危)
-
Merge 手工合并
步骤4:手工合并
合并完成后,会自动提交到本地库
步骤5:合并完成后再次手工push远端
6.6 文件状态
- 红色:未提交的文件(本地库中不存在)
- 绿色:未提交的文件,但是add到了暂存区(本地库中没有,暂存区中有)
- 蓝色:提交过,但是有做过修改(本地库中存在)
- 黑色:提交过本地库,且之后没有再修改还过(本地库中存在)
7 Git工作流
7.1 分支种类
①主干分支master
主要负责管理正在进行的生产环境代码。永远保持正在运行的生产环境完全一致。
②开发分支develop
主要负责管理正在开发过程中的代码。一般情况下应该是最新的代码。
③bug修理分支hotfix
要负责管理生产环境下出现的紧急修复的代码。从主干分支分出,修理完毕并测试上线后,并回主干分支。并回后,视情况可以删除该分支。
④发布版本分支release
较大的版本上线前,会从开发分支中分出发布版本分支,进行最后阶段的集成测试。该版本上线后,会合并到主干分支。生产环境运行一段阶段较稳定后可以视情况删除。
⑤功能分支feature
为了不影响较短周期的开发工作,一般把中长期开发模块,会从开发分支中独立出来。 开发完成后会合并到开发分支。
7.2 分支操作
步骤1 建立新的分支
步骤2:在这个分支下添加新代码
步骤3:提交代码,并push到远程库
步骤4:在GitHub上可以看到新的分支