Git:一篇学会Git

集中式版本控制系统和分布式版本控制系统的区别

集中式版本控制系统

集中式版本控制系统简单理解是:在远程服务器由版本控制系统统一管理代码,开发人员可通过客户端连接工具连接远程服务器,拉取代码到本地;只有当开发人员提交到远程服务器时,由远程服务器作版本控制。典型代表有SVN。缺点:当远程服务器挂了,开发人员就提交不了代码,也就代码暂时不受版本控制

分布式版本控制系统

分布式版本控制系统简单理解是:可像集中式版本控制系统,在远程服务器统一来管理代码,但版本的控制不再是远程服务器,由本地控制。可把本地已提交的代码,以推送的方式再推送到远程服务器
典型代表有Git。优点:当远程服务器挂了,开发人员可以继续提交代码,只不过暂时推送不到远程服务器罢了

分布式版本控制系统代表:Git

Git允许我们在本地进行版本控制,他为我们划分了3个区域:

  1. 工作区: 有.git所在的文件夹即是工作区,也是我们写代码的地方,也是我们本地能直接看到的
  2. 暂存区:临时存储的区域,不受版本控制,在文件夹上未体现。
  3. 本地库: 代码已提交的区域,受版本控制,在文件夹上未体现。

大家可简单理解成这样:git为我们的仓库复制了3份,3个区域各一份;而工作区的代码是我们能直接看到并操作的,而暂存区和本地库是文件夹上看不到的。

本地库和远程库

  1. 本地库是我们本地已提交的代码的地方,且能受版本控制
  2. 远程库通常是公司统一管理代码的地方,最新最正式的代码都要以这里为准

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:可查看历史提交版本;如下:
image
HEAD表示指针,正指向master分支(有master的那个分支正是当前分支)0;当有(HEAD -> master)的那个版本就是我们当前本地库当前的分支!

git reset

git reset是切换历史版本,最常用用的是:git reset --hard 版本号;当切换了版本,也是被日志记录起来的,如下:
image

分支

通常在实际开发中,都会创建多个分支,有生产分支,测试分支,开发分支等等,确保分支间的代码不受影响;即使开发代码有问题了,也不会影响到其他分支代码的正常使用

分支常用命令

命令 作用 备注
git branch -v 查看分支情况 结果前面带*的为目前所在分支
git branch 分支名 创建分支 创建分支,可以理解为将当前的仓库重新复制了一份,和其他分支区分开(实际底层不是复制,而是指针);
git checkout 分支名 切换分支 切换分支后,仓库下的文件会变成该分支下的状态
git merge 分支名 合并分支 是当前分支使用该命令去合并其他分支,比如说master分支要合并dev分支的代码,需要切换到master分支,然后执行git merge dev

注意:不同的分支,他们的3个区域是不同的,是独立存在的。并且A分支要合并B分支时,B分支修改的代码先要提交到B分支的本地库,A分支才能合并有效

合并分支冲突解决

在实际开发,冲突是避免不了。冲突发生的主要原因是:不同分支同一个文件的同一个位置都进行了修改,在进行合并时,就会发生合并失败的情况;
在实际开发的解决步骤如下:

  1. 假设master分支去合并dev分支发生冲突了,这时候会出现下面的提示:
    image
  2. 当合并失败时,git会把冲突的文件自动合并一份到工作区,但是在暂存区和本地库是不会有的;这时候我们需要手动的去处理工作区自动合并的文件,如下:
    image
  3. 假设冲突的文件处理好了。还是正常的 git add 操作,但在commit时就不能像以前一样。只能git commit 或 git commit -m "message",不能带文件名。
  4. 根据上述的过程,冲突就会解决,之前的(master | merging) 变成 (master) 就表示合并成功了,如下:
    image

Git团队协作场景

本团队内协作

流程如下,已有文字说明:
image
注:能直接对远程库进行推送和克隆的人,是需要先加入到团队里面,并且管理员进行授权的

跨团队协作

开发中有可能会存在:需要其他公司来参与项目的开发,但可能由于某种原则,其他公司人员不能加入到团队中,这时候就要如下图的操作流程:
image

Git结合Github使用

创建远程库并推送代码

  1. 先创建远程库:
    image
  2. 查看目前有哪些链接有别名
    命令:git remote -v,可查看当前链接别名情况
  3. 为指定链接创建别名
    命令:git remote add 别名 链接地址
  4. 推送指定分支的本地库代码到远程库
    命令:git push 链接名/别名 远程分支名

当远程库代码被修改时,要更新本地库

如果要拉取远程库的代码,需要指定地址和分支,命令: git pull 链接名/别名 远程库分支名

克隆远程库代码到本地

命令:git clone 链接名;这里可暂时不用别名,因为当进行克隆操作时,实际上git把我们做了3件事

  1. 拉取远程仓库总文件夹A到当前的B文件夹下
  2. 将A文件夹进行初始化成git仓库
  3. 为远程库链接创建别名;可使用 git remote -v查看

团队内协助

如果A刚进去公司,公司项目是放在github的某个远程库上,A需要先克隆项目下来,克隆完后完成相应的功能开发,要推送到远程库,这时是推送不上去,需要下面的操作:

  1. 仓库管理员需要邀请A加入团队
    image

  2. 将邀请函链接发给A
    image

  3. A访问邀请函链接,A要同意管理员发送的邀请请求
    image

  4. 当同意后,可推送代码到远程库。命令:git push 链接名/别名 远程分支名

  5. 其他成员可拉取A提交的代码。命令:git pull 链接名/别名 远程分支名

SSH免密登录

每次在拉取和推送时都要输入用户名和密码显然是很麻烦的事,其实可以通过https和ssh两种方式来进行免密登录,但由于在公司里ssh用得更多,下面就讲下ssh免密登录配置,步骤如下:

  1. 打开git bash客户端,输入ssh-keygen -t rsa -C 自己的邮箱;然后连续点击空格3次即可
  2. 复制 .ssh文件夹(在用户家目录下)下的id_rsa.pub文件内容,去github上面进行配置,如下:
    image
    image
    image
    到这里就已经完成了。后面如果要访问仓库地址,就可直接用ssh的地址,如下:
    image

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/
  1. 打开 .gitconfig文件,配置第一步文件的路径信息,如下:
[core]
    excludesfile = C:/Users/xiaoming/git.ignore
  1. 在idea配置git的路径信息,如下:
    image
  2. 这样环境就准备好了

idea常见Git操作

idea初始化仓库

image

idea添加文件到暂存区

image
如果是文件夹级别添加到暂存区,取消下面的提示,请选择“cancel”,如下:
image

idea提交文件到本地库

image

idea查看提交日志

image

idea切换版本

image

idea创建分支

image

idea切换分支

image

idea合并分支

image

合并分支出现冲突

当合并出现冲突时,会出现下面的弹框:
image
Accept Yours:只接受当前分支所作出的修改
Accept Theirs:只接受其他分支所作出的修改
Merge:手动合并
通常是选择第3个来手动合并,如下:
image
最后手动合并的最终结果以中间的为准,如果确定中间的合并结果没问题,点击【Apply】即可

idea克隆远程库项目

image
image

idea推送和拉取

image

idea结合github

idea配置github账号

image

posted @ 2022-03-20 17:42  爱编程DE文兄  阅读(90)  评论(0编辑  收藏  举报