git实战
一、git 下载与安装-Windows
1. 下载地址
https://git-scm.com/download 选择自己的系统进行安装。windows 系统会自动弹出下载框。
2. 安装教程
为了方便,把安装流程整理成图片形式。在安装过程中,除了第3步选择安装位置需要用户根据需要修改外,其它保持默认即可。【不想了解每步干啥不需要看下面】
3. 验证
二、git 介绍
git 是分布式版本控制的软件。对于git 版本控制,其实经历过四个阶段:
- 本地文件夹拷贝
- 本地版本控制
- 集中式版本控制
- 分布式版本控制
git 安装在自己电脑上,只是在本地进行版本控制,也就是上图分布式版本控制 的ComputerA,而 ComputerB代指其它人电脑,Server Computer 指托管平台,常用 github(网站),gitlab(开源软件)。
关于git ,官网上也有相关文档。
三、git 本地使用
为了方便理解,举例子说明git的常用知识点。
1. 生成版本
- 进入你要进行版本控制的文件夹目录,鼠标右键选择 Git Bash
- 执行初始化命令:git init(会生成==.git==文件夹)
- 查看管理的文件:git status,新增的文件和修改过的文件都是红色的
- 将需要进行版本控制的文件加入管理:git add [file | .]
- 若第一次使用,在生成版本之前应先进行个人信息配置(全局):
git config --global user.email “you@example.com”
git config --global user.name "Your Name" - 生成版本:git commit -m '描述信息’
2. 版本更迭
此时已生成一个版本。但为介绍后续版本操作,修改或新增文件,进行下面操作。
- 将修改的文件重新加入管理:git add .
- 生成第二个版本:git commit -m '描述信息’
- 查看版本信息:git log
- 回滚到第一个版本:git reset --hard 版本号 (版本号在git log中显示)
- 查看全部版本信息及版本变更记录:git reflog
- 从第一个版本回滚到第二个版本:git reset --hard 版本号 (版本号在git reflog中显示)
当然还有其它命令可以让文件在工作区,缓存区,版本区之间相互转换,但最常用的还是上述介绍的命令。
2. 版本分支
有时我们需要同时存在两个或更多版本。git 中默认分支master。
- 查看分支情况:git branch
- 在master上创建分支dev:git branch dev
- 切换到分支dev:git checkout dev,修改或新增文件,形成新版本。(此时dev和master版本不一样了)
- 切换到分支master,创建分支bug:git branch bug;修改或新增文件,形成新版本(此时master、dev、bug分支版本都不一样了)
- 切换到分支master,合并分支bug:git merge bug (此处可能会发生冲突)
- 删除分支bug:git branch -d bug (bug分支留着没什么用)
- 切换到分支dev,继续完成新功能开发工作,完成后生成版本
- 切换到主分支,合并dev分支:git merge bug (此处可能会发生冲突)
冲突是指分支合并时,存在同一文件,同一行不一致的情况,git不知道要保留哪个,所以提示冲突。可以仅通过新增文件,形成新版本,那样不会发生冲突。当然,发生冲突也不可怕,将引起冲突的文件人力修改后,重新生成版本。
上面操作的大致版本图如下:
四、git 分布式使用
1. GitHub 网站注册,创建仓库
官网:https://github.com/ 注册流程这里不再赘述。
2. 本地git 与 GitHub 建立连接
建立连接有两种方式:HTTPS 和 SSH。
两者的区别:
- SSH:默认22 端口;通过先在本地生成SSH密钥对,再把公钥上传到服务器;
- HTTPS:默认443 端口;通过用户名/密码授权或者personal access token (个人访问令牌)建立连接
HTTPS建立连接,此处不需要做什么。在使用拉取或上传命令时,会自动弹出对话框,让你输入个人访问令牌或者用户名/密码。
- 个人访问令牌:官方推荐方式,也是首先会弹出的对话框,令牌输错,才会弹出用户名/密码 对话框。个人访问令牌获取:官网教程。
- 用户名/密码:git会将其保存在本地电脑凭据中。(控制面板–>用户账户–>管理Windows 凭据)
SSH方式建立连接:官方文档,下图是我自己操作时的截图
3. 上传文件到GitHub
这里需要说明的是git remote 命令 将连接方式定义在本地配置中。还有就是默认推荐使用的仓库远程名是origin。(当然可以自定义)
① 定义连接方式
# HTTPS 方式 gitFirstHTTPS:远程仓库名, 后面地址为远程 URL
git remote add gitFirstHTTPS https://github.com/USERNAME/REPOSITORY.git
# SSH 方式 USERNAME:账户名,REPOSITORY:仓库名(和网址对应)
git remote add gitFirstSSH git@github.com/USERNAME/REPOSITORY.git
② 推送分支到远程仓库
# 推送master分支
git push gitFirstHTTPS master
# 推送bug分支
git push gitFirstHTTPS bug
4. 从GitHub上克隆分支(首次)
克隆分支操作仅在首次从github上拉取代码使用,后续应选择更新分支。
操作:新建一个文件夹,初始化,git clone 命令。
git clone https://github.com/USERNAME/REPOSITORY.git
5. 从GitHub上更新分支
# origin 远程仓库名
git pull origin dev;
# pull命令等价于,拉取+合并(不常用)
git fetch origin dev
git merge origin/dev
五、git-reabse命令
rebase命令不常用,但必须知道。其主要功能是可以让提交记录更加简洁。
1. 应用场景一:合并版本
无论是习惯(一天保存一个版本)还是真的有需求,在开发代码时会产生许多中间版本,但这些中间版本不需要保留。所以要进行合并,让版本记录更简洁一些。
为了方便操作,新建一个项目,进行合并举例。(执行流程我弄成一个图了,原件删了,凑合看吧,核心命令就是下面两句)
# 合并版本方式一,版本号选择旧版本,表示最新版本(包括)到旧版本(包括)之间进行合并
git rebase -i 旧版本号
# 合并版本方式二,HEAD~3 表示最新的3个版本进行合并
git rebase -i HEAD~3
说明:
- 合并记录时,
squash:表示将当前版本与上一版本合并;
pick:正常选中;
reword:选中,并且修改提交信息;
edit:选中,
rebase时会暂停,允许你修改这个版本 - 合并的版本时最好不要将 已上传到github的版本 和 未上传到github的版本 合并,容易造成记录混乱。
2. 应用场景二:合并分支
合并分支之前也讲过merge命令,两者区别如下图:(这里新命令:git log --graph)
merge 操作:
rebase 操作:
3. 应用场景三: 减少分叉
情景举例:在公司写代码生成版本v1,但没有上传到github库,回到家写代码生成版本v2,上传到了github库。第二天,在公司pull代码时,合并会产生分叉。示例图如下:
# 之前也说过使用git pull 进行更新操作,该命令蕴含git fetch和git merge命令
git pull origin dev;
# 现在为了减少分支(就是形成一条线),使用以下命令
git fetch origin dev # 从远程仓库拉取代码
git rebase origin/dev # 使用rebase命令与当地版本进行合并
4. rebase冲突
git rebase冲突后,(冲突实例在应用场景二中有体现)
- 打开文件,解决冲突
- git add 冲突文件
- git rebase --continue。
六、git 其他知识点
1. 标签
前面见过使用git commit 生成版本的命令,但也可为版本增加标签
# 为最新提交版本增加标签,V1:标签名
git tag -a V1 -m '标签说明'
# 将标签上传到github
git push origin --tags
2. 配置文件
git中有三种配置文件:local,global,system
# 只对本项目生效(优先级最高),配置信息在:当前项目/.git/config
git config --local ..
# 全局配置(优先级次之),配置信息在:~/.gitconfig (~ 表示 home目录,即C:\Users\xxx)
git config --global ..
# 系统配置(优先级最后),配置信息在:/etc/.gitconfig ; 需要权限
git config --system ..
3. git 忽略文件
在当前项目下创建【.gitignore】文件,在文件中写入文件全名或者与通配符搭配,能匹配上的文件都会被忽略。
#.gitignore
a.h # 文件全名
*.h # 通配符
!a.h # 除a.h 以外
mulu/ # 忽略mulu下的所有文件及子目录
*.py[c|a|d] #忽略以.py .c .a .d 结尾的文件
github上有推荐的 .gitignore 文件范本,以搭配不同的程序语言,对系统或工具文件进行忽略。
4. 实践中应注意
在实际操作中,第一次应切换到dev分支,master分支进行合并,来保证dev分支的最新和一致性。项目要上线,应切换到master分支,合并dev分支,再切换到dev分支,合并master分支 来保证两个分支的一致性,最后将分支上传,都保证为最新版本。
七、解决冲突软件
- 下载软件Beyond Compare 4
- 在git中配置
# --local:表示只对当前项目生效
# 指定合并工具名
git config --global merge.tool bc4
# 指定合并工具地址
git config --global mergetool.bc4.cmd "\"D:\\software\\Beyond Compare 4\\BComp.exe\" \"\$LOCAL\" \"\$REMOTE\" \"\$BASE\" \"\$MERGED\""
git config --global mergetool.bc4.trustExitCode true
# 指定合并工具是否保留源文件
git config --global mergetool.keepBackup false
- 当合并过程中出现冲突时(分支后有MERGING标记),启动合并工具
# 应用启动
git mergetool
为了方便理解,查看下图实践:
八、github上的使用
1. git flow工作流
一个标准的工作流:
- 有master分支:负责上线版本;
- bug分支负责修复bug;
- dev分支:负责开发;
- release分支:负责测试。
- 其它功能分支:负责开发各个功能
功能开发完毕,经过review,提交给dev分支,提交给测试,测试通过,最后提交给master。
2. 邀请成员
一般在组织中创建仓库,然后邀请人员(同一组织的人员可访问该组织下所有仓库)。邀请信息会发送到对方邮箱。
3. 成员权限
默认组织对成员的权限为只读。可以对组织权限进行修改,也可以对组织下的仓库进行权限修改,以及增加成员。都在对应的Settings下。
4. 代码review+pull request
代码review其实是分支合并之前要提交给组长或领导进行检查,通过之后再合并。
第一步是建立分支规则,github收费,就不演示了。
第二步是建立pull请求,github上进行合并
第三步本地pull,保证一致
5. 其他功能
fork;给原作者提建议(Pull request)[这里不再画图,和上一小节流程一致];issues;wiki
附录:Git常用命令
git命令 | 解释 |
---|---|
git init | 初始化 |
git status | 查看当前目录下文件是否加入管理 工作区-新增或有变动(红色) 暂存区-加入管理(绿色) 工作区-已生成版本(working tree clean) |
git add <file-name> | 指定文件加入管理。 git add <file> 或 git add . |
git config --global | 修改全局配置。 git config --global user.email "you@example.com" git config --global user.name “Your Name” |
git commit | 生成版本。 git commit -m ‘描述信息’ |
git tag -a v1 -m ‘描述信息’ | 为当前最新提交版本增加标签 |
git push origin --tags | 将标签上传到github库 |
git log | 查看当前及之前的版本信息 |
git log --graph | 以图形形式查看当前及之前的版本信息 |
git log --graph --pretty=format:"%h %s" | 以简洁的图形形式查看当前及之前的版本 |
git reflog | 查看所有版本信息及版本变更记录 |
git reset --hard | 回滚 git reset --hard <版本号> |
git branch | 查看当前所有分支 |
git branch xxx | 创建新分支:xxx |
git checkout xxx | 切换到指定分支 |
git checkout -b xxx | 创建并切换分支 |
git merge xxx | 将xxx分支与当前分支进行合并(可能产生冲突) |
git branch -d xxx | 删除xxx分支 |
git remote add 远程名称 远程URL | 增加远程控制 git remote add gitFirstHTTPS https://github.com/USERNAME/REPOSITORY.git git remote add gitFirstSSH git@github.com:USERNAME/REPOSITORY.git |
git remote -v | 查看现有的远程控制 |
git remote set-url xxx yyy | 更改现有的远程URL git remote set-url 现有远程名称 远程URL |
git remote rename xxx yyy | 重新命名远程名称 git remote rename gitFirst gitFirstHTTPS |
git remote rm 远程名称 | 删除远程引用,该命令并不会删除远程存储库,只是删除本地远程引用 |
git push 远程名 分支名 | 向远程仓库推送代码 git push gitFirstHTTPS master |
git clone 远程仓库地址 | 克隆远程仓库代码 git clone 远程URL 注:此处自动增加远程名(默认origin)及对应URL |
git pull 远程名 分支名 | 从远程仓库拉取并合并代码 git push gitFirstHTTPS dev |
git fetch 远程名 分支名 | 从远程仓库拉取代码 |
git rebase 远程名 分支名 | 合并分支 |