Git版本管理器

149 阅读11分钟

截屏2023-05-28 01.51.53.png

用户信息

1.配置用户信息 
    git config —global user.name xxx 
    git config —global user.email [xxx.com](http://xxx.com)
2.检查配置的用户信息 git config —list

初始化本地仓库

git init

git工作流程:

1.在工作区中添加/修改文件

2.把工作区的文件提交到暂存区

3.把暂存区的文件列表信息提交到仓库

跟踪文件

1.查看文件当前所处状态 git status

    未跟踪状态 untracked

2.对文件进行跟踪 git add 要跟踪的文件名/若是多个文件则为.

    已放置缓存区,待提交状态 to be committed

3.提交文件 git commit -m ‘提交信息’

    已提交状态 clean

修改文件

1.查看状态 git status

    本地修改但未添加至缓存区 not staged

2.添加至缓存区 git add 文件

    查看状态 modified

3.提交到本地仓库 git commit -m ‘提交信息’

4.查看提交记录 git log

让每次的提交信息显示在一行

git log —online

删除文件

git rm 文件   //工作/缓存区都被删除

撤销本地文件的修改

把文件从暂存区域恢复到工作区,用来丢弃本地修改

    1.git restore 文件名

    2.git checkout  文件名

切换分支

git switch 文件

还原工作区文件

git restore 文件名

取消暂存

恢复暂存区,将内容从本地仓库恢复到暂存区

    1.git restore —staged 文件

    2.git reset 文件/—文件

跳过暂存区

1.git commit (file|-a) -m ‘提交信息’

    -a 选项,git会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过git add步骤。但不会将未跟踪文件变为已跟踪

        git commit 文件名 -m ‘提交信息’//提交本地指定文件到仓库

        git commit -a -m ‘提交信息’ //提交当前目录下所有跟踪的文件

2.git checkout HEAD —file

    使用最后一次提交的内容,覆盖暂存区和工作区

版本回退

1.git reset [回退版本]

    将暂存区回退到指定版本,并删除之前的所有提交信息,不更新工作区

2.指定回退的版本

    git reset <commit> 

    git reset HEAD

        HEAD指向当前分支,当前分支指向最新的提交

           HEAD说明:当前版本HEAD/HEAD~0

                    上一个版本HEAD^/HEAD~1

                    上上一个版本HEAD^^/HEAD~2

                    …以此类推

3.git reset —hard HEAD

    —hard参数撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一版本,并删除之前提交的所有信息

撤销提交

1.git revert HEAD

    撤销最新提交,并生成新的提交

2.git revert [-n] HEAD

    撤销最新提交,但新提交需手动提交

设置忽略文件

.gitignore

匹配示例:

    logs/ 忽略当前路径下logs目录或多级路径下的logs目录,包含logs下的所有子目录和文件

    /logs.txt 忽略根目录下的logs.txt文件

    *.class 忽略所有后缀为.class的文件

    !/classes/a.class 不忽略classees目录下的a.class文件

    tmp/*.txt 只忽略tmp目录下的.txt文件

    **/foo 忽略/foo,a/foo,a/b/foo……

比较文件差异

1.git diff

    对比工作区与暂存区的变化,显示未暂存的改动

2.git diff —cached|—staged

    对比本地仓库的最新版本与暂存区的变化,显示未提交的改动

3.git diff commit1 commit2

    对比本地仓库中两个提交版本的差异,显示commit2在commit1基础上的改动

4.git diff HEAD

    比较仓库中最新版本和工作区的差别

代码托管平台

1.自己搭建git服务器,如安装gitlab的版本管理系统

2.基于git技术实现的第三方托管平台

    GitHub 

    gitee码云

    gitlab

本地添加远程仓库

1.创建远程仓库

2.初始化本地仓库 

    git init

3.为本地添加远程仓库

    .git/config文件中可查看远程仓库的信息

    git remote add <远程仓库简称> <远程仓库url>

4.查看远程仓库

    git remote

5.删除远程仓库

    git remote rm 仓库名

    //仅移除本地与远程仓库的关联,并非将远程仓库从平台删除

6.获取远程仓库代码

    git pull <远程主机名> <远程分支名>

7.推送本地仓库代码到远程仓库

    git push <远程主机名> <本地分支名>:<远程分支名>

    git push <远程主机名> <本地分支名> //本地分支名与远程分支名相同

克隆/推送

1.查看远程仓库地址并复制

2.在本地工作目录打开git bash,输入克隆远程仓库的命令

    git clone 远程仓库地址

3.更改本地工作区的文件,并完成本地工作流

4.推送本地仓库到远程仓库

    git push

拉取

git pull /git pull <remote> <branch>

将远程仓库的数据拉取到本地并进行合并。要直接使用git pull,则要确保设置了跟踪信息

    未设置跟踪信息: git pull

    设置跟踪信息: git branch --set-upstream-to=origin/master

抓取

git fetch  

将远程仓库的数据拉取到本地,但并不会自动合并或修改本地的工作

需使用 git merge 手动合并

    git merge orgin/master

合并冲突

1.制造冲突

    在本地的不同目录中克隆同一个远程仓库。 第一个目录中,更改某个文件,提交推送到远程仓库。 第二个目录中,更改同一个文件,提交推送到远程仓库

2.解决办法 

    在第二个目录下拉取远程仓库的数据,如果有冲突,则会提示

        git pull

    打开冲突的文件,手动更改文件,删除不需要的代码,重新提交更改后的文件

        git add  文件名

        git commit 文件名

    推送到远程仓库

        git push

        //要养成推送之前,先拉取代码的习惯,防止覆盖同事的代码

SSH协议

SSH为 Secure Shell(安全外壳协议)的缩写,是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用SSH协议可以有效防止远程管理过程中的信息泄露问题。本地仓库跟远程仓库数据的传递使用的是https协议,需要 用户名跟密码进行身份验证。使用SSH协议,配置一次,以后每次再传递数据就不需要再使用用户名跟密码进行认证了

ssh-keygen -t rsa //生成一对私钥公钥

码云使用方法/GitHub相同

    打开码云网址https://gitee.com/,登录,打开设置

    点击安全设置里的SSH公钥

    填写公钥,点击确定

    填写当前登录账号的密码进行验证

    打开仓库,复制ssh协议的仓库地址

    进行克隆,推送操作

分支理解

 本质是一个指向 commit 对象的可变指针。Git 会使用 master 作为默认分支,分支在每次提交的时候都会自动向前移动。在进行了若干次提交后,就有了一个指向最后一次提交对象的分支。不同的分支可以指向同一个commit对象

 Git 中的分支实际上是一个包含所指对象校验和(40 个字符 长度 SHA-1 字串)的文件

 HEAD指针指向正在工作中的本地分支,如果只有一个默认的master分支,则HEAD指向master分支。如果有多个分支,切换工作分支,HEAD指针的指向也会更改

分支管理

新建本地分支

    git branch 分支名 //新建分支之前要至少有一个已存在的分支

查看本地所有分支

    git branch //注意看 master 分支前的  *  字符:它表示当前所在的分支

查看各个分支最后一个提交对象的信息

    git branch -v

切换分支

    git checkout 分支名 //切换分支,本地工作区的工作内容也会更换。

新建且切换分支

    git checkout -b 分支名

删除分支

    git branch -d 分支名

合并分支

1.创建新的分支

    git checkout -b 分支名

2.在新分支工作提交内容

    git commit -am ''

3.先切换到被合并的分支,将新分支的提交合并到原来的分支

    git checkout master

    git merge 被合并的分支

4.删除没用的分支

    git branch -d 没用的分支

合并分支冲突

基于master分支,新建开发分支dev

    git checkout -b dev

在dev分支工作,更改本地文件,突然接到新的需求,需要更改线上bug 

提交dev分支的本地工作,并且切换回master分支

    git checkout master

基于master分支,新建bug修复分支hotfix

    git checkout -b hotfix

在hotfix分支,修复bug,修复完成,提交,切换回master分支,将hotfix分支的提交合并到master分支

    git checkout master 

    git merge hotfix

切换回dev分支,继续工作,工作完成提交

    git checkout dev

切换回master分支,合并dev分支到master分支

    git checkout master 

    git merge dev

重新提交

//可以使用 git status 查阅未合并的冲突。合并分支产生冲突后应该手动合并代码 

储藏

储藏当前的修改  

    git stash

再次切换分支,成功

取出之前储藏的修改,即恢复dev分支的本地工作

先切换到dev分支

    git checkout dev

获取之前储藏的更改

    git stash apply创建远程仓库的分支

远程分支/本地分支区别

远程分支(remote branch )是对远程仓库中的分支的索引。它们是一些无法移动的本地分支,远程分支就像是书签,提醒着你上次连接远程仓库时上面各分支的位置。 我们用 (远程仓库名)/(分支名)  这样的形式表示远程分支。 在本地我们只能移动本地master分支,不能移动远程分支 origin/master。 

从远程仓库克隆项目到本地

在本地master分支修改内容,提交后,本地master分支移动, origin/master分支保持不变。

只有跟服务器通信,远程分支origin/master分支才会移动,比如其他人往远程仓库推送了代码,则远程仓库中,master分支向前移动,我们可以通过 git fetch 获取远程仓库库的最新数据。

通过 git merge orgin/master 将远程分支的变更合并到本地master分 支。

创建远程仓库的分支

1.从本地向远程仓库推送分支

    在本地新建分支 

    推送本地分支到远程仓库

        git push 远程仓库名 本地分支名:远程分支名

    其他协作的小伙伴通过 git fetch 获取远程仓库的分支 

    通过远程分支创建本地分支

        git checkout -b 本地分支 远程分支

    通过 git checkout -b 本地分支名 远程分支名 创建的本地分支会自动跟踪远程分支。

    也可以先在本地新分支,然后 git fetch 获取最新数据,再通过 git merge 远程仓库名/分支名 手动合并到本地分支,但需手动跟踪远程分支

    设置跟踪分支

        git branch --set-upstream-to=origin(远程仓库名)/develop develop

2.在远程仓库直接新建新分支

    通过 git fetch 拉取远程仓库最新数据,并获取远程分支

    通过基于远程分支创建本地分支或者新建本地分支再合并的方式开始开发

删除远程分支

1.在托管平台直接删除

2.在本地通过命令删除

    git push 远程仓库名 --delete 分支名

    删除远程分支,会将本地远程分支这个指针跟服务器上面的 对应分支删除掉,本地分支不会被删除。

标签概念

什么是标签

    标签可以是一个对象(带注解标签),也可以是一个简单的指针 (不带注解标签),用来标注某次提交对象。

    如果只是一个简单的指针,则它就相当于一个不会移动的分支。

    如果是一个对象,则除了保存指向的提交对象的信息之外,还会保存是谁打的标签,什么时间,还可以保存注解信息。(推荐使用)

为什么使用标签 

    我们可以为重要的版本(某个里程碑)打上标签,相当于为这次 提交记录指定一个别名,方便提取文件。比如人们在发布某个软 件版本(比如 v1.0 等等)的时候,经常这么做。

标签跟分支的区别 

    分支会跟着我们的提交移动,指向最新的提交对象,但是标签不 会移动,它就是指向某个固定的提交对象。

标签管理

新建标签     默认情况下,新建的标签指向最新的提交对象。

    git tag -a 标签名 -m '标签说明信息'

        -a  选项意为”创建一个带注解的标签”,如果 不加-a 则创建的是一 个不带注解的标签,一个简单的引用。

        -m  选项则指定了对应的标签说明

    eg: git tag -a v1.0 -m '发布版本v1.0'

查看相应标签的版本信息,并连同显示打标签时的提交对象

    git show 标签名

追加标签 

    git  tag -a 标签名 commitId -m '标签说明信息'

列出所有标签

    git tag

删除标签

    git tag -d 标签名

标签推送、检出

推送标签到远程仓库

    git push 远程仓库名 标签名

通过标签获取对应版本(检出)

    git checkout -b 本地分支名 标签名

   检出的前提是你本地已经有了远程的标签,如果没有,使用git fetch 获取远程仓库最新数据,再执行检出