Git使用完全解析(含实操常用命令)


参考文档 Git使用教程:最详细、最傻瓜、最浅显、真正手把手教!
廖雪峰git教程抽时间可以把视频看完

git结构

先盗个图
在这里插入图片描述

在这里插入图片描述
我们使用图形化软件进行git操作,比如vscode。
操作流程如下:
那么我们每次修改代码保存文件,也就是工作目录
工作目录stage到暂存区。
暂存区commit到本地仓库
本地仓库push的时候就提交到远程仓库(云端版本库)了,比如github 。

为什么Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件。你的每次修改git都会记录并提示你。

git和SVN有什么区别(集中式控制和分布式控制的区别)

  1. 集中式控制:有一个中央服务器就像图书馆,你要改代码先从图书馆借书,改完了再还回去。所以借书还书必须联网。分布式控制:没有中央服务器,每个人电脑上都有一个完整的版本库。如果两个人修改了相同的东西,那么就互相推送给对方,我们就可以看到改变了什么来解决冲突。实际情况中分布式也有一个集中版本控制,但他是为了方便大家修改代码查看修改。
  2. 网络区别 :svn依赖于中央服务器,一旦断网所有机器无法操作,而git是分布式的有本地仓库。断网也能工作只是不能和其他仓库交互。
  3. 安全性区别,如果svn中央服务器挂了,所有人无法提交,并可能丢失版本库,而git因为每个人都有完整的代码,一个人挂了,从另一个人拿就完事了。git还有强大的分支管理能力。

添加公钥

你在本地关联的任何远程库,关联没有问题,但是你以后推送是推不上去的,因为你的SSH Key公钥不在他的账户列表中。这就是git的安全机制。只有添加公钥后才能和远程库进行操作。
具体步骤:

  1. 先本地生成私钥:
    ssh-keygen -t rsa -C "[email protected]" -b 4096
  2. 再远端生成公钥

查看git配置

git --version 检查git 版本
查看git用户名和邮箱地址命令:
git config --global user.name
git config --global user.email

修改当前项目的用户名和邮箱地址:
git config user.name "username"
git config user.email "email" 

修改全局用户名和邮箱地址:
git config --global user.name "username"
git config --global user.email "email"

git status: 显示修改过的东西
git add -A: stage所有已经修改的东西到暂存区
git commit -m ‘comments’ : 提交并填写你的提交评论
git log 查看提交记录

创建.gitignore文件来忽略你的本地配置,比如.idea/来忽略idea配置文件

克隆项目

clone是指从网克隆下来项目放到本地并连接到远程

有时需要ssl校验,所以先取消不然无法克隆
git config --global http.sslVerify fasle

clone远程项目分支到本地
进入到要克隆的文件夹
git clone -b<分支名> <http链接>

扫描二维码关注公众号,回复: 10993034 查看本文章

拉取的项目路径为
在这里插入图片描述

分支

云端创建分支
gitlab上创建分支,选new branch然后输入名字,并选择从哪里创建,从哪里创建相当于一个副本,他和该分支是同级的。我们选择从test创建,则他与test同级。其实相当于完全clone然后他属于你自己。
在这里插入图片描述
当我们云端创建完分支后,可以克隆到本地
然后本地:
git branch查看分支
git checkout <branch name> 切换到某个分支
check out就是切换分支的意思。

对比分支

在vscode中有个gitlen插件可以compare 不同分支的代码。从而比较不同。

git fetch和pull的区别

git fetch是将远程主机的最新内容拉到本地,用户在检查了以后决定是否合并到工作本机分支中。

而git pull 则是将远程主机的最新内容拉下来后直接合并就很可能产生冲突,即:git pull = git fetch + git merge,这样可能会产生冲突,需要手动解决。

撤销

撤销某次commit(未push到远程)

git log查看版本号
git reset HEAD^ 撤销上一次commit
git reset --hard <commit_id>直接回到其中你想要的某个版本号,删除之后的所有更新

撤销某次push

git revert <commit_id> 撤销某次版本号,也就是撤销该次更改,会退到这次的上一次版本
git push 本地修改之后push到远程

本地所有文件直接覆盖远程

git push -f 强制覆盖远程代码

同步master分支代码

当master代码更新了,我们需要获取master的代码更新,假设我们的分支是dev。而我们要同时保留自己分支的更新。那么如何操作?
因为我们在自己dev上已经更新过几次了,不要使用merge request来合并代码。merge request的目的是让双方保持完全一致。

第一种方式:rebase

首先我们要清空我们dev分支和master分支的暂存区保证本地库和远程库一致。
git checkout dev切换到本地dev分支
git rebase master将本地master分支更新到本地dev分支
git push 将本地dev push到远程dev

第二种:merge

git checkout dev切换到本地dev分支
git merge master 把master合并到本地分支,这时还需要添加commit信息
git push 推送

第二种会比第一种在commit上多一条merge的记录,其实操作都一样。

解决冲突

当我们修改了一个文件,而同时别人也修改该文件,我们在rebase的时候就会提示冲突,而不能合并,我们必须解决该冲突之后才能继续。
vscode中本地merge changes栏目下会显示冲突文件

修改并stage冲突文件
stage之后:
git add. 添加文件到暂存区
git rabse --continue
如果还有冲突则继续处理重复上面步骤。
这是修改后本地dev完成。
push推送

