Git使用总结
集中式VS分布式
个人认为就git这种分布式版本管理系统和类似SVN之类的集中式版本控制系统对比,主要有以下一些好处:
- git分布式系统上每台主机上都有完整的代码,但是svn上完整的代码是存在在中央服务器上的。git上修改代码之后,会将代码修改提交到每台主机。其实这里更好的理解是,这个是我们本地git的工作区间,服务器的代码是我们的主分支,我们对于服务器来说都是次分支。
git在windows的安装
略
指令总结
关于工作仓库的解释:工作仓库就是你本地存放代码的文件夹,当然为了避免不必要的工作量,建议完整的路径下不要包含中文字符。
相关指令如下
仓库初始化指令: git init
查看当前repository状态: git status
查看上一次修改: git diff
查看最近修改的日志 git log
回退版本 git reset –hard HEAD^ 可以回退到上一个版本
回退版本 git reset –hard 提交id 可以回退到特定的版本
查看提交id git reflog 这个提交id就是上一个指令中使用的提交id
git相关命令解析:将文件add的时候其实是把文件加入到.git文件夹下的名为stage或者index的缓存工作区中,然后使用完commit命令之后才把文件提交到master仓库。
git checkout –文件名 撤销当前修改
- 将文件回退到版本库版本,前提是没把修改提交(add)到缓存区
- 将文件回退到缓存区版本,前提是提交了修改(add)到缓存区
删除文件 git rm 文件名 (然后再commit 你的修改)
远程仓库
这里进行远程仓库的介绍,远程仓库,顾名思义就是远程服务器上的仓库,例如github,京东云汇等代码托管网站上创建的远程仓库。
在git bash中使用以下命令和远程仓库连接(这里不介绍远程仓库的创建)
git remote add origin (其中还有几个参数需要配置)
从远程仓库下载代码 git clone 下载地址
分支管理
分支管理的使用情景主要是在团队开发中,每个人的在自己的工作区间做了工作,然后需要将自己的代码更新给队友,这时候就需要考虑分支合并了,其实每个人的主机相对于服务器来说就是一个分支。其实,我们不可能每个人都在主分支工作,所以,通常我们会创建对于服务器仓库的的分支,然后进行工作。
分支创建 git branch 分支名称
分支切换 git checkout 分支名称
显示分支 git branch (这里的话,带*号的分支是主分支)
合并分支 git merge 分支名称 (将指定分支合并到当前分支)
分支是为了团队合作,所以存在这种情况,分支合并的时候,可能会存在冲突,也就是你们修改了同一个文件的同一行代码的时候,会导致冲突,这是git不会自动把你们的代码合并,所以需要手动解决冲突。
合并分支的时候手动解决冲突的过程
1. 通过 git status 查看冲突文件和冲突情况
2. 手动修改冲突文件的最终方案,然后提交(注意写提交注释)
git上两种合并模式的介绍一种是FAST FORWARD 模式,在这种模式之下,删除分支之后会丢掉分支信息。第二种是–no-ff模式,这种模式下,分支信息不会被删除(分支指针还存在)具体指令如下:
git merge –no-ff -m “merge with no-ff” 分支名称
bug分支的使用
这个新手入职,大部分都是改bug的工作,所以我这里单独的把这个知识拿出来讲一下。很可能存在这样一种情况,你本来有自己相对于服务器仓库的自己一个开发的分支,然后,你这时候来了一个修改bug的任务,但是你的开发分支任务没有完成,这时候你就要考虑,是否需要创建一个分支,来处理这个bug,如果需要的话,你还需要将当前开发分支的状态保留
保留分支状态 git stash
然后你创建了bug分支之后,修改完了,提交到主分支,然后在切换回自己的分支进行工作。
多人开发相关操作
当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin。
查看远程库的信息 git remote
查看远程库推送地址 git remote -v
从远程仓库抓取分支 git clone 地址
推送分支到远程服务器 git push origin 推送的分支名称
创建远程的开发分支到本地 git checkout -b 分支名称 origin/分支名称
拉取最新提交 git pull
推送时忽略文件
有时候存在这种情况,你本地的一些配置文件没必要往远程仓库推送(例如android中的 .class文件等)
解决方法如下:
在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。你只需要将你的忽略的文件类型,按照规范写入到这个文件当中去,就可以在提交的时候避免显示这些文件的提交了。
思考问题:
假设分支是:
- release 发布分支
- dev 开发分支
- kl kl的开发分支
- yours 你的分支
- function1,2,3…n 正在开发的功能分支
- bug1,2,3…n
1. 思考一下这些分支哪些应该在服务器端,哪些应该在客户端,应该是怎样一个策略
由于release版本是发布版本,所以必须是最新的更新,而且必须是完整版本,所以放在服务器上。
dev的话,在远程仓库也可以建立一个dev分支,用来合并最新的开发进度,这样子就把发布和开发分离开来了
kl和my分支都是个人开发分支,所以也需要在服务器上建立分支,因为需要将个人开发的代码往dev分支上合并。(个人主机的本地分支直接叫master的话)
function分支的话,因为需求在变化所以,没必要在服务器上建立特定的分支,个人本地建立一个function分支完成之后,push到服务器即可。主要是考虑到需求的变化比较大。
bug分支的话,也是建立在个人本地比较好,因为bug分支只是单单某一时期为了修改一个错误,没必要在服务器上建立分支(服务分支在开发周期就像一一条线一样,你bug分支,只能说是生命周期错出来的一个点,所以从分支管理和简洁的角度考虑,没必要在服务器建立bug分支)。
2. git log 和 git reflog的使用和回滚的使用再加强,结合branch
git log 可以查看到 提交日志
git reflog 可以查看上一次提交的commit id
假设我们出现这样一个问题,我在
3. 再深入”理解GIT是基于修改的”,思考GIT COMMIT,到底COMMIT的是什么,COMMIT到哪里,GIT ADD 呢?ADD到哪里?怎样对比两个COMMIT的不同,怎么查看对比上次COMMIT,现在修改了哪些内容,具体修改了哪些内容
首先要,描述一下仓库之间的关系,个人主机上的git init之后的文件夹是个人的工作区间,然后存在.git这个隐藏文件夹称为缓存区和版本库,然后git会自动帮你创建你的本地分支默认为master。
你使用add命令的时候,是将工作区的文件或者修改提交到缓存区,然后一系列的add之后调用的commit方法,则是将缓存区的改动推送的本地分支。
可以通过git diff 指令查看上次的commit 修改了那些部分
4. 如果我开发新功能的时候,忘了新开一个function分支,这时有一个紧急的bug修复。那怎样做?
可以在当前开发分支上使用git stash指令,实现将当前分支的状态保存下来(假设你是在dev分支上进行开发的)
然后你自己需要修复bug的那条分支上新建一个bug分支,进行bug的修复,然后将bug合并后删除,然后切换回你之前的function开发分支。
远程仓库操作 ##
查看所有分支 git branch -a 可以查看到本地分支和远程分支在内的所有分支
创建远程分支
在本地创建分支之后推送到服务器即可,例如:
git branch release
git push origin release
这样就等于现在本地创建了一个 release 分支,然后推送到服务器,等于在服务器也创建了一个新的 release 分支了。
详细的 git 学习教程参考 廖雪峰大神的 《git教程》