Git:一篇学会Git
集中式版本控制系统和分布式版本控制系统的区别
集中式版本控制系统
集中式版本控制系统简单理解是:在远程服务器由版本控制系统统一管理代码,开发人员可通过客户端连接工具连接远程服务器,拉取代码到本地;只有当开发人员提交到远程服务器时,由远程服务器作版本控制。典型代表有SVN。缺点:当远程服务器挂了,开发人员就提交不了代码,也就代码暂时不受版本控制
分布式版本控制系统
分布式版本控制系统简单理解是:可像集中式版本控制系统,在远程服务器统一来管理代码,但版本的控制不再是远程服务器,由本地控制。可把本地已提交的代码,以推送的方式再推送到远程服务器
典型代表有Git。优点:当远程服务器挂了,开发人员可以继续提交代码,只不过暂时推送不到远程服务器罢了
分布式版本控制系统代表:Git
Git允许我们在本地进行版本控制,他为我们划分了3个区域:
- 工作区: 有.git所在的文件夹即是工作区,也是我们写代码的地方,也是我们本地能直接看到的
- 暂存区:临时存储的区域,不受版本控制,在文件夹上未体现。
- 本地库: 代码已提交的区域,受版本控制,在文件夹上未体现。
大家可简单理解成这样:git为我们的仓库复制了3份,3个区域各一份;而工作区的代码是我们能直接看到并操作的,而暂存区和本地库是文件夹上看不到的。
本地库和远程库
- 本地库是我们本地已提交的代码的地方,且能受版本控制
- 远程库通常是公司统一管理代码的地方,最新最正式的代码都要以这里为准
git常用命令
命令 | 作用 | 备注 |
---|---|---|
git config --global user.name 用户名 | 设置用户签名 | 安装git后首次使用即可,这里和以后本地库推送和拉取远程库的那个账号密码没有关系 |
git config --global user.email 邮箱 | 设置用户签名 | 安装git后首次使用即可,这里和以后本地库推送和拉取远程库的那个账号密码没有关系 |
git init | 初始化本地库 | 切换到A文件夹下,使用该命令,则A文件夹作为git仓库 |
git status | 查看当前可追加和可提交的文件 | 红色标记的文件为可追加文件,绿色标记文件为可提交文件 |
git add 文件名 | 将未追踪状态的文件进行追加到暂存区 | 【git add .】 |
git commit -m "日志信息" 文件名 | 将已追踪文件提交到本地库 | |
git reflog | 查看历史提交记录 | |
git reset --hard 版本号 | 切换到指定版本 | |
git rm --cached 文件名 | 将暂存区的文件进行删除 |
命令详解
git reflog
git reflog:可查看历史提交版本;如下:
HEAD表示指针,正指向master分支(有master的那个分支正是当前分支)0;当有(HEAD -> master)的那个版本就是我们当前本地库当前的分支!
git reset
git reset是切换历史版本,最常用用的是:git reset --hard 版本号;当切换了版本,也是被日志记录起来的,如下:
分支
通常在实际开发中,都会创建多个分支,有生产分支,测试分支,开发分支等等,确保分支间的代码不受影响;即使开发代码有问题了,也不会影响到其他分支代码的正常使用
分支常用命令
命令 | 作用 | 备注 |
---|---|---|
git branch -v | 查看分支情况 | 结果前面带*的为目前所在分支 |
git branch 分支名 | 创建分支 | 创建分支,可以理解为将当前的仓库重新复制了一份,和其他分支区分开(实际底层不是复制,而是指针); |
git checkout 分支名 | 切换分支 | 切换分支后,仓库下的文件会变成该分支下的状态 |
git merge 分支名 | 合并分支 | 是当前分支使用该命令去合并其他分支,比如说master分支要合并dev分支的代码,需要切换到master分支,然后执行git merge dev |
注意:不同的分支,他们的3个区域是不同的,是独立存在的。并且A分支要合并B分支时,B分支修改的代码先要提交到B分支的本地库,A分支才能合并有效
合并分支冲突解决
在实际开发,冲突是避免不了。冲突发生的主要原因是:不同分支同一个文件的同一个位置都进行了修改,在进行合并时,就会发生合并失败的情况;
在实际开发的解决步骤如下:
- 假设master分支去合并dev分支发生冲突了,这时候会出现下面的提示:
- 当合并失败时,git会把冲突的文件自动合并一份到工作区,但是在暂存区和本地库是不会有的;这时候我们需要手动的去处理工作区自动合并的文件,如下:
- 假设冲突的文件处理好了。还是正常的 git add 操作,但在commit时就不能像以前一样。只能git commit 或 git commit -m "message",不能带文件名。
- 根据上述的过程,冲突就会解决,之前的(master | merging) 变成 (master) 就表示合并成功了,如下:
Git团队协作场景
本团队内协作
流程如下,已有文字说明:
注:能直接对远程库进行推送和克隆的人,是需要先加入到团队里面,并且管理员进行授权的
跨团队协作
开发中有可能会存在:需要其他公司来参与项目的开发,但可能由于某种原则,其他公司人员不能加入到团队中,这时候就要如下图的操作流程:
Git结合Github使用
创建远程库并推送代码
- 先创建远程库:
- 查看目前有哪些链接有别名
命令:git remote -v,可查看当前链接别名情况 - 为指定链接创建别名
命令:git remote add 别名 链接地址 - 推送指定分支的本地库代码到远程库
命令:git push 链接名/别名 远程分支名
当远程库代码被修改时,要更新本地库
如果要拉取远程库的代码,需要指定地址和分支,命令: git pull 链接名/别名 远程库分支名
克隆远程库代码到本地
命令:git clone 链接名;这里可暂时不用别名,因为当进行克隆操作时,实际上git把我们做了3件事
- 拉取远程仓库总文件夹A到当前的B文件夹下
- 将A文件夹进行初始化成git仓库
- 为远程库链接创建别名;可使用 git remote -v查看
团队内协助
如果A刚进去公司,公司项目是放在github的某个远程库上,A需要先克隆项目下来,克隆完后完成相应的功能开发,要推送到远程库,这时是推送不上去,需要下面的操作:
-
仓库管理员需要邀请A加入团队
-
将邀请函链接发给A
-
A访问邀请函链接,A要同意管理员发送的邀请请求
-
当同意后,可推送代码到远程库。命令:git push 链接名/别名 远程分支名
-
其他成员可拉取A提交的代码。命令:git pull 链接名/别名 远程分支名
SSH免密登录
每次在拉取和推送时都要输入用户名和密码显然是很麻烦的事,其实可以通过https和ssh两种方式来进行免密登录,但由于在公司里ssh用得更多,下面就讲下ssh免密登录配置,步骤如下:
- 打开git bash客户端,输入ssh-keygen -t rsa -C 自己的邮箱;然后连续点击空格3次即可
- 复制 .ssh文件夹(在用户家目录下)下的id_rsa.pub文件内容,去github上面进行配置,如下:
到这里就已经完成了。后面如果要访问仓库地址,就可直接用ssh的地址,如下:
Git结合IDEA使用
环境准备
有一些文件如.class .imi等文件是不需要提交到本地库和远程库的,因此我们只需要先配置好忽略提交的文件信息,操作如下:
1.在用户家目录下,即.gitconfig所在目录下,创建git.ignore文件,将下面的内容粘贴进去:
# Compiled class file
*.class
# Eclipse
.project
.classpath
.settings/
# Intellij
*.ipr
*.iml
*.iws
.idea/
# Maven
target/
# Gradle
build
.gradle
# Log file
*.log
log/
# out
**/out/
# Mac
.DS_Store
# others
*.jar
*.war
*.zip
*.tar
*.tar.gz
*.pid
*.orig
temp/
- 打开 .gitconfig文件,配置第一步文件的路径信息,如下:
[core]
excludesfile = C:/Users/xiaoming/git.ignore
- 在idea配置git的路径信息,如下:
- 这样环境就准备好了
idea常见Git操作
idea初始化仓库
idea添加文件到暂存区
如果是文件夹级别添加到暂存区,取消下面的提示,请选择“cancel”,如下:
idea提交文件到本地库
idea查看提交日志
idea切换版本
idea创建分支
idea切换分支
idea合并分支
合并分支出现冲突
当合并出现冲突时,会出现下面的弹框:
Accept Yours:只接受当前分支所作出的修改
Accept Theirs:只接受其他分支所作出的修改
Merge:手动合并
通常是选择第3个来手动合并,如下:
最后手动合并的最终结果以中间的为准,如果确定中间的合并结果没问题,点击【Apply】即可
idea克隆远程库项目