赞
踩
目录
版本控制是一种记录文件内容变化,以便将来查阅特定版本修订情况的系统。
版本控制其实最重要的是可以记录文件修改历史记录,从而让用户能够查看历史版本,方便版本切换。无论对于个人、团队开发,版本控制都很有必要。
这种原始的版本管理系统很显然有明显的缺陷:
为了有效的解决版本控制问题,版本控制系统应运而生
版本控制系统的作用
1. 本地版本控制系统
记录文件每次的更新,可以对每个版本做一个快照,或是记录补丁文件,适合个人用,如RCS。
缺点:
2. 集中版本控制系统 (SVN)
集中化的版本控制系统诸如 CVS、SVN等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。多年以来,这已成为版本控制系统的标准做法。
缺点:
3. 分布式版本控制系统 (Git)
除需一个版本控制服务器作为远程仓库存储历史版本记录外,服务器的所有版本信息全部同步到每个用户机器的本地库上,比如GIT、Mercurial、Bazaar、Darcs等。
这样就可以在本地查看所有版本历史,可以离线在本地提交,在连网时再提交到远程库中。
优点:
Git是目前世界上最先进的分布式版本控制系统。Linus:Liunx的作者
Git本地工作机制
1. Git代码托管中心 (远程库)
代码托管中心是基于网络服务器的远程代码仓库,一般我们简单称为远程库。
2. Git安装
官网:Git
下载地址:Git for Windows
Git Bash终端里输入git --version查看git版本,如图所示,说明Git安装成功。
3. 工作区、版本库、暂存区概念
命令名称 | 作用 |
git config user.name | 查看设置的用户名 |
git config [--global user.name] 用户名 | 设置用户签名 (修改用户名) |
git config [--global user.email] 邮箱 | 设置用户签名 |
git init | 初始化本地库 |
git status -s(更简洁) | 查看工作区和暂存区状态 |
git add 文件名 | 添加到暂存区 |
git commit -m "日志信息" 文件名 | 提交到本地库 |
git commit -am "注释内容(日志)" | add 和 commit 同时进行操作同时同时进行 (新增文件不可以) |
git reflog [文件名] | 查看历史版本信息 (显示本地库操作历史记录 如 commit、reset、delete) |
git log [文件名] [--pretty=oneline] | 查看版本详细信息 (只显示本地库commit的历史记录) |
git log a.txt | 查看某个文件日志 |
git reset --hard 版本号 | 版本穿梭 (硬回退) |
git reset --hard HEAD~* | 回退 * 个版本 0 |
分支命令↓ | 作用 |
git branch 分支名 | 创建分支 |
git branch -v | 查看分支 |
git switch分支名 (git checkout分支名 <=git2.22 ) | 切换分支 |
git merge 分支名 | 把指定的分支合并到当前分支上 |
git branch -d 分支名 | 删除分支(内容已经完成合并) |
git branch -D 分支名 | 强制删除分支(有没有合并的内容) |
Github/Gitee 命令 | 作用 |
git remote -v | 查看当前所有远程地址别名 |
git remote add 别名 远程地址 | 起别名 |
git clone 远程地址 [文件夹名] | 将远程仓库的内容克隆到本地 |
git push 别名 分支 | 推送本地分支上的内容到远程仓库 |
git pull 远程库地址别名 [远程分支名] | 将远程仓库对于分支最新内容拉下来后与当前本地分支直接合并 |
1、设置用户签名 (修改用户名)
git config user.name 查看用户名 git config --global user.name 用户名 git config --global user.email 邮箱 |
签名的作用是区分不同操作者身份,Git首次安装必须设置用户签名,否则无法提交代码。
--global 表示全局属性,所有的git项目都会共用属性
- 查看配置信息:git config --list
- 在当前登录的系统用户路径下,生成~/.gitconfig文件,里面可以看到刚刚设置的信息。如果不用命令设置,也可以直接打开文件进行设置。
※注意:这里设置用户签名和将来登录GitHub (或其他代码托管中心) 的账号没有任何关系。
2、初始化本地库 (git init)
结果查看:ll -a
提交Git本地版本库分两步执行
第一步 用“git add”把文件纳入Git管理,实际是把本地文件修改添加到暂存区
第二步 用“git commit”提交更改,实际上就是把暂存区的所有内容提交到当前分支,
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以commit就是往master分支上提交更改。
可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。一旦提交完后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的。即:nothing to commit (working directory clean)。
3、查看本地库状态 (git status)
首次查看,无文件
新建文件,再次查看
git status –s 使输出信息更加简洁。?? : 表示未跟踪状态
Git工作目录下的文件状态信息:
- §Untracked 未跟踪(未被纳入版本控制)
- §Tracked 已跟踪(被纳入版本控制)
- §Unmodified 未修改状态
- §Modified 已修改状态
- §Staged 已暂存状态
这些文件的状态会随着我们执行Git的命令发生变化
- 红色 表示新建文件或者新修改的文件,都在工作区,未添加到暂存区
- 绿色 表示文件在暂存区
可以使用git status –s 使输出信息更加简洁。?? : 表示未跟踪状态
4、添加(状态)到暂存区 (git add 文件名)
git add . 表示添加项目中所有文件到暂存区
5、提交本地库 (git commit -m "日志信息" 文件名)
commit 会生成一条版本记录,add只是添加暂存区,不会生成版本记录,建议多次add后,一次性commit,避免每次add都commit产生版本信息爆炸。
6、修改文件(hello.txt)
7、将修改的文件再次添加暂存区
git commit -am "注释内容" 简化,am表示 add 和 commit 操作同时同时进行(新增文件不可以!)
8、历史版本 (git reflog | git log)
status显示的是暂存区和工作区的状态、历史版本查看的是本地库的
git reflog [文件名] 查看版本信息(显示本地库所有操作的历史记录,比如commit、reset)
git log 查看版本详细信息(只显示本地库commit的历史记录)
9、版本穿梭 (git reset --hard)
git reset --hard 版本号
git reset --hard 版本号
git reset --hard HEAD^ 一次回退一个版本,一个^代表一个版本
git reset --hard HEAD~2 同上,2表示回退2个版本
三种情况下的回退操作:
未add,未commit (修改无效,回退到最后一次提交的数据)
git checkout-- a.txt 撤销修改(还原原来的文件) <=Git 2.22
git restore -- a.txt 撤销修改(还原原来的文件) >=Git2.23
注意:-- 可以省略 但不可以--a.txt 空格不可少
已add,未commit 软回退 (只是将文件的状态进行了回退)
git add a.txt
git reset a.txt 软回退:
git reset 软回退:
已add,已commit 硬回退 (回退到指定版本,内容变化)
git reset --hard 版本号
git reset --hard HEAD^ 一次回退一个版本,一个^代表一个版本
git reset --hard HEAD~n 回退n次操作
10、删除文件 (文件删除也可以回退)
- 手动拷贝图片java.jpg到工作空间目录,并查看目录列表:ls -l
- 添加:git add java.jpg
- 提交:git commit -m "新建图片" java.jpg
- 删除图片:rm java.jpg
- 添加:git add java.jpg
- 提交:git commit -m "删除图片"
- 回退:git reset --hard HEAD^
- 文件不是被删除了吗?怎么又回来啦!呵呵…
- 处处留痕:git reflog
注意:rm java.jpg 的作用是删除工作区的文件,暂存区不知道;
git add java.jpg,将工作区对java.jpg的删除告诉暂存区。
git commit -m "删除图片" 将删除java.jpg告诉本地库
其中前两步可以简化为 git rm java.jpg ( 从工作区和暂存区删除文件Remove files from the working tree and from the index)
或者后两步可以简化为 git commit -am "删除图片"
删除的图片回来了
在版本控制过程中,同时推进多个任务,为每个任务,我们就可以创建每个任务的单独分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主线分支的运行。对于初学者而言,分支可以简单理解为副本,一个分支就是一个单独的副本。(分支底层其实也是指针的引用)
分支的好处
同时并行推进多个功能开发,提高开发效率。
各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可。
命令名称 | 作用 |
git branch 分支名 | 创建分支 |
git branch -v | 查看分支 |
git switch分支名 (git checkout分支名 <=git2.22 ) | 切换分支 |
git merge 分支名 | 把指定的分支合并到当前分支上 |
git branch -d 分支名 | 删除分支(内容已经完成合并) |
git branch -D 分支名 | 强制删除分支(有没有合并的内容) |
git checkout 的核心功能包括两个方面,一个是分支的管理,一个是文件的恢复。对用户造成了很大的认知负担。这两个核心功能,git checkout 将逐渐退出历史舞台,未来将由 git switch 和 git restore 分别负责。
注意:如果没有代码没有提交,即保留在工作区(当前项目),切换到别的分支也能看到!
切换分之前一定先进行提交!!!
1、查看分支
2、创建分支
3、修改分支
4、冲突
注意:冲突中无法切换其他分支,必须先提交解决冲突
5、解决冲突:修改并提交
前面我们已经知道了Git中存在两种类型的仓库,即本地仓库和远程仓库。那么我们如何搭建Git远程仓库呢?我们可以借助互联网上提供的一些代码托管服务来实现,其中比较常用的有GitHub、码云、GitLab等。
是一个面向开源及私有软件项目的托管平台,因为只支持Git 作为唯一的版本库格式进行托管,故名gitHub
是国内的一个代码托管平台,由于服务器在国内,所以相比GitHub,码云速度会更快
是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务
众所周知,GitHub服务器在国外,使用GitHub作为项目托管网站,如果网速不好的话,严重影响使用体验,甚至会出现登录不上的情况。针对这个情况,大家也可以使用国内的项目托管网站-码云。
码云是开源中国推出的基于Git的代码托管服务中心,网址是https://gitee.com/ ,使用方式跟GitHub一样,还是一个中文网站,如果你英文不是很好它是最好的选择。
官网:Gitee - 基于 Git 的代码托管和研发协作平台
第一次时使用clone,之后使用pull。
命令名称 | 作用 |
git remote -v | 查看当前所有远程地址别名 |
git remote add 别名 远程地址 | 起别名 |
git clone 远程地址 | 将远程仓库的内容克隆到本地 |
git push 别名 分支 | 推送本地分支上的内容到远程仓库 |
git pull 远程库地址别名 远程分支名 | 将远程仓库对于分支最新内容拉下来后与当前本地分支直接合并 |
1、创建远程仓库别名
git remote -v 查看当前所有远程地址别名
git remote add [别名] [远程地址] 起别名
2、推送本地分支到远程仓库
3、另一个用户克隆远程仓库到本地
4、修改内容并push到远程仓库
5、zhangsan 拉取远程库内容
在上传或同步代码时,由于你和他人都改了同一文件的同一位置的代码,版本管理软件无法判断究竟以谁为准,就会报告冲突,需要程序员手工解决。
1. 成员1修改文件,提交远程库
2. 成员2修改文件同一行,制造冲突。提交时:
有人提交了代码,需要先更新 (pull)。
更新时,出现了冲突
3. 经过协商,成员2 修改文件,解决冲突
4. 重新提交远程库
5. 成员1 下拉内容,更新代码
如何避免冲突
容易冲突的操作方式
- 多个人同时操作了同一个文件
- 一个人一直写不提交
- 修改之前不更新最新代码 (第二天早上,拉取(poll)代码)
- 提交之前不更新最新代码 (下班,提交(push)代码)
- 擅自修改同事代码
减少冲突的操作方式
- 养成良好的操作习惯,先`pull`在修改,修改完立即`commit`和`push`
- 一定要确保自己正在修改的文件是最新版本的
- 各自开发各自的模块
- 如果要修改公共文件,一定要先确认有没有人正在修改
- 下班前一定要提交代码,上班第一件事拉取最新代码
- 一定不要擅自修改同事的代码
流程:(zhangsan和lisi是一个团队的人,wangwu是另一个团队的人)
第三方账号登录(wangwu),搜索某账号找到某项目(zhangsan),然后点击Fork按钮,这样就将该项目克隆一份到当前账号(wangwu)内,然后进行修改,提交pull request,告诉对方(zhangsan)已经修改了,请求合并;
1、Fork,复制一份到仓库
2、完成功能后,发起Pull请求。
3、领导接收Pull request请求,测试审核
4、合并分支
我们可看到远程仓库中还有一个SSH的地址,因此我们也可以使用SSH进行访问。
使用https url克隆对初学者来说会比较方便,复制https url然后到git Bash里面直接用clone命令克隆到本地就好了,但是每次fetch和push代码都需要输入账号和密码,这也是https方式的麻烦之处。
1、任意文件夹下输入指令
ssh-keygen -t rsa -C a11104255@123.com
注意:这不是 git 的命令
2、默认路径下生成了ssh文件夹,复制公钥内容
3、把公钥添加到个人公钥中
4、使用SSH链接克隆,完成免密登录
1、配置Git忽略文件
a. 在用户家目录下,创建忽略规则文件xxxx.ignore(前缀名随便起,建议是git.ignore)
- # Compiled class file
- *.class
-
- # Log file
- *.log
-
- # BlueJ files
- *.ctxt
-
- # Mobile Tools for Java (J2ME)
- .mtj.tmp/
-
- # Package Files #
- *.jar
- *.war
- *.nar
- *.ear
- *.zip
- *.tar.gz
- *.rar
-
- # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
- hs_err_pid*
-
- .classpath
- .project
- .settings
- target
- .idea
- *.iml
b. 在.gitconfig文件中引用忽略配置文件(此文件在Windows的家目录中)
[user]
name = Layne
email = Layne@atguigu.com
[core]
excludesfile = C:/Users/asus/git.ignore
注意:这里要使用“正斜线(/)”,不要使用“反斜线(\)”
2、初始化本地库
3、添加到暂存区
4、提交到本地库
Perform code analysis:指的是提交前代码分析
Check TODO(Show ALL):如果代码有//TODO 注释,IDEA提交是会提示你是否有完成TODO里的内容。
5、切换版本
6、创建分支
7、切换分支
8、合并分支
注意:如果没有代码没有提交,即保留在工作区(当前项目),切换到别的分支也能看到!
切换分之前一定要进行提交!!!
在master主分支,选择要合并的分支
9、解决冲突
10. 撤销Commit:Undo Commit,Revert Commit,Drop Commit区别
Idea使用 Undo Commit,Revert Commit,Drop Commit区别_会飞的鱼__的博客-CSDN博客_undocommit
Undo Commit
适用情况:代码修改完了,已经Commit了,但是还未push,然后发现还有地方需要修改,但是又不想增加一个新的Commit记录。这时可以进行Undo Commit,修改后再重新Commit。
如果已经进行了Push,线上的Commit记录还是会存在的;撤销了你Commit的这个动作。
Revert Commit
会新建一个 Revert “xxx Commit”的Commit记录,该记录进行的操作是将"xxx Commit"中对代码进行的修改全部撤销掉。
Drop Commit(慎用)
未push的Commit记录:会删除Commit记录,同时Commit中对代码进行的修改也会全部被删除
已push的Commit记录:区别在于线上的Commit记录不会被删除
11. 下拉pull项目后,冲突无法解决、回滚:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。