前言
Git是目前非常流行的协同开发工具,很多开源网站都使用Git作为代码管理仓库(例如 开源中国,GitHub),不管是开发还是产品、设计师,Git都很适合,而且很多IDE默认集成了Git,熟练的使用Git会起到事半功倍的效果,所以今天我为大家分享一下Git的介绍与使用。
1.Git是什么?
Git是目前世界上最先进的分布式版本控制系统(没有之一)。
1.1什么是版本控制?
版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。如果你是位网页设计师,可能会需要保存某一幅图片或页面布局文件的所有修订版本。 有了它你就可以将某个文件回溯到之前的状态,甚至将整个项目都回退到过去某个时间点的状态,你也可以比较文件的变化细节,查出最后是谁修改了哪个地方,从而找出导致怪异问题出现的原因,又是谁在何时报告了某个功能缺陷等等。 使用版本控制系统通常还意味着,就算你乱来一气把整个项目中的文件改的改删的删,你也照样可以轻松恢复到原先的样子。 但额外增加的工作量却微乎其微。
1.1.1集中化的版本控制系统,代表SVN
缺点:
1、依赖中央服务器。 如果宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。
2、如果中心数据库所在的磁盘发生损坏,又没有做恰当备份,将丢失所有数据——包括项目的整个变更历史,只剩下人们在各自机器上保留的单独快照。
3、整个项目的历史记录被保存在单一位置,就有丢失所有历史更新记录的风险
4、必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,效率就很低了。
1.1.2分布式版本控制系统,代表Git
没有中央服务器,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。举个例子,要浏览项目的历史,Git 不需外连到服务器去获取历史,然后再显示出来——它只需直接从本地数据库中读取。 你能立即看到项目历史。 如果你想查看当前版本与一个月前的版本之间引入的修改,Git 会查找到一个月前的文件做一次本地的差异计算,而不是由远程服务器处理或从远程服务器拉回旧版本文件再来本地处理。
2.安装、配置Git
2.1GUI可视化界面推荐
1.GitForWindows https://gitforwindows.org/
自带GIT BASH和GIT GUI
2.TortoiseGit https://tortoisegit.org/download/
3.SourceTree https://www.sourcetreeapp.com/
2.2配置用户信息
$ git config --global user.name "shang" $ git config --global user.email user@example.com
2.3Git文件的三种状态
在 Git 内都只有三种状态:已修改(modified)、已暂存(staged)和已提交(committed)。已修改表示修改了某个文件,但还没有提交保存;已暂存表示把已修改的文件放在下次提交时要保存的清单中;已提交表示该文件已经被安全地保存在本地数据库中了;
3.获取 Git 仓库
有两种取得 Git 项目仓库的方法。
第一种是在现有项目导入所有文件到 Git 中。
第二种是从一个服务器克隆一个现有的 Git 仓库。
3.1在现有目录中初始化仓库
如果你打算使用 Git 来对现有的项目进行管理,你只需要进入该项目目录并输入。
$git init
//初始化项目,将创建一个名为 .git 的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件
$git add . //将所有文件添加到暂存区,或者git add *
$git commit -m "first commit" //提交到本地仓库
$git remote add origin user@example.com:lingdianguole/spring-boot-practice.git //将本地仓库关联到远程
$git push -u origin master //提交到远程master
3.2克隆远程仓库
如果你想获得一份已经存在了的 Git 仓库的拷贝
$git clone [url]
eg:
$git clone https://gitee.com/chengdu_shangshang/mz7t_manage.git
3.3 记录每次更新到仓库
git status 检查当前文件状态
如果
$ git status On branch master nothing to commit, working directory clean
//说明你现在的工作目录相当干净。换句话说,所有已跟踪文件在上次提交后都未被更改过
如果
$ git status On branch master Untracked files: (use "git add
//说明新建的 README 文件出现在 Untracked files 下面,还未追踪
如果
$ git status On branch master Changes to be committed: (use "git reset HEAD
//说明是已暂存状态,如果此时提交,那么该文件此时此刻的版本将被留存在历史记录中
3.4 撤消操作
3.4.1取消暂存的文件
git reset HEAD README //将README移除暂存
3.4.2撤消对文件的修改
$ git status
Changes not staged for commit: (use "git add
(use "git checkout --
所以
git checkout -- README.md //撤销README.md中的改动
3.5提交更新(commit)
git commit -m 'message' //提交到本地仓库
建议每次修改后提交,要对比修改的地方,代码重新检查,避免修改问题引发新的问题
3.6撤销提交(reset)
当发现这一次commit的内容是有错误的,有两种处理方法:
1、修改错误内容,再次commit一次
2、使用git reset 命令撤销这一次错误的commit
第一种方法比较直接,但会多次一次commit记录,而且有可能改错
推荐第二种方法,因为错误的commit没必要保留下来,还原到上一次也能保证正常工作
git commit提交后的结果
重置有三种模式:soft,mixed,hard
git reset --hard HEAD 重置stage区和工作目录,就是没有commit的修改会被全部擦掉,适用于重新理清思路
git reset --hard HEAD
将你的 HEAD 和当前 branch 切到上一条commit 的同时,你工作目录里的新改动和已经add到stage区的新改动也一起全都消失了
git reset --soft 保留工作目录,并把重置 HEAD 所带来的新的差异放进暂存区
将 HEAD 和 branch 往回移动,就能起到撤回 commit 的效果。
reset 如果不加参数,那么默认使用 --mixed 参数,它的行为是:
保留工作目录,并且清空暂存区,
git reset HEAD^ //以mixed回退到上一个版本
由 reset 所导致的新的文件差异,都会被放进工作目录,相当于回到了git add以前
总之,以--hard回退,相当于丢弃新改动,以--soft回退相当于将新改动放入暂存区,以--mixed回退,相当于不关联新改动,但改动还在
git reset --hard + 分支// 回退到其他分支
git reset --hard origin 分支// 回退到远程分支
记住,在 Git 中任何 已提交的 东西几乎总是可以恢复的。 然而,任何你未提交的东西丢失后很可能再也找不到了,所以,经常commit、经常push
4.Git 分支管理(branch)
使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作
4.1本地分支
git branch 分支名 //创建分支
git checkout 分支名 //切换分支命令
git merge 分支名 //将其他分支合并到当前分支,合并后注意解决冲突
git branch //列出你在本地的分支
git branch -a //列出你在本地和远程的分支
git branch -d 分支名 //删除分支
4.2远程分支
git remote add 分支名 仓库地址 // 添加一个新的远程 Git 仓库
git fetch 远程分支 //从远程仓库中获得数据
git push origin master //将master推送到远程仓库
git remote rename test1 test2 //将 test1 重命名为 test2
git remote rm test//移除远程分支test
注意:
1、多人协同开发需要先执行 git pull拉取远程的改动,然后再push,如果拉下来代码有冲突,则需要先修改冲突再提交
2、本地至少两个分支,master和develop,master负责线上版本,develop负责开发版本,如果有支线业务,则新建分支,保证不影响主业务。每次发版后将develop中的代码合并到maser,保证master稳定
5.打标签(tag)
通常,发布一个版本时,会在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照
git tag v1.0.0 //创建轻量标签v1.0.0
git tag -a v1.0.0 -m ’my version 1.0.0‘ //创建附注标签
git tag //列出标签
git push --tags //推到远端
git tag -d 1.0.0 //删除本地tag
注意:tag 相当于是一个快照,是不能更改它的代码的,如果要在 tag 代码的基础上做修改,你需要一个分支:
git checkout -b branch_name tag_name //将tag拷贝到新分支上修改
建议:在每次发版后当标签,方便后面线上有问题能及时修改
6.储藏(stash)
当修改了代码后发现自己改错分支了。或者,不想将修改的东西提交上去,则可以储藏起来,到合适时候恢复
git stash //会把所有未提交的修改(包括暂存的和非暂存的)都保存起来,用于后续恢复当前工作目录,当前的工作目录就干净了。
git stash pop //重新应用缓存的stash,将缓存堆栈中的第一个stash删除,慎用
git stash apply //将缓存堆栈中的stash多次应用到工作目录中,但并不删除stash拷贝
git stash list //查看现有stash
git stash drop+名字(user@example.com) //移除stash
git stash clear //删除所有缓存的stash