• git常用命令(测试必备)


    什么是git

    百度百科:Git(读音为/gɪt/)是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。

    git相对svn,有很多优势,这里就不再赘述,大家网上搜索吧。

    git的操作流程是:比如我们在本地对项目做更新操作,到最后推送到远程仓库,需要经历这几个步骤:

      0.在工作区更新项目

      1.添加到暂存区(add)

      2.提交到本地仓库(commit)

      3.推送到远程仓库(push)

    git安装

    详见:https://www.cnblogs.com/UncleYong/p/10767747.html

    git基础命令

    虽然有git客户端,但是建议还是用命令进行操作,因为命令会了,一个简单的图形界面客户端是很easy的,信不信由你。

    git --version,查看版本

    git init,初始化本地仓库(创建一个文件夹,进入这个文件夹,执行git init)

    新增文件

    git status,查看状态

    git add,将文件添加到暂存区

    git commit,文件提交到本地仓库

    提示:

    git在commit前,需要初始化配置:设置仓库人员的用户名和邮箱地址,这一步必不可少(参考:https://www.cnblogs.com/UncleYong/p/6892171.html

      git config --global user.name "uncleyong"

      git config --global user.email "168632201@qq.com"

    再次执行commit操作

    git push,推送到远程仓库

    因为我们还没有关联远程仓库,所以暂时不执行

    先在远程仓库上创建一个项目(如果没有账号,可以注册一个,https://gitee.com

    输入仓库名称,然后保存即可

    复制远程仓库地址:https://gitee.com/UncleYong/git_test.git

    git remote add添加远程仓库,origin可以理解为一个别名

    推送到远程仓库

    master表示推送到master分支(主干分支),-f参数,就是表示强制,由于我们创建的是空项目,所以哪怕里面有内容,也会被覆盖掉(所以,这个参数要慎用

    输入账号

    输入密码(也可以配置ssh通信方式,这样可以不用每次都输入密码:https://www.cnblogs.com/UncleYong/p/6891958.html

    推送成功

    访问:https://gitee.com/UncleYong/git_test

    可以看到,刚刚新增的test.txt文件已经被推送到远程仓库

    但是,通常,项目不是我们创建的,那么:

      如果我们本地没有这个项目,我们就要先把项目拉到本地,git clone,做了更新后,再走上面的流程

      如果我们本地已经有这个项目,但是可能不是最新了,比如你的同事往远处仓库提交了代码,此时,你本地的也做了修改,但是还没提交,但是你要把远程的拉下来,

        操作方式一:git pull,会把你做的修改覆盖掉(git pull = git fetch + git merge),所以不推荐,除非你不想保留你的修改

        操作方式二:先git fetch,然后git merge将远程的变更合并到本地仓库(下面的分支合并详细讲解)。

    git提交更改

    克隆空项目,从头开始

    test2.txt提交到暂存区

    git reset HEAD 文件名,移除提交到暂存区的文件

    git reset HEAD^ 或者 commitid,取消上一次的提交

    把之前的提交了

    两次提交记录

     变成一次提交记录了

    把上次的提交了

    git reset --soft  HEAD^:回到上次提交前的状态,也就是暂存区的状态

    第二次提交没了,但是文件在暂存区

    下面结果说明,执行git reset --soft后,工作区和暂存区的内容不会改变

    修改提交信息,再次提交记录

    另外,还有下面两个,大家自己实践吧。

    git reset --mixed (默认选项)将HEAD指向指定的提交,暂存区的内容随之改变,工作区内容不变

    git reset --hard 将HEAD指向指定的提交,暂存区跟工作区都会改变

    把之前的提交了

    git reset --hard HEAD^

     

    git分支

    每个项目,一般有多个分支,比如master(主干分支)、开发分支、测试分支、生产bug分支等等,一个分支不受其它分支的影响,

    但是,分支越多,后期合并分支的成本越大,所以,不要随便创建不必要的分支。

    创建分支:git branch 分支名,分支名不要包含特殊符号,比如*,/,等等,要见其知意,另外,还可以创建并切换分支:git checkout -b 分支名

    查看本地所有分支:git branch,分支前面有*号的表示该分支为当前所在分支

    修改本地分支名:git branch -m 旧分支名 新分支名

    切换分支:git checkout 分支名

    删除本地分支:git branch -d 分支名,但是不能删除当前所在的分支

    切换到master再删除

     

    其它

    查看本地所有分支:git branch
    查看远程所有分支:git branch -r
    查看本地和远程的所有分支:git branch -a
    删除远程分支:git push origin --delete <branchname>
    重命名本地分支:git branch -m <oldbranch> <newbranch>
    重命名远程分支:先删除远程待修改分支,然后push本地新分支到远程服务器
    
    git中一些选项解释:
    -d
    --delete:删除
    
    -D
    --delete --force的快捷键
    
    -f
    --force:强制
    
    -m
    --move:移动或重命名
    
    -M
    --move --force的快捷键
    
    -r
    --remote:远程
    
    -a
    --all:所有
    

    从主干分支拉取新分支开发

    从master主干拉取一个新分支,需要先切换到master分支,并且更新到最新,然后创建分支并且关联远程仓库

    HEAD文件记录了当前分支

    HEAD文件内容:

    创建新分支

    HEAD文件内容:

    可以修改内容后再push,但是最好先把初始分支push到远程仓库

    git push --set-upstream origin dev01

    拉取指定分支

    git clone -b dev01 https://gitee.com/yncleyong/git_test.git

    拉取所有分支,先clone,再fetch

    先克隆master,再fetch

    克隆master

    git clone git@gitee.com:UncleYong/my_rf_no_open.git
    或者:
    git clone -b master git@gitee.com:UncleYong/my_rf_no_open.git


    cd my_rf_no_open/


    git clone git@gitee.com:UncleYong/my_rf_no_open.git dev01

    会在 my_rf_no_open/ 目录下生成一个文件夹dev01,显然是不对的

    git pull git@gitee.com:UncleYong/my_rf_no_open.git dev01

    提示合并,显然用pull不对

    git fetch git@gitee.com:UncleYong/my_rf_no_open.git dev01

    或者git fetch origin dev01

    内容是master

    内容是

    先克隆非master,再fetch

    git clone -b master git@gitee.com:UncleYong/my_rf_no_open.git

    git fetch git@gitee.com:UncleYong/my_rf_no_open.git master

    几个git分支切换的问题

    问题一

    git clean -d -fx,表示删除一些没有git add的文件;
    
    git clean 参数 
    -n 显示将要删除的文件和目录
    -x -----删除忽略文件已经对git来说不识别的文件
    -d -----删除未被添加到git的路径中的文件
    -f -----强制运行 

    问题二:

    git log

    用于查看提交历史(commit的记录),显示的顺序是由近到远

    显示的log的含义:

    commit id,每个id都是唯一的

    Author,初始化时候的配置信息,作者及邮箱

    Date,提交日期

    xxx,commit -m的提交说明

    查看最近n次的提交:git log -n,n是数字

    查看指定作者的提交,如果没有,就显示空:git log --author xxx

    概要显示:git log --oneline 

    git log --graph,一条线串联整个提交历史

    显示最近n次提交的不差异:git log -p -n,n是数字

    git diff

    克隆空项目,从头开始

    比较工作区和暂存区的差异(如果暂存区没有,就和当前分支本地仓库比较):git diff

    比较暂存区和工作区的差异:git diff --cached

    比较工作区和当前分支本地仓库的差异:git diff HEAD,HEAD是指向当前分支的指针

    新增文件

    如果暂存区和当前分支本地仓库都没内容,执行git diff,结果就为空

    提交到本地仓库

    下面执行的git diff结果为空,因为工作区为空

    修改文件

    上面修改后,不add

    结果说明:如果暂存区没有内容,但是当前分支本地仓库有内容,执行git diff,是工作区和本地仓库对比,

    add后,git diff没有结果,因为工作区为空

    下图表示暂存和当前分支本地仓库对比

    再次修改

    上面修改后,不add

    下面执行结果说明:  

      如果暂存区有内容,不管当前分支本地仓库是否有内容,执行git diff,是工作区和暂存区对比,

      如果暂存区没有内容,但是当前分支本地仓库有内容,执行git diff,是工作区和本地仓库对比,  

     工作区和当前分支本地仓库对比

    把上面的都提交了

    查看当前分支跟指定的分支的差异:git diff 分支名

    创建并切换到test分支

    然后修改文件

    和master分支比较

    查看两个指定分支(已提交的)的差异(后者和前者的差异):git diff 分支名1 分支名2

    提交前,没有输出结果

    提交后,有输出结果

    查看指定文件的差异(比较工作区和暂存区):git diff 文件名

    修改

    列出两个历史提交的差异(后者与前者相比):git diff commitid1 commitid2

    git diff --stat,列出有变更的文件,不显示变更的具体内容

    也可以比较两个分支(后者与前者相比)

    补充,git diff结果的含义

    diff --git a/text.txt b/text.txt,表示文件text.txt的两个版本
    --- a/text.txt,---表示更改前的文件
    +++ b/text.txt,+++表示更改后的文件
    @@ -2,3 +2,4 @@ hello test,文件差异的区域,-2,3表示变更前从第2行开始,到第3行,+2,4表示变更后从第2行开始,到第四行
    第一次修改
    第二次修改
    test分支:第一次修改
    +test分支:第二次修改,+表示新增了一行,-表示删除了一行,如果对一行内容进行修改,在此处体现出来的就是先删除一行,再新增一行

    分支合并&冲突解决

    git merge 分支名,表示用指定分支和当前分支进行合并

    克隆空项目,从头开始

    再创建一个文件并提交

    创建并切换到分支test

    修改文件

    提交

    切换到master分支,test2.txt内容没有变

    合并分支,然后可以看到test分支修改的内容

    切换到test分支

    修改文件

    提交

    切到master分支

    修改同一个文件

    提交

    合并test,产生冲突

    文件内容

    最终改为test分支上的

    提交

    查看冲突的文件:git diff --name-only --diff-filter=U

    回退并查看冲突文件

    其它相关

    git在windows及linux(源码编译)环境下安装:https://www.cnblogs.com/uncleyong/p/10767747.html

    git常用命令(测试必备):https://www.cnblogs.com/uncleyong/p/10854115.html

    git常用命令速查表https://www.cnblogs.com/uncleyong/p/11926737.html

    如何获取gitee上的项目?:https://www.cnblogs.com/uncleyong/p/10850182.html

    git fetch 和git pull 的差别:https://www.cnblogs.com/uncleyong/p/10655081.html

    老铁,这年头得玩玩这个:Git基本操作【github】:https://www.cnblogs.com/uncleyong/p/6892171.html

    本地Git与GitHub服务器建立连接(SSH方式通信):https://www.cnblogs.com/uncleyong/p/6891958.html

    更新本地git仓库的远程地址(remote地址):https://www.cnblogs.com/uncleyong/p/7106541.html

    ssh-key 与 git账户配置以及多账户配置,以及通信方式从https切换到ssh:https://www.cnblogs.com/uncleyong/p/9668249.html

    本地仓库推送到远程仓库:fatal: refusing to merge unrelated histories:https://www.cnblogs.com/uncleyong/p/10654244.html

    在浏览器中浏览git上项目目录结构:https://www.cnblogs.com/uncleyong/p/10659295.html

    push的时候报错:Permission denied (publickey):https://www.cnblogs.com/uncleyong/p/10676922.html

  • 相关阅读:
    原生JS写轮播图(转自https://www.cnblogs.com/LIUYANZUO/p/5679753.html)
    用JS写成简易计算器(转自https://mp.weixin.qq.com/s/Jxe3V7D0PFLvIFNZPlSyNg)
    Js获取当前日期时间的方法
    三元运算符的应用(转自百度百科)
    <pre> 标签的简要作用(以前未接触过的)
    用JavaScript实现两种功能:1、切换全选/全不选文字;2、根据选中个数更新全选框状态;(实例代码来自view-source:http://www.fgm.cc/learn/lesson2/12.html)
    Windows 网络通讯开发
    函数指针的使用
    cin的使用问题
    markdown简介
  • 原文地址:https://www.cnblogs.com/uncleyong/p/10854115.html
Copyright © 2020-2023  润新知