什么是git

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

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

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

  0.在工作区更新项目

  1.添加到暂存区(add)

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

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

git安装

详见​

git基础命令

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

git --version,查看版本

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

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

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

新增文件

git status,查看状态

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

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

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

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

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

提示:

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

git在commit前,需要初始化配置:设置仓库人员的用户名和邮箱地址,这一步必不可少(

  git config --global user.name "uncleyong"

  git config --global user.email "

再次执行commit操作

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

git push,推送到远程仓库

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

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

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

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

git常用命令(测试必备)_暂存区_09

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

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

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

git常用命令(测试必备)_暂存区_11

推送到远程仓库

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

输入账号

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

输入密码(也可以配置ssh通信方式,这样可以不用每次都输入密码:

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

推送成功

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

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

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

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

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

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

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

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

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

git提交更改

克隆空项目,从头开始

git常用命令(测试必备)_暂存区_16

test2.txt提交到暂存区

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

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

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

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

把之前的提交了

两次提交记录

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

 变成一次提交记录了

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

把上次的提交了

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

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

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

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

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

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

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

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

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

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

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

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

把之前的提交了

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

git reset --hard HEAD^

git常用命令(测试必备)_暂存区_27 

git分支

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

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

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

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

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

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

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

git常用命令(测试必备)_暂存区_30

切换分支:git checkout 分支名

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

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

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

切换到master再删除

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


其它

查看本地所有分支: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分支,并且更新到最新,然后创建分支并且关联远程仓库

git常用命令(测试必备)_暂存区_34

HEAD文件记录了当前分支

git常用命令(测试必备)_暂存区_35

HEAD文件内容:

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

创建新分支

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

HEAD文件内容:

git常用命令(测试必备)_暂存区_38

可以修改内容后再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常用命令(测试必备)_git_39


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

或者git fetch origin dev01

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


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

内容是master

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


git常用命令(测试必备)_暂存区_43


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

内容是

git常用命令(测试必备)_暂存区_45


先克隆非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_46


几个git分支切换的问题

问题一

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


git clean -d -fx,表示删除一些没有git add的文件;

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



问题二:

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



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



git log

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

git常用命令(测试必备)_暂存区_50

显示的log的含义:

commit id,每个id都是唯一的

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

Date,提交日期

xxx,commit -m的提交说明

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

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

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

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

概要显示:git log --oneline 

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

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

git常用命令(测试必备)_暂存区_54

git常用命令(测试必备)_暂存区_55

git常用命令(测试必备)_暂存区_56

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

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

git diff

克隆空项目,从头开始

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

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

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


新增文件

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

git常用命令(测试必备)_暂存区_58

提交到本地仓库

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

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

修改文件

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

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

上面修改后,不add

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

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

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

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

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

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

再次修改

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

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

上面修改后,不add

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

下面执行结果说明:  

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

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

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

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

git常用命令(测试必备)_暂存区_69


把上面的都提交了

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

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

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


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

创建并切换到test分支

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

然后修改文件

git常用命令(测试必备)_暂存区_74

git常用命令(测试必备)_暂存区_75

和master分支比较

git常用命令(测试必备)_暂存区_76


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

提交前,没有输出结果

git常用命令(测试必备)_暂存区_77

提交后,有输出结果

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


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

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

修改

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

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


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

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

git常用命令(测试必备)_暂存区_83


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

git常用命令(测试必备)_暂存区_84

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

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

补充,git diff结果的含义

git常用命令(测试必备)_暂存区_86

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 分支名,表示用指定分支和当前分支进行合并

克隆空项目,从头开始

git常用命令(测试必备)_暂存区_87

再创建一个文件并提交

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

创建并切换到分支test

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

修改文件

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

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

提交

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

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

git常用命令(测试必备)_暂存区_93

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

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


切换到test分支

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

修改文件

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

git常用命令(测试必备)_暂存区_97

提交

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


切到master分支

git常用命令(测试必备)_暂存区_99

修改同一个文件

git常用命令(测试必备)_暂存区_100

git常用命令(测试必备)_暂存区_101

提交

git常用命令(测试必备)_暂存区_102

合并test,产生冲突

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

文件内容

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


最终改为test分支上的

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

git常用命令(测试必备)_暂存区_106

提交

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

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

回退并查看冲突文件

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




============================= 提升自己 ==========================

如有侵权,请联系删除。

============================= 升职加薪 ==========================