赞
踩
带着疑问的学习总是高效且有针对性的,在解疑的过程中我也收获了很多,通过博客的形式记录学习反思改正过程如下。
如何将项目加入本地仓库并更新至远程仓库的流程网上很多,在老师讲解后跟着操作两遍便能够记住流程独立完成,非常方便,这里就不再累述流程步骤,可以参考老师分享的资料https://my.oschina.net/songxinqiang/blog/192567?appId=1000 清晰明了。
版本回退中Git允许我们在版本的历史之间穿梭,版本历史自动连接成一条时间线,可以使用[History]查看提交历史,以便确定要回退到哪个版本。再回退后也可返回回退前版本,使用Git总是有后悔药吃。版本回退在Egit中是在[reset]中选择,对reset的理解如下:
这里便是此模块内容的很好应用https://www.liaoxuefeng.com/wiki/896043488029600/897889638509536
在理解完三者的区别之后对Git管理修改的方式也有了一定的了解。
发布一个版本时,并希望永远记住那个特别的提交快照,我们通常先在版本库中打一个标签(tag),这样就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。就比如PS中的快照,多次提交后,想要恢复快照的那一步,不用逐步撤销,直接使用快照。
Git 支持两种标签:轻量标签(lightweight)与附注标签(annotated)。轻量标签很像一个不会改变的分支——它只是某个特定提交的引用,而附注标签是存储在 Git 数据库中的一个完整对象,它们是可以被校验的,其中包含打标签者的名字、电子邮件地址、日期时间等,可根据需要自行创建相应类型标签。
添加方法:
在学习上述内容时便多次看到了branch一词,在初次使用Egit时我也遇到了分支冲突,Conflict让人很无奈,当时稍微一查阅又给了我一些新词汇,比如分支合并、Merge、Master、checkout…现在终于到这一步了,在学习完后对这些词汇有了一定的认识。
Git保存的不是文件的变化或者差异,而是一系列不同时刻的快照,在进行提交操作时,Git会保存一个提交对象,该提交对象会包含一个指向暂存内容快照的指针。不仅仅是这样,该提交对象还包含了作者的姓名和邮箱、提交时输入的信息以及指向它的父对象的指针。首次提交产生的提交对象没有父对象,普通提交操作产生的提交对象有一个父对象, 而由多个分支合并产生的提交对象有多个父对象。
分支:其实本质上仅仅是指向提交对象的可变指针。Git的默认分支名字是master。在多次提交操作之后,你其实已经有一个指向最后那个提交对象的master 分支。master分支会在每次提交时自动向前移动。可以看成每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。
可以创建多个分支,Git鼓励使用分支完成某个任务,合并后再删分支,不同的任务组在不同的分支上开发,互相之间不会影响。比如说,需要向项目中添加一个新功能,一般不会直接在主分支上修改,会新建一个分支,在上面更改代码。这样做的好处就是保证主线代码的完整性和可用性,也就是说,主线上都是稳定的代码,可以直接拿来发布的。最后根据需要其他分支与主分支合并即可。
引用廖雪峰老师写的分支策略,真的解释了我的疑惑,之前一直想大家都在一个分支上瞎改,各种可能的意外,这个Git真的能好用吗?现在看了下面这段话觉得流传下来的东西都是有原因的。
在实际开发中,我们应该按照几个基本原则进行分支管理:
首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
git-br-policy
Egit分支合并操作参考https://www.cnblogs.com/jtlgb/p/9875491.html
在分支合并、pull中我都多次遇到冲突,不清楚什么是冲突Git用起来始终是迷迷糊糊。
冲突出现的情景:
冲突的具体情况是两个分支中修改了同一个文件或两个分支中修改了同一个文件的名称,两个分支中分别修改了不同文件中的部分,不会产生冲突,可以直接将两部分合并。
Egit解决内容冲突的方法参考https://blog.csdn.net/c694421919/article/details/82287626?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
push和pull其实就分别是用本地分支合并到远程分支和将远程分支合并到本地分支,这里也能解释开始提的第三个疑问,如下:
引用一个匿名大佬的举例
比如你从一个git log为1,2,3,4,5,6的远程库拉取到了本地;
另一个同事也拉取了同样的代码,而且你的同事先于你提交到远程了;
此时远程的版本是1,2,3,4,5,6,7_new,8_new;
而你当前只是本地的版本1,2,3,4,5,6,7_local,8_local,9_local;
从这里你就能看出你前一部分和远程的一样,后一部分和远程的不一样;
这个时候你不能正常推送上去的,如果你采取git push origin master --force;
那么远程的版本就变成了1,2,3,4,5,6,7_local,8_local,9_local;
之前你同事推送的7_new,8_new这两次推送被覆盖了,这不是大家想要的情况;
因此需要git pull来将本地的版本合并成这样1,2,3,4,5,6,7_new,7_local,8_local,8_new,9_local,10_commit_merge;
远程和本地的排序是按当时 commit 的时间来排的,最后一个10_commit_merge就是你本地和远程合并的标志,最后你推送到远程仓库的应该也是这个。
是的,就是这个强制推送,在小组操作在操作中遇到了,覆盖了仓库所有的内容,当时第二天登陆时发现仓库全部空了,提交动态却还在,当时小组内不明所以,一度以为是灵异事件…好在现在知道是什么原因了,也进行了及时补救。
总结一下就是不要轻易先pull再commit和push,容易覆盖代码,当然如果你是一个人进行项目,并且知道自己的每次push是在干嘛,神志清醒,你这样也完全没关系,但是如果多人参与项目,尽量采用先commit再pull检查是否有冲突,如果有冲突就解决,再pull检验是否有冲突,直到没有冲突,在push的流程。
关于分支冲突其实大同小异,具体解决办法就不累述,见Egit合并操作分享的链接后半段内容。
Git中从远程的分支获取最新的版本到本地有这样2个命令:
未完结
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。