一、什么是git
- 文件管理系统–>对文件进行管理,多人可以对同一文件进行编辑修改,加快工作效率
- Git是目前世界上最先进的分布式版本控制系统
二、为什么要用git,为什么要用命令
git–>分布式管理系统
svn–>非分布式版本控制工具
问题来了-------->什么是分布式
简而言之,svn是串行的,git是并行的。git可以多个分支进行开发,最后再将代码进行合并。也可以是修改bug的分支与正在开发的分支并行,最后进行合并。
现在有很多GUI工具,小乌龟,idea也集成了git,为什么我们要使用命令,GUI工具为了简化操作,有很多组合操作,在不知道原理的情况下,一旦出了问题,很难解决。
三、git常用命令
- 克隆
克隆一份代码到本地
git clone url
- 查看状态
红色为修改过的文件
绿色为加入缓存区的文件
git status
- 添加到缓存区
将需要提交的代码放入缓存区,准备进行提交
git add fileName
git add dir
git add *.java
- 提交
将更新提交到本地
git commit -m "this is commit message"
- 拉取
同步远端代码
git pull //默认同步当前远端分支
git pull origin branch //同步指定分支
- 推送
用当前分支覆盖远程分支,前提条件是已经同步了远程分支
git push//默认同步当前远端分支
git push origin branch //同步指定分支
- 合并
将一个分支合并到当前分支
git merge branch
git merge master//将master合并到当前分支
- 查看分支
git branch//查看本地分支
git branch -r//查看远端分支
- 查看日志
git log
- 查看提交前的差异
git diff
- 查看提交后的差异
git show
- 切换分支
git checkout branch
- 将文件恢复到当前版本
git checkout fileName
- 软回滚
回滚后,自己进行修改的文件差异还存在
git reset --soft logId//logId 提交的版本号
- 硬回滚(危险)
回滚后,直接回退到提交后的状态
git reset --hard logId//logId 提交的版本号
四、简单使用
简单例子:
使用公司dep分支进行开发工作
//拉取代码
git clone url
//切换到dep分支
git checkout dep
//完成开发
//查看状态
git status
//选在需要提交的文件放入缓存区域
git add *.java
git add *.xml
//提交
git commit -m "message"
//同步代码
git pull
//此时没有冲突,直接推送到远端
git push
dep分支受保护不能push的情况
//拉取代码
git clone url
//切换到dep分支
git checkout dep
//创建自己的分支
git checkout -b myBranch
//完成开发
//查看状态
git status
//选在需要提交的文件放入缓存区域
git add *.java
git add *.xml
//提交
git commit -m "message"
//切换到公共分支
git checkout dep
//更新--更新成功后,公共分支已经是最新代码
git pull
//切换到自己分支
git checkout myBranch
//将最新更新的代码合并到自己分支
git merge dep
//此时没有冲突,就可以在github上发送合并请求,将自己的分支合并到dep,等待上级批准
五、冲突解决
什么情况是出现冲突?
修改到同一个文件&&改到了同一个位置
修改同一个文件没有修改到同一个位置,git会自动进行解决
冲突出现的操作
git pull //更新
git merge //合并
首先 git pull = git fetch + git merge
当存在冲突的时候git pull 只执行了 git fetch,不能自动进行合并,这个时候,我们使用
git status
会查看到冲突文件,还会查看到很多自己没有修改的文件已经放到了缓存区域
使用 git add 将冲突文件放入缓存区域,解决冲突
因为有冲突,merge失败,这个时候需要把拉取下来的代码(这些自己没有修改过的,但是又是绿色的文件)commit一下,所以这个时候commit不是自己修改的代码是正常的。完成提交后就可以进行push了,同样merge过来的代码也是相同的操作
六、踩过的坑
- 克隆的代码不一样?
可能没有切换分支 - git push 会覆盖别人代码吗?
在没有进行同步的时候,push会失败,只有同步了或者是解决了冲突才能成功,所以没有更新直接push不会覆盖,会push失败 - git checkout
在所有的文件都commit的情况下,git checkout 不会出现问题,commit后每个分支都是并行存在的,对于没有commit,切换过去会将修改内容一起带过去,这个时候可能会发生冲突,建议git checkout 之前,讲差异进行commit