系统上线后,又要修改bug,又要开发新的功能。
由于新功能没有开发完,所以需要建立分支,一边修改bug,一边开发新功能,最终合并。
# 查看分支
git branch -v
# 输出内容
* master 49efe51 bug fix
# 添加分支
git branch -v
# 输出内容
dev 49efe51 bug fix
* master 49efe51 bug fix
# 切换分支
git checkout dev
# 输出内容
* dev 49efe51 bug fix
master 49efe51 bug fix
# 在dev分支新建一个类
touch src/java_test01.java
git add src/java_test01.java
git commit -m "new test02"
# 可以看到两个分支的版本不一致了
git branch -v
* dev 38444da new test02
master 49efe51 bug fix
# 切换回master,新类不见了
git checkout master
# 切换回dev,新类又出现了,从.git文件中恢复
git checkout dev
# 功能汇总,以master为主
git checkout master
git merge dev
# 版本一致
$ git branch -v
dev 38444da new test02
* master 38444da new test02
新功能继续开发,但开发中途主干修复了bug,新功能也需要使用修复好的主干,这时就要以分支为主
注意bug修复之后与新功能之间是否存在冲突
也需要注意分支上和主干上同时进行了bug的修复,但修复的方式不一样,无论是主干与分支合并,还是分支与主干合并,最终合并的版本会出现同一段代码出现了两种写法,保留哪个,git很难去判断,需要程序员来手工判断解决冲突。
程序合并时发生冲突系统会提示CONFLICT关键字,命令行后缀会进入MERGING状态,表示此时是解决冲突的状态。
此时通过git diff 可以找到发生冲突的文件及冲突的内容。
然后修改冲突文件的内容,再次git add 和git commit 提交后,后缀MERGING消失,说明冲突解决完成。
新建分支,切换分支:git checkout -b <分支名>
修改文件内容,并添加,提交:(同时修改第x行)
切换主分支:修改文件内容,并添加,提交:(同时修改第x行)
当把其他分支合并到主分支时出现冲突:
# 制造冲突
vim src/java_test.java
# 添加一行A
git add src/java_test.java
git commit -m "insert A"
# 切换分支
git checkout dev
vim src/java_test.java
git commit -m "insert B"
# 此时两分支彼此独立,不会产生问题
git branch -v
* dev 56bc207 insert B
master 7434eb8 insert A
# 合并
git merge master
# 产生提示
Auto-merging src/java_test.java
CONFLICT (content): Merge conflict in src/java_test.java
Automatic merge failed; fix conflicts and then commit the result.
# (dev|MERGING) 状态表示,合并中,没有合并完成,没完成之间,其他工作做不了
# 解决冲突,手动合并
<<<<<<< HEAD
BBBBBBBBBBBBBBBBBB
=======
AAAAAAAAAAAAAAAAAA
>>>>>>> master
# HEAD表示本地代码,======表示其他分支代码
# 将标签删除,冲突就解决了,但保留哪一个或者是两段代码是否合并,需要人为判断
# 将合并后的新代码再次提交
vim src/java_test.java
git add src/java_test.java
git commit -m "Merge branch 'master' into dev"
# 此时状态变为(dev)
git branch -v
各个机构,各个人如何结合网络平台(github、gitee、gitlab)完成一个项目
负责人需要完成
组员需要完成
负责人再执行更新操作(git pull),按照上述过程,循环
核心的三个动词:push、clone、pull
创建如下目录
在src目录下打开Git
vim src/jiuyinzhenjing.java
# 添加一些内容
git init
git config user.name "xiaolongnv"
git config user.email "[email protected]"
git add src/jiuyinzhenjing.java
git commit -m "create shenfa"
# 查看
Git log
注册一个gitee账号
点击新建仓库,完成后会生成一个仓库地址:https://gitee.com/xiaolongnv13597/shenfa.git
# 将代码上传到仓库
# 给仓库地址起别名 origin
git remote add origin https://gitee.com/xiaolongnv13597/shenfa.git
# 将master分支推到origin
git push origin master
# 输入账户名密码
# 显示结果
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Writing objects: 100% (4/4), 268 bytes | 268.00 KiB/s, done.
Total 4 (delta 0), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-6.4]
To https://gitee.com/xiaolongnv13597/shenfa.git
* [new branch] master -> master
# 可在gitee仓库中查找到上传的文件
进入到如下目录
git clone https://gitee.com/xiaolongnv13597/shenfa.git shenfa_guoer
之后yangguo可以进行自己的开发
# yangguo修改文件
vim src/jiuyinzhenjing.java
git add src/jiuyinzhenjing.java
git commit -m "togeter"
想要上传文件,需要在gitee给上传用户的权限
在项目下点击右上角的【管理】–【仓库成员管理】–【开发者】–【添加仓库成员】–【邀请用户】
登录yangguo用户,会收到邀请,点击确认加入
开发者拥有提交代码的权限
git push https://gitee.com/xiaolongnv13597/shenfa.git master
xiaolongnv将更新数据pull下来
git pull https://gitee.com/xiaolongnv13597/shenfa.git master
# 查看
cat src/jiuyinzhenjing.java
在上传或同步代码时,由于你和他人都改了同一文件的同一位置的代码,版本管理软件无法判断究竟以谁为准,就会报告冲突,需要程序员手工解决。
先提交的成功,后提交的失败。
xiaolongnv修改并提交到远端,OK。
yangguo修改并提交到远端,NOT OK,此时出现在push前请先pull。
yangguo先pull,此时出现冲突,合并冲突,commit到本地,再push,OK。
现在的情景是,用叉子把别人的东西(copy no cut)叉到你碗里~
就是把别人的项目clone一份,但是owner变成自己,这样你就可以在遵守Open source license的前提下任意修改这个项目了。
相当于你在原项目的主分支上又建立了一个分支,你可以在该分支上任意修改,如果想将你的修改合并到原项目中时,可以pull request,简称PR。
这样原项目的作者就可以将你修改的东西合并到原项目的主分支上去,这样你就为开源项目贡献了代码,开源项目就会在大家共同的努力下不断壮大和完善。
第三方账号登录,搜索某账号找到某项目,然后点击Fork按钮,这样就将该项目克隆一份到当前账号内,然后进行修改,提交pull request,告诉对方已经修改了,请求合并;
当前用户登录后,可以看到小铃铛中的消息提醒,查看到pull request,然后,选择合并或拒绝。
【fengqigong】获取【xiaolongnv]的项目URL(可以进行搜索,也可以通过email发送url地址告知)
【fengqigong】点击【Fork】,产生分支
【fengqigong】修改项目文件。(可以pull后修改提交,也可以在gitee上直接进行修改)
【fengqigong】-> [New pull request] -> 点击【代码】 -> + pull request -> 填写一封邮件,说明自己的改动情况 – 点击创建
分支已提交到主分支
【xiaolongnv】和【yangguo】都可以看到【fengqigong】提交的项目内容 – pull requests
点击【审查通过】,点击【测试通过】,最后点击【合并】
简单来说就是,Git工作流就是,一个项目的成员们在工作中统一使用Git的工作方式。
像SVN一样,集中式工作流以中央仓库作为项目所有修改的单点实体。所有修改都提交到Master这个分支上。
这种方式与SVN的主要区别就是开发人员有本地库。Git很多特性并没有用到。
Gitflow工作流通过为功能开发、发布准备和维护设立了独立的分支,让发布迭代过程更流畅。严格的分支模型也为大型项目提供了一些非常必要的结构。
master分支上的版本几乎和上线的版本保持一致,平时的开发使用develop分支。
分支种类
设置idea中Git客户端的路径
点击【test】,出现Git版本号说明路径没有问题
创建maven项目,随便编写一点内容
创建本地仓库
选择本项目,点击创建,创建成功之后,会发现有一些文件变为红色
点击【add】,add之后向添加其他文件可以再次右键点击【commit file】,选择其他想要添加的文件
把选中的代码纳入暂存区,并提交本地库。(git add, commit)。
这里的文件要选你自己编写的代码比如java文件,pom.xml,properties文件等等。
idea自动生成的文件一般不要上传,如.idea目录。
下框中填写版本的说明,右上角填写签名,最后点击commit
完成之后,已经纳入版本管理的文件会变为黑色
登录gitee,新建库
点击push
输入用户名密码,选中文件,push
提示push成功,可以在gitee查看到上传到的文件
点击克隆即可将代码下载到本地,此时可以随意修改代码,创建类
点击取消,上传时统一上传,不使用自动上传,修完完代码之后,上传步骤如上
在Gitee仓库管理中添加用户权限,pull到远端,如上
在开发新功能前,先建立分支
创建完成之后,默认操作会直接切换到分支上,可以进行代码编写
提交代码,并push到远端
之后可以在gitee上看到新的分支被上传
点击pull,先刷新一下,会看到新的分支
右下角点击分支名可以看到有新的远端分支,如果没有,右键 – 【Git】-- 【repository】 – 【fetch】
但是,远端分支[Remote Branches]只是一个链接,并没有下载到本地,需要用【checkout as new local branch】 将分支下载到本地仓库。
下载到本地后可以看到新的本地分支
如果该分支的代码没有问题,可以进行一次合并。
以合并到master分支为例。
首先要切到master上
在主干master分支上选择要合并的分支进行Merge – 【merge into current】
最后把经过合并的master,push到远端即完成了一个功能在主干上的提交。