合并dev到master分支

个人分支构建完毕后,我们需要让master更新和我们的dev分支相同。我想把自己的代码合并到master,那么就提交一个merge request请求,然后分配给被人处理,或者你自己有权限你也可以自己处理。合并之后master的代码就和你的代码一样了。在提merge request之前,先确保dev更新了最新master,可以减少冲突。
source branch -> dev
target branch -> master
分配给责任人,合并之后,会询问是否删除dev分支。

git面试题

以下内容摘自GIT | GIT常见面试题
5. 你使用过git stash命令吗?你一般什么情况下会使用它?
命令git stash是把工作区修改的内容存储在栈区。
以下几种情况会使用到它:

解决冲突文件时,会先执行git stash,然后解决冲突;
遇到紧急开发任务但目前任务不能提交时,会先执行git stash,然后进行紧急任务的开发,然后通过git stash pop取出栈区的内容继续开发;
切换分支时,当前工作空间内容不能提交时,会先执行git stash再进行分支切换;
7. 能不能说一下git fetch和git pull命令之间的区别?
简单来说:git fetch branch是把名为branch的远程分支拉取到本地;而git pull branch是在fetch的基础上,把branch分支与当前分支进行merge;因此pull = fetch + merge。
8. 使用过git merge和git rebase吗?它们之间有什么区别?
简单的说,git merge和git rebase都是合并分支的命令。
git merge branch会把branch分支的差异内容pull到本地,然后与本地分支的内容一并形成一个committer对象提交到主分支上,合并后的分支与主分支一致;
git rebase branch会把branch分支优先合并到主分支,然后把本地分支的commit放到主分支后面,合并后的分支就好像从合并后主分支又拉了一个分支一样,本地分支本身不会保留提交历史。
10. 之前项目中是使用的GitFlow工作流程吗?它有什么好处?
GitFlow可以用来管理分支。GitFlow工作流中常用的分支有下面几类:

  • master分支:最为稳定功能比较完整的随时可发布的代码,即代码开发完成,经过测试,没有明显的bug,才能合并到 master 中。请注意永远不要在 master 分支上直接开发和提交代码,以确保 master 上的代码一直可用;
  • develop分支;用作平时开发的主分支,并一直存在,永远是功能最新最全的分支,包含所有要发布 到下一个 release 的代码,主要用于合并其他分支,比如 feature 分支; 如果修改代码,新建 feature 分支修改完再合并到 develop 分支。所有的 feature、release 分支都是从 develop 分支上拉的。
  • feature分支;这个分支主要是用来开发新的功能,一旦开发完成,通过测试没问题(这个测试,测试新功能没问题),我们合并回develop 分支进入下一个 release
  • release分支;用于发布准备的专门分支。当开发进行到一定程度,或者说快到了既定的发布日,可以发布时,建立一个 release 分支并指定版本号(可以在 finish 的时候添加)。开发人员可以对 release 分支上的代码进行集中测试和修改bug。(这个测试,测试新功能与已有的功能是否有冲突,兼容性)全部完成经过测试没有问题后,将 release 分支上的代码合并到 master 分支和 develop 分支
  • hotfix分支;用于修复线上代码的bug。**从 master 分支上拉。**完成 hotfix 后,打上 tag 我们合并回 master 和 develop 分支。
    GitFlow主要工作流程
  • 1.初始化项目为gitflow , 默认创建master分支 , 然后从master拉取第一个develop分支
  • 2.从develop拉取feature分支进行编码开发(多个开发人员拉取多个feature同时进行并行开发 , 互不影响)
  • 3.feature分支完成后 , 合并到develop(不推送 , feature功能完成还未提测 , 推送后会影响其他功能分支的开发);合并feature到develop , 可以选择删除当前feature , 也可以不删除。但当前feature就不可更改了,必须从release分支继续编码修改
  • 4.从develop拉取release分支进行提测 , 提测过程中在release分支上修改BUG
    5.release分支上线后 , 合并release分支到develop/master并推送;合并之后,可选删除当前release分支,若不删除,则当前release不可修改。线上有问题也必须从master拉取hotfix分支进行修改;
    6.上线之后若发现线上BUG , 从master拉取hotfix进行BUG修改;
    7.hotfix通过测试上线后,合并hotfix分支到develop/master并推送;合并之后,可选删除当前hotfix ,若不删除,则当前hotfix不可修改,若补丁未修复,需要从master拉取新的hotfix继续修改;
    8.当进行一个feature时 , 若develop分支有变动 , 如其他开发人员完成功能并上线 , 则需要将完成的功能合并到自己分支上,即合并develop到当前feature分支;
    9.当进行一个release分支时 , 若develop分支有变动 , 如其他开发人员完成功能并上线 , 则需要将完成的功能合并到自己分支上,即合并develop到当前release分支 (!!! 因为当前release分支通过测试后会发布到线上 , 如果不合并最新的develop分支 , 就会发生丢代码的情况);
    GitFlow的好处
    为不同的分支分配一个明确的角色,并定义分支之间如何交互以及什么时间交互;可以帮助大型项目理清分支之间的关系,简化分支的复杂度。
发布了103 篇原创文章 · 获赞 94 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/chongbin007/article/details/84665941
今日推荐