git实战 & 协同开发gitflow工作流
PS:对前端技术感兴趣的朋友们,可以关注下我的《致力于前端的技术博客》哦!如果对你有帮助,欢迎赠个⭐️,会常更新内容,敬请期待!❤️❤️
此文总结在实际工作过程中git进行版本管理和团队协作的基本操作方法。
git介绍
git是什么?git是一款分布式版本控制软件。
三种状态 现在请注意,如果你希望后面的学习更顺利,请记住下面这些关于 Git 的概念。 Git 有三种状态,你的文件可能处于其中之一: 已提交(committed)、已修改(modified) 和 已暂存(staged)。
- 已修改表示修改了文件,但还没保存到数据库中。
- 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
- 已提交表示数据已经安全地保存在本地数据库中。
三大区域:
- 工作区
- 暂存区
- 版本库
基本的 Git 工作流程如下:
- 在工作区中修改文件。
- 将你想要下次提交的更改选择性地暂存,这样只会将更改的部分添加到暂存区。
- 提交更新,找到暂存区的文件,将快照永久性存储到 Git 目录。
如果 Git 目录中保存着特定版本的文件,就属于 已提交
状态。 如果文件已修改并放入暂存区,就属于 已暂存
状态。 如果自上次检出后,作了修改但还没有放到暂存区域,就是 已修改
状态。
安装 Git 后,初次运行 Git 前的配置:
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
检查配置信息: 如果想要检查你的配置,可以使用 git config --list 命令来列出所有 Git 当时能找到的配置。
实战
1、在家上传代码
git remote add origin [github@git]
git push -u origin
2、到公司新电脑上第一次获取代码
git clone [github@git]
git checkout [branch]
3、在公司进行开发
git checkout dev 切换到分支进行开发
git merge master 把master分支合并到dev【仅一次】
git add .
git commit -m "xx"
git push origin dev
4、回家后
git checkout dev
git pull origin dev
git add .
git commit -m "xx"
git push origin dev
5、开发完毕,上线
1)将dev分支合并到master并推送到远程
git checkout master # 切换到master分支
git merge dev # 合并dev分支
git push origin master # 将当前master的代码推送到远程master分支
2)把dev分支也推送到远程
git checkout dev # 切换回dev分支
git merge master # 这里保证了dev与master分支相同
git push origin dev # 将dev分支推送到远程
git rebase(变基,使git提交记录更简洁)应用场景:
1、帮助你将你的多个提交记录整合成一个提交记录
git rebase -i [commitID] 将现在提交版本号和commitID提交版本号中间所有的提交做合并
git rebase -i HEAD=3 将最近的3条记录做合并(s代表合并到上个版本提交)
【注意】如果某条记录已经提交到远程仓库了,最好不要把它也做上rebase合并,尽量合并尚未提交到远程仓库的记录。尽量不要在已push至远程库后在使用变基操作。
2、master分支在向前开发,dev分支也在向前开发,如果要merge到master中时,会产生以下的记录:
如果想要简化记录,使C3插入到C2和C4中间(归并到一条记录,减少分叉log记录)
git checkout dev
git rebase master
git checkout master
git merge dev
3、在公司写代码忘记了推送到远程,回家后接着开发其他功能并推送至远程,回公司后需要拉取代码并做合并,这种情况下会产生log记录分叉(使用git pull直接拉取代码的话)。这时,使用git fetch origin dev
+git rebase origin/dev
可以解决,不会再产生分叉记录。
注意事项:git rebase
可能会产生冲突,则需要解决冲突,再往下进行
总结
- 添加远程连接
git remote add origin [git地址]
- 推送代码
git push origin dev
- 下载代码
git clone
- 拉取代码
git pull origin dev
等价于git fetch origin dev
+git merge origin/dev
- 变基(保持代码提交简洁)
git rebase [分支]
- 记录图形展示
git log --graph --pretty=format:"%h %s"
协同开发gitflow工作流
- 现有master分支V1版本(master分支只放公司线上正在运行的代码)
- 创建分支dev,并拆分出所有的子功能分支(A、B、C……)
- A子分支功能开发完成后,进行code review后合并到dev分支(使用pull request),其他子功能分支开发完同理。子功能开发完成后对应的分支可予以删除。
- 创建release分支专门做测试,测试dev分支上的代码,发现bug要进行修复,修复完成后提交回dev分支,无bug后才能合并至master上线
- 如果在各子功能都在开发的过程中,线上出现紧急bug,应该额外创建bug分支,修复完bug后合并回master
开源代码贡献
给开源软件贡献代码:
- fork源代码(拷贝源代码到自己的仓库)
- 在自己的仓库修改代码
- 给源代码作者提交修复bug的申请(pull request)
免密登录
(1)URL中体现
原来的地址:https://github.com/iloveyou11/my-project.git
修改的地址:https://[username]:[password]@github.com/iloveyou11/my-project.git
git remote add origin https://username:password@github.com/iloveyou11/my-project.git
git push origin master
(2)SSH实现
1. 生成公钥和私钥(默认放在 ~/.ssh目录下,id_rsa.pub公钥,id_rsa私钥)
ssh-keygen
2. 拷贝公钥的内容,并设置到github中
3. 在git本地中配置ssh地址
git remote add origin git@github.com:iloveyou11/my-project.git
4. 以后使用
git push origin master
常用命令
1. 获取 Git 仓库
通常有两种获取 Git 项目仓库的方式:
- 将尚未进行版本控制的本地目录转换为 Git 仓库;
$ git init
$ git add *.c
$ git add LICENSE
$ git commit -m 'initial project version'
- 从其它服务器 克隆 一个已存在的 Git 仓库。
$ git clone https://github.com/libgit2/libgit2
$ git clone https://github.com/libgit2/libgit2 mylibgit
常见操作:
git init | 仓库的初始化
git clone [url] | 从某个远程仓库拷贝
git status | 显示工作目录的状态
git add [file1] [file2] [file3] | 跟踪新文件、已修改的文件添加到暂存区
git commit -m [msg]| 提交文件
git rm [file] | 将已跟踪的文件从工作目录、暂存区移除,注意是已跟踪的
git mv | 将已跟踪的文件重新命名,或者将文件从一个目录移动到另一个目录
git diff --cached | 暂存区与仓库之间的差异
git diff [file] | 查看指定的文件差异
git diff [commitId_1] [commitId_2] | 查看2个指定版本的差异
git log (--graph) | 查看历史记录
git reflog | 查看历史提交记录,包括你没有更新的提交
git reset --hard HEAD~ | 将本地仓库、暂存区、工作目录恢复到上一个版本(所有的修改将会失去)
git reset --mixed HEAD~ | 将本地仓库、暂存区恢复到上一个版本,工作目录保存着修改
git reset --soft HEAD~ | 将本地仓库、上一个版本,暂存区、工作目录保存着修改
git reset HEAD~2 [path] | 带文件路径,默认是--mixed,只将暂存区,路径path下的文件恢复到之前2个版本
git checkout [file] | 撤销工作区中已修改的文件
git commit --amend | 覆盖上一次的提交。
远程仓库相关命令:
git clone <url> 克隆远程仓库到本地
git remote 列出每个远程仓库的简短名字
git remote -v 列出每个远程仓库的简短名字与其对应的 URL
git remote show [remote-name] 查看某个远程仓库的详细信息
git remote rename [old name] [new name] 重命名远程仓库
git remote rm [remote-name] 移除某个远程仓库
git remote add <shortname> <url> 添加一个远程仓库
git fetch [remote-name] 从远程仓库数据拉取最新到本地,但不自动合并本地的修改
git pull [remote-name] [branch-name] 把远程仓库数据拉到本地,并自行合并
git pull 的魔法经常令人困惑所以通常单独显式地使用 fetch 与 merge 命令会更好一些。
git push [remote-name] [branch-name] 把本地代码推送到远程仓库,一般先执行git pull、在执行git push 确
分支相关命令:
git branch 查看分支(当前工作分支前面会标一个*号)
git branch -v 查看每一个分支的最后一次提交
git branch -vv 查看每一个分支的详细信息,如每一个分支正在跟踪哪个远程分支与本地分支是否是领先、落后
git show-branch 详细查看的分支记录
git branch <branchname> 创建分支, HEAD 的特殊指针也会移到当前分支
git checkout <branchname> 切换分支
git checkout -b <branchname> 创建分支,并切换到该分支,即合并上面2步
git mergr <branchname> :合并分支,如果需要合并到master分支,那么需要先切换到master分支,再进行整合 (该合并分支,是Fast forward模式,在服务器中是没有记录的)
git merge --no-ff -m "merge with no-ff" <branchname> 合并分支(禁用Fast forward模式,能看到分支记录)
git branch --merged 查看已经合并到当前分支的分支。
git branch --no-merged 查看尚未合并到当前分支的分支。
git branch -d <branchname> 删除已经合并的分支
git branch -D <branchname> 可强制删除尚未合并的分支
git push origin --delete serverfix 删除某个远程分支
git checkout -m <branchname> 将本地的修改加入到新的分支上
git checkout -b branch-name origin/branch-name 在本地创建和远程分支对应的分支,本地和远程分支的名称最好一致
转载自:https://juejin.cn/post/6875138268317351949