1. Git简介
1.1 什么是Git
Git是一个分布式的版本控制软件。
- 软件,类似于QQ、office等安装到电脑上才能使用的工具;
- 版本控制,类似于毕业论文,需要反复修改和保留原历史数据;
- 分布式
- 文件夹拷贝
- 本地版本控制
- 集中式版本控制
- 分布式版本控制
1.2 为什么要做版本控制
要保留之前的所有版本,一边回滚和修改。
1.3 安装Git
详见:https://git-scm.com/book/zh/v2/起步-安装-Git
2. Git基本命令
想要让Git对一个目录进行版本控制的步骤:
-
进入要管理的文件夹
-
执行初始化命令
git init
-
管理目录下文件的状态
git status # 新增文件或修改过后的文件为红色
-
管理文件(管理后的文件为绿色)
git add 文件名 # 或者 git add .
-
个人信息配置:用户名、邮箱
git config --global user.email "个人邮箱" git config --global user.name "个人用户名"
-
生成版本
git commit -m "版本描述信息"
-
查看版本记录
git log
-
回滚至之前版本
git log # 查看版本信息,取得版本号 git reset --hard 版本号
-
回滚至之后版本
git reflog # 查看版本信息,取得版本号。由于已经回滚至之前某一版本了,所以需要用到reflog git reset --hard 版本号
3. 引入分支
分支可以给使用者提供多个环境,意味着可以保留主线不动,在分支上修改、新增文件,以免影响主线。
-
查看分支
git branch
-
创建分支
git branch 分支名称
-
切换分支
git checkout 分支名称
-
合并分支
git merge 要合并的分支名称
【注意】合并分支指的是:站在某一分支,将另一分支合并过来;另一分支不会发生改变;也有可能产生冲突。
-
删除分支
git branch -d 分支名称
一般的工作流程是:有一主分支master,存储稳定运行的版本。
当需要开发新功能时,新建立一个develop分支,或者feature分支,独立开发新的功能--->新功能开发完--->通过测试--->确定没问题--->合并到主分支(master)中。
当需要修复bug时,也是:新建立bug分支--->修复漏洞--->通过测试--->确定没问题--->再合并到主分支(master)中。
4. 上传云端
Git是分布式版本控制软件,除了可以在本地做版本控制,也可以有一个云端仓库,这样就可以摆脱地点限制了。
而云端仓库,可以选择官方建立的GIthub,也可以使用国内主流平台Gitee(码云)。
注册账号之后,创建仓库,拿到云端仓库地址。
本地仓库与云端仓库建立关联:
git remote add origin 云端仓库地址
向云端仓库推送代码
git push -u origin 分支名称
在新设备第一次获取云端仓库
git clone 云端仓库地址(内部已实现git remote add origin 云端仓库地址)
往后获取云端代码(获取最新代码,不必再clone,使用pull)
git pull origin 分支名称
【注意】
git pull origin 分支名称
# 相当于
git fetch origin 分支名称
git merge origin/分支名称
5. rebase作用
rebase(变基),可以让提交记录变得简洁,合并分支不分叉。
5.1 减少版本记录
rebase的第一个使用场景,是减少版本记录。比如下面有4个版本记录,如果觉得版本记录太多了,不方便,就可以使用rebase命令,将某些版本记录整合成一个。
git rebase -i e9d937823afe2a50183137084cf43d180a5c34ec
e9d937823afe2a50183137084cf43d180a5c34ec
是第2个版本的版本号。
上式的意思是,将当前所在的版本号(第4版本)与第2个版本号之间的记录进行整合。
也可以这样写:
git rebase -i HEAD~3
表示将最近的三条版本记录进行合并
这时会出现设置界面:
pick e9d9378 2
pick ec38e42 3
pick 73dfd33 4# Rebase 9ad0c8e..73dfd33 onto 9ad0c8e (3 commands)
#
# Commands:
# p, pick= use commit
# r, reword= use commit, but edit the commit message
# e, edit= use commit, but stop for amending
# s, squash= use commit, but meld into previous commit
# f, fixup [-C | -c]= like "squash" but keep only the previous
# commit's log message, unless -C is used, in which case
# keep only this commit's message; -c is same as -C but
# opens the editor
# x, exec= run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop= remove commit
# l, label
将某一些版本前的【动作】设置为 s
,表示将它们合并。
这时,最新的三个版本信息就合并成为一个了。
【注意】如果版本信息已经提交到云端仓库,就不要再合并版本了。不然本地和云端的记录不一样,会出现麻烦。
5.2 减少分叉
如果两个分支各自进行向前开发,最终合并的时候一定会有分叉记录。
可以使用下面的命令查看分叉记录:
git log --graph
更简洁地查看分叉:
git log --graph --pretty:"%h %s"
【h表示版本的哈希值;s表示版本的描述信息】
而rebase可以减少这个分支。
案例:先在dev分支中建立dev.txt;再在master中建立master.txt;
此时如果直接站在master分支上合并dev,则会产生类似上图的分支结构。
如果不想出现这种分支结构,可以这样做:
- 先在dev分支下执行下面的命令:
git rebase master
- 再切换到master分支中,合并dev分支
git checkout master
git merge dev
5.3 减少因云端而产生分叉
这种情景和第二种情景很类似。
某一版本产生两个分支,分别独立进行开发,继而合并到一起。此时会产生分叉。
5.2的情景是在本地中产生的,而加入云端仓库之后,在不同的折本进行开发,会更容易产生分叉。
以前使用的从云端仓库拉代码到本地的命令是:
git pull origin 分支名称
这个命令相当于以下两个命令的集合:
git fetch origin 分支名称
git merge origin 分支名称
本质上就是从云端仓库中复制一条分支下来,并将之合并到本地的分支中。
如果云端的分支被pull到不同的设备,不同的设备独立开发。
那么后面pull代码的一方,就会产生分叉。
如果不想产生分叉的话,可以使用下面两个命令:
git fetch origin 分支名称 # 先拉云端仓库的代码到本地
git rebase origin/分支名称
【此处存疑:最后是否需要在执行merge命令?】
6. Beyond Compare
Beyond Compare是一个数据对比软件,Git可以结合它来快速解决合并时的冲突问题。
步骤:
-
安装Beyond Compare
-
在Git中配置【--local 参数表示仅在当前项目生效】
git config --local merge.tool bc3 # 关联一个合并工具,该工具取名“bc3” git config --local mergetool.path "/usr/local/bin/bcomp" # 设置工具执行文件的路径 git config --local mergetool.keepBackup false # 设置不保留源文件的备份
-
当有冲突文件时,使用以下命令,调用该工具进行修改
git mergetool