什么是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常用命令(测试必备)

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

git常用命令(测试必备)

新增文件

git status,查看状态

git常用命令(测试必备)

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

git常用命令(测试必备)

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

git常用命令(测试必备)

提示:

git常用命令(测试必备)

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常用命令(测试必备)

git push,推送到远程仓库

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

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

git常用命令(测试必备)

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

git常用命令(测试必备)

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

git常用命令(测试必备)

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

git常用命令(测试必备)

推送到远程仓库

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

输入账号

git常用命令(测试必备)

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

git常用命令(测试必备)

推送成功

git常用命令(测试必备)

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

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

git常用命令(测试必备)

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

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

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

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

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

git提交更改

克隆空项目,从头开始

git常用命令(测试必备)

test2.txt提交到暂存区

git常用命令(测试必备)

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

git常用命令(测试必备)

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

把之前的提交了

两次提交记录

git常用命令(测试必备)

 变成一次提交记录了

git常用命令(测试必备)

把上次的提交了

git常用命令(测试必备)

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

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

git常用命令(测试必备)

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

git常用命令(测试必备)

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

git常用命令(测试必备)

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

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

git常用命令(测试必备)

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

把之前的提交了

git常用命令(测试必备)

git reset --hard HEAD^

git常用命令(测试必备) 

git分支

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

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

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

git常用命令(测试必备)

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

git常用命令(测试必备)

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

git常用命令(测试必备)

切换分支:git checkout 分支名

git常用命令(测试必备)

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

git常用命令(测试必备)

切换到master再删除

git常用命令(测试必备) 

 

其它

查看本地所有分支: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常用命令(测试必备)

HEAD文件记录了当前分支

git常用命令(测试必备)

HEAD文件内容:

git常用命令(测试必备)

创建新分支

git常用命令(测试必备)

HEAD文件内容:

git常用命令(测试必备)

可以修改内容后再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 fetch git@gitee.com:uncleyong/my_rf_no_open.git dev01

或者git fetch origin dev01

git常用命令(测试必备)

 

git常用命令(测试必备)

内容是master

git常用命令(测试必备)

 

git常用命令(测试必备)

 

git常用命令(测试必备)

内容是

git常用命令(测试必备)

 

先克隆非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分支切换的问题

问题一

git常用命令(测试必备)

 

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

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

 

问题二:

git常用命令(测试必备)

 

 

git常用命令(测试必备)

 

 

git log

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

git常用命令(测试必备)

显示的log的含义:

commit id,每个id都是唯一的

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

Date,提交日期

xxx,commit -m的提交说明

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

git常用命令(测试必备)

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

git常用命令(测试必备)

概要显示:git log --oneline 

git常用命令(测试必备)

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

git常用命令(测试必备)

git常用命令(测试必备)

git常用命令(测试必备)

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

git常用命令(测试必备)

git diff

克隆空项目,从头开始

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

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

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

 

新增文件

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

git常用命令(测试必备)

提交到本地仓库

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

git常用命令(测试必备)

修改文件

git常用命令(测试必备)

git常用命令(测试必备)

上面修改后,不add

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

git常用命令(测试必备)

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

git常用命令(测试必备)

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

git常用命令(测试必备)

再次修改

git常用命令(测试必备)

git常用命令(测试必备)

上面修改后,不add

git常用命令(测试必备)

下面执行结果说明:  

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

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

git常用命令(测试必备)

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

git常用命令(测试必备)

 

把上面的都提交了

git常用命令(测试必备)

git常用命令(测试必备)

git常用命令(测试必备)

 

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

创建并切换到test分支

git常用命令(测试必备)

然后修改文件

git常用命令(测试必备)

git常用命令(测试必备)

和master分支比较

git常用命令(测试必备)

 

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

提交前,没有输出结果

git常用命令(测试必备)

提交后,有输出结果

git常用命令(测试必备)

 

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

git常用命令(测试必备)

修改

git常用命令(测试必备)

git常用命令(测试必备)

 

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

git常用命令(测试必备)

git常用命令(测试必备)

 

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

git常用命令(测试必备)

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

git常用命令(测试必备)

补充,git diff结果的含义

git常用命令(测试必备)

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常用命令(测试必备)

再创建一个文件并提交

git常用命令(测试必备)

创建并切换到分支test

git常用命令(测试必备)

修改文件

git常用命令(测试必备)

git常用命令(测试必备)

提交

git常用命令(测试必备)

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

git常用命令(测试必备)

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

git常用命令(测试必备)

 

切换到test分支

git常用命令(测试必备)

修改文件

git常用命令(测试必备)

git常用命令(测试必备)

提交

git常用命令(测试必备)

 

切到master分支

git常用命令(测试必备)

修改同一个文件

git常用命令(测试必备)

git常用命令(测试必备)

提交

git常用命令(测试必备)

合并test,产生冲突

git常用命令(测试必备)

文件内容

git常用命令(测试必备)

 

最终改为test分支上的

git常用命令(测试必备)

git常用命令(测试必备)

提交

git常用命令(测试必备)

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

回退并查看冲突文件

git常用命令(测试必备)

 

其它相关

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

 

相关文章: