目录

1 git简介

1.1 Git是什么

1.2 Git的诞生

1.3 Git和svn的区别

 1.4 git 的基本工作流程

1.5 常见术语

1.6 Bash基本操作命令(linux命令)

1.7 实用的命令

2 Git使用环境安装与基本使用

2.1 git下载安装与使用

2.1.1 git下载与安装

2.1.2 git 配置

2.2 服务器注册与使用说明

2.2.1常见的托管服务(远程仓库)

2.2.2 注册码云giee

2.2.3 注册git hub

2.3 git实际基本使用演示(git bash与远程服务器配合使用演示)

3 git 各使用场景操作说明

3.1 个人使用基本操作(当网盘用):

3.2 多人参与一个项目开发操作流程

3.3 代码冲突处理

3.4 创建仓库命令

3.5 查看文件状态与差修改差异

3.6 添加,提交与推送

3.7 查看日志与历史

4.7 撤销,删除与回退

4.9 忽略文件操作

4.10 git分支操作

4.11 git标签操作

4.12 git remote操作

4 git submode

5 repo 介绍

6 代码评审及工具介绍

7 图形化操作介绍

8 git服务器搭建

9 其它介绍与问题处理


1 git简介

1.1 Git是什么

    Git是目前世界上最先进的分布式版本控制系统,用来高效的管理各类项目源代码管理,记录代码每一步变化,方便版本控制;

1.2 Git的诞生

    git 的产生是 Linux Torvals 在无奈被逼的情况下花了两周时间用C语言写出来的,用来管理linux内核。时间历程:

2005 年 4 月 3 日 开始开发 git

2005 年 4 月 6 日 项目发布

2005 年 4 月 7 日 Git 开始作为自身的版本控制工具

2005 年 4 月 18 日 发生第一个多分支合并

2005 年 4 月 29 日 Git 的性能达到 Linux 预期

2005年 7 月 26 日 Linux 功成身退,将 Git 维护权交给 Git 另一个主要贡献者 Junio C Hamano,直到现在;

    2008 年Git 迅速成为最流行的分布式版本控制系统,GitHub 网站上线了,它为开源项目免费提供 Git 存储,无数开源项目开始迁移至 GitHub;

1.3 Git和svn的区别

1.Svn是集中式版本管理系统,需要依赖服务器,安全性不如git;

2.git它采用了分布式版本库的方式,不必服务器端软件支持。

3.Git的分支管理功能甩svn几条街,用了就回不去了;分支在 SVN 中一点都不特别,其实它就是版本库中的另外一个目录;

4.Git 把内容按元数据方式存储,而 SVN 是按文件:所有的资源控制系统都是把文件的元信息隐藏在一个类似 .svn、.cvs 等的文件夹里;

5.Svn支持文件级别的权限管理,git不支持;

6.特点说明:Git是分布式管理.服务器和客户端都有版本控制能力,都能进行代码的提交、合并,如开发人员1和开发人员2等本地的电脑,远程服务器都能进行工程代码版本的管理;

 1.4 git 的基本工作流程

1.基本工作图解

2 Git 基本工作流程:

1、基本工作流程

【1】服务器即远程仓库:创建工程;

【2】开发者电脑创建一个文件夹做本地仓库;

【3】把远程仓库工程下载到本地电脑(克隆);

【4】开发新功能即改动了文件内容

【5】把新改动的文件内容上传到服务器;

注:

中间会产生一系列文件添加,删除,修改,版本回退,版本更新;对比前后修改,多个人协同开发出现的冲突等问题;

每次提交到本地仓库,上传数据都远程仓库;都有详细的版本记录,哪个人提交的;方便回退历史版本,代码还原,追溯问题代码的编写人和编写时间!管理多人开发上传数据问题;

2 、git命令行操作和图形操作说明

(1)git命令行操作:即通过输入命令的方式进行:clone(克隆);add(添加);commit(提交);fetch (抓取) ;pull (拉取) ;push(推送) ;status(文件状态);diff(查看差异);reset(恢复);rm(删除);log(历史);等。

(2)图形操作界面

Git图形界面工具有SourceTree、Github Desktop、TortoiseGit ;工作中一般使用命令行进行操作;linux环境一般是通过命令行;windows环境可以用命令行,也可以用图形操作,使用都挺方便。

1.5 常见术语

1. 远程仓库(服务器)

托管代码的服务器,即github,gitlab,giee(码云):类似一个云盘(百度云盘)用于备份数据和交换数据;也可以简单的认为是你项目组中的一台电脑用于远程数据交换;

2. 本地仓库

可以说是开发人员电脑上的一个文件夹:但是里面有个.git,实现版本管理了;通俗讲文件夹包括:工作区,暂存区,本地仓库区

工作区

对于添加、修改、删除,恢复文件的操作,都发生在工作区中;就是你平时存放项目代码,文件的地方

暂存区

暂存区指将工作区中的操作完成小阶段的存储,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息,是版本库的一部分;查看记录git status

仓库区

仓库区(或本地仓库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本

3.索引(Index)

索引是暂存区的另一种术语。

4.签入(Checkin)

将新版本复制回仓库

5.签出(Checkout)

从仓库中将文件的最新修订版本复制到工作空间

6.提交(Commit)

对各自文件的工作副本做了更改,并将这些更改提交到仓库

7.冲突(Conflict)

多人对同一文件的工作副本进行更改,并将这些更改提交到仓库

8.合并(Merge)

将某分支上的更改联接到此主干或同为主干的另一个分支

9.分支(Branch)

master是默认分支一般用于发布,可从master建立dev等分支用于开发

10.锁(Lock)

获得修改文件的专有权限。

11.头(HEAD)

头是一个象征性的参考,最常用以指向当前选择的分支。

12.修订(Revision)

表示代码的一个版本状态。Git通过用SHA1 hash算法表示的ID来标识不同的版本。

13.标记(Tags)

标记指的是某个分支某个特定时间点的状态。通过标记,可以很方便的切换到标记时的状态。

1.6 Bash基本操作命令(linux命令)

1、cd : 改变目录。

2 、cd . . 回退到上一个目录,直接cd进入默认目录

3、pwd : 显示当前所在的目录路径。

4、ls(ll): 都是列出当前目录中的所有文件,只不过ll(两个ll)列出的内容更为详细。

5、touch : 新建一个文件 如 touch index.js 就会在当前目录下新建一个index.js文件。

6、rm: 删除一个文件, rm index.js 就会把index.js文件删除。

7、mkdir: 新建一个目录,就是新建一个文件夹。

8、rm -r : 删除一个文件夹, rm -r src 删除src目录, 好像不能用通配符。

9、mv 移动文件, mv index.html src index.html 是我们要移动的文件, src 是目标文件夹,当然, 这样写,必须保证文件和目标文件夹在同一目录下。

10、reset 重新初始化终端/清屏。

11、clear 清屏。

12、history 查看命令历史。

13、help 帮助。

14、exit 退出。

15、#表示注释

1.7 实用的命令

git blame [file]             //显示指定文件是什么人在什么时间修改过

git cherry-pick [commit]    //选择一个commit,合并进当前分支

git difftool //对比文件改动

git branch –vv            //与本地分支关联的远程分支

git merge --no-ff master  //分支合并

git mergetool            //打开三方对比软件,修改冲突

git log --graph --pretty=oneline --abbrev-commit  //用带参数的git log也可以看到分支的合并情况

2 Git使用环境安装与基本使用

2.1 git下载安装与使用

2.1.1 git下载与安装

下载地址:https://git-scm.com/downloads;如图点击进入选择自己需要下载的版本;

 下载好的安装包如图所示:

 

安装步骤如下

【1】点击Git-2.39.2-64-bit.exe,出现如图界面,然后一路点击“next”的傻瓜式安装。

 

【2】安装完成后在电脑桌面(也可以是其他目录)点击右键,如果能够看到如下两个菜单则说明Git安装成功。说明:

Git GUI:Git提供的图形界面工具

Git Bash:Git提供的命令行工具

当安装Git后首先要做的事情是设置用户名称和email地址。这是非常重要的,因为每次Git提交都会使用该用户信息

2.1.2 git 配置

  1. 任意目录下,或者桌面,点击鼠标右键,点击“Git Bash Here”打开Git Bash

2. 设置用户信息;user.name 和user.email可以设置为git服务器上注册的名称和邮箱

git config --global user.name “monkeyqiyu”

git config --global user.email “monkeyqiyu@163.com”

查看配置信息

git config --global user.name

git config --global user.email

 2.1.3 git 指令配置别名

如果敲git st就表示git status那就简单多了,当然这种偷懒的办法我们是极力赞成的。

当然还有别的命令可以简写,很多人都用co表示checkout,ci表示commit,br表示branch:

$ git config --global alias.co checkout

$ git config --global alias.ci commit

$ git config --global alias.br branch

2.1.4 .git 配置介绍

git config -l   #可以查看现在的git环境详细配置
git config --system --list  #查看系统config
git config --global  --list #查看当前用户(global)配置
git config --local  --list  #查看当前仓库配置信息

Git相关的配置文件有三个:

1)、 /etc/gitconfig:包含了适用于系统所有用户和所有项目的值。(Win:C:\Program Files\Git\mingw64\etc\gitconfig) --system 系统级

2)、~/.gitconfig:只适用于当前登录用户的配置。(Win:C:\Users\Administrator\.gitconfig)  --global 全局

3)、位于git项目目录中的.git/config:适用于特定git项目的配置。(Win:C:\gitProject) --local当前项目注意:对于同一配置项,三个配置文件的优先级是1<2<3

2.2 服务器注册与使用说明

2.2.1常见的托管服务(远程仓库)

有GitHub、码云、GitLab等

gitHub( 地址:https://github.com/ ):

是一个面向开源及私有软件项目的托管平台,因为只支持Git 作为唯一的版本库格式进行托管,故名gitHub;

码云(地址: https://gitee.com/ ):

是国内的一个代码托管平台,由于服务器在国内,所以相比于GitHub,码云速度会更快;

GitLab (地址: https://about.gitlab.com/ ):

是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务,一般用于在企业、学校等内部网络搭建git私服

2.2.2 注册码云giee

Gitee - 企业级 DevOps 研发效能平台

 

2.2.3 注册git hub

1.登录网站:https://github.com/;使用Firefox浏览器、Google的Chrome浏览器;

2.输入邮箱,用户名;确定后,你的邮箱会收到校验码;在对应的界面输入校验码即可注册成功。

2.3 git实际基本使用演示(git bash与远程服务器配合使用演示)

2.3.1 登录gitee账号,建立工程

 远程仓库创建成功

 2.3.2 配置密钥本地电脑与服务器连接起关系

1.想通过ssh访问github或者gitee的时候,都需要用Git生成密钥,对应的的命令是:

ssh-keygen -t rsa -C "你的邮箱地址"
或者
ssh-keygen -t rsa -b 4096 -C "你的邮件地址"

 2.找到生成的公钥文件,如图所示。

 3.使用文本打开公钥"id_rsa.pub"文件,复制其内容。

4.在远程仓库中,如图所示,找到【设置】->【SSH公钥】,粘贴刚复制的公钥到对应位置,其标题可以随便命名。

 5.输入远程仓库gitee账号密码即可设置成功

2.3.3 先在本地创建本地仓库,再把本地推到服务器(3.3.1建立的远程仓库为空)

1、开发者创建本地仓库,【1】创建文件夹git_test;【2】此文件夹下 点击鼠标右键,点击“Git Bash Here”打开Git Bash;【3】输入命令:

git init    ;或者git init project_name

复制开发代码文件、或复制其它文件到git_test目录

2.本地与服务器关联方式(不先进行克隆),命令:

 git remote add origin https://gitee.com/monkeyqiyu/git_test.git

3.把要上传的文件添加到缓存区,添加所有文件的命令如下:

git add .

4、把要上传的文件提交到本地仓库,加上注释说明;

git commit -m "frist git_test project"

5. 把本地仓库的代码推送到远程服务器

 git push -u origin master

服务器提交情况:

2.3.4 通过克隆远程仓库项目到本地,再添加或修改文件,再上传(不先创建本地仓库)

  1. 【1】复制已经创建的仓库git_test1的HTTPS,或SSH连接,这里复制SHH连接

【2】本地创建一个文件夹,这里创建test,【2】此文件夹下 点击鼠标右键,点击“Git Bash Here”打开Git Bash;【3】输入命令: 

git clone git@gitee.com:monkeyqiyu/git_test1.git

2.输入命令进入git_test1目录:

cd git_test1

 复制开发代码文件、或复制其它文件到git_test1目录,

 3.分别执行以下命令:

git add .

 git commit -m "add git_test1 project"

 git push -u origin master

 上传到远程服务器的文件如下:

3 git 各使用场景操作说明

3.1 个人使用基本操作(当网盘用):

  前提:已经注册远程仓库;建立了远程仓库工程(参考前面章节);【1】下载工程(克隆);【2】添加修改文件;【3】上传文件到远程仓库;具体操作如下:

1. F:\test目录打开“Git Bash Here”

命令: git clone git@gitee.com:monkeyqiyu/git_test.git

命令:cd git_test 

进入改项目工程目录,该工程为空

 2 添加或修改文件后,如图复制了几个文件到此目录

 命令:git status //查看文件状态,红色表示新建文件或者新修改的文件,都在工作区

3.将工作区文件添加到暂存区

命令:git add .   //添加项目中所有文件

//或者
命令:git add add.c //逐个添加指定文件

 4.将暂存区文件提交到仓库区

git commit -m '版本描述'
命令: git commit -m "第一个git测试工程"

5、推送修改和添加的文件数据到远程仓库

命令:git push //默认推送到的是master分支

 远程服务器就有了对应的文件(相当于网盘)

6.后面有添加或修改了文件

修改了add.c,查看修改:

命令:git status

修改了什么,对比差异(其中:-指修改前的样子(红色);+指修改后的样子(绿色)):

命令:git diff

执行加入暂存区,提交本地本地仓库,推送远程仓库:

命令:git add .

命令:git commit -m “modify add.c function”

命令:git push

7.查看提交记录:

命令:git log

3.2 多人参与一个项目开发操作流程

1、经理创建远程仓库项目工程《4.1章节》git_test项目mater主分支仓库,在当前的 master 分支为基础创建新的dev分支用于给员工开发

命令:git checkout -b dev

命令:git branch -a  //查看一下现在的本地和远程分支状态

命令:git push origin dev:dev//把新建的本地分支push到远程服务器,远程分支与本地分支同名(当然可以随意起名)

 

 远程仓库分支情况,多了dev分支

2.员工A克隆项目工程,切换到dev分支进行开发

克隆远程到本地:   git clone git@gitee.com:monkeyqiyu/git_test.git

进入仓库本地目录:cd git_test/

切换到远程dev分支并建立本地分支: git checkout -b dev  remotes/origin/dev

修改代码,查看修改了什么:git diff

修改代码后,提交推送到远程仓库,命令如下:

添加到暂存区: git add .

提交:git commit -m “modify div.c”

推送:git push

3.员工B克隆项目工程,切换到dev分支进行开发

克隆远程到本地: git clone git@gitee.com:monkeyqiyu/git_test.git

进入仓库本地目录:cd git_test/

切换到远程dev分支并建立本地分支: git checkout -b dev  remotes/origin/dev

修改代码,查看修改了什么:git diff

 修改代码后,提交推送到远程仓库,命令如下:

添加到缓存:git add .

提交:git commit -m “modify mul.c”

推送:git push //已经切换到dev,所以默认推送到dev分支

4.员工A拉取pull最新项目工程,继续开发

命令:git pull //拉取B推送的代码

5.经理合并dev分支合并到master分支按照以上2-3-4步骤循环操作,即可实现基本的协同开发

如果A是经理,git pull 完后即可合并代码到master分支:

如果经理新建本地分支后将本地分支推送到远程库, 使用git pull 或者 git push 的时候报错,则需要先执行git branch --set-upstream-to=origin/远程分支的名字,本地分支和远程分支没有建立联系

命令:git branch --set-upstream-to=origin/dev

命令:git pull

命令:git checkout master  

命令:git merge dev  //合并dev的分支到mater

命令:git push //合并后推送远程仓库

3.3 代码冲突处理

  1. 员工A,员工B拉取同一份代码,员工A已经提交代码或提交多次,员工B随后提交;提交后发现冲突

(1)原始文件:

 (2)员工A修改后:

(3)员工A修改代码后提交到了远程仓库;

(4)员工B不知道修改了内容,也修改了sub.c

(5)git push 报错

 git pull后提示冲突

 

(7)手动解决冲突(冲突过多的话,可以用第三方对比工具对比 解决冲突)

 (7)重新提交代码

2.第二种解决冲突的方法

(1)员工A修改了文件并提交:修改成:

(2) B员工也修改了同样的地方

(3)B员工先把修改的存在git栈区,再拉取,单选远程仓库有其人提交

命令:git stash //修改的代码进栈

 命令:git pull //拉取远程最新的代码

 命令:git stash pop //新修改的代码出栈

 有冲突手动解决冲突

 保留员工B的代码,删除员工A修改的

 手动解决冲突后,再提交代码:git add . git commit ,git push

3.4 创建仓库命令

(1)创建本地仓库命令:

mkdir test

cd test/

git init

Ls -a   //即可看到.git 文件夹

(2)克隆远程仓库到本地,即下载一个项目到本地

git clone git@gitee.com:monkeyqiyu/git_test.git

3.5 查看文件状态与差修改差异

 1、查看仓库文件状态

git status

git status -s    //简短输出

2、修改差异查看

git diff                 //尚未缓存的改动

git diff --cached  //查看已缓存的改动

git diff HEAD      //查看已缓存的与未缓存的所有改动

git diff --stat        //显示摘要而非整个 diff

git diff [file]          //显示暂存区和工作区的差异

git diff --cached   //显示暂存区和上一次提交(commit)的差异:

或 git diff --cached [file]

git diff --staged [file]

git diff 65d2558 5fc88a3   //显示两次提交之间的差异

3.6 添加,提交与推送

1.添加文件

git add .                      //添加所有改动

git add  file1                //添加一个文件

git add fie1 file2 file3  //同时添加多个文件

2.提交文件

git commit -m '第一次提交'

git commit -am '修改文件直接提交'  //修改文件后不需要执行 git add 命令,直接来提交

2.推送

git push origin master  

git push origin master:dev        //本地master推送到远程dev分支

git push origin --delete master  //删除远程仓库的分支

git push --force origin master   //本地版本与远程版本有差异,但要强制推送可使用 --force 参数

3.拉取

git pull  //等同于同时执行:git fetch origin 和git merge origin/master

git pull origin master:dev  //将远程主机 origin 的 master 分支拉取过来,与本地的 dev分支合并

3.7 查看日志与历史

git log                      //查看历史提交记录

git log --oneline       //显示一行

git log --reverse --oneline

git blame readme.md     //以列表形式查看指定文件的历史修改记录

git log --graph               //以图形化的方式显示提交历史的关系

git log add.c                  //查看指定文件的提交历史

git reflog 可以查看所有分支的所有操作记录(包括commit和reset的操作),包括已经被删除的commit记录,git log 则不能察看已经删除了的commit记录

git log --grep==xxx (你想查找的关键字):

git log --author=xxxx (你想找的人名字)

git log -S [keyword]     //搜索提交历史,根据关键词

git log --grep=dac     //搜索提交信息带有dac的关键字

git log --stat     //显示commit历史,以及每次commit发生变更的文件

命令:history  //可以查看您在bash下输入过的指令

git log [option]

options

--all 显示所有分支

--pretty=oneline 将提交信息显示为一行

--abbrev-commit 使得输出的commitId更简短

--graph 以图的形式显示

4.7 撤销,删除与回退

1.已经commit,但漏改了文件,要提交并覆盖此次提交信息;或只想修改提交信息

(1)本地已经commit,但漏改了文件,要提交并覆盖此次提交信息

 # 重做上一次commit,并包括指定文件的新变化

 git commit --amend [file1] [file2] ...

提交信息git commit -m "modify add.c file ,b=200"被覆盖,并生成新的commit id

(3)只想修改提交信息:

输入命令:git commit --amend   

进入编辑模式,修改提交信息,保存退出这时候可再重新执行命令:git push

 

2 git push后审核不通过被abandon操作,重新修改提交

(1)git reset HEAD~1 //撤销提交,再重新提交,覆盖原来的push;通过git reset是直接删除指定的commit;

或git reset [commit id] //如:d1d6efa76f95071ed8fe18042e9380e2ac75d989

或git reset --soft HEAD^

(2)git log # 得到你需要回退一次提交的commit id

git reset --hard <commit_id>

git push origin HEAD --force # 强制提交一次,之前错误的提交就从远程仓库删除

Git reset三个参数大体上的区别为:

-mixed:为默认值,等同于git reset。作用为:将文件回退到工作区,此时会保留工作区中的文件,但会丢弃暂存区中的文件;

--soft:作用为:将文件回退到暂存区,此时会保留工作区和暂存区中的文件;

--hard:作用为:将文件回退到修改前,此时会丢弃工作区和暂存区中的文件;

3 git commit后重新回退到工作区

git reset --hard HEAD

(1)命令:git reset --hard HEAD^

作用:删除工作空间修改过的代码,撤销commit&撤销add;相关与回到上次拉取的状态

(2)命令:git reset --soft HEAD^

作用:不删除工作空间修改过的代码,仅撤销commit;这种当做审核代码不通过,撤回代码修改重新提交;原来git add .的代码没有被删除

git reset --hard HEAD~1;//这个从新恢复了上一次提交的内容,#撤销上一次的提交,原理就是放弃工作区和index的改动,同时HEAD指针指向前一个commit对象

(3) git revert是提交一个新的版本,将需要revert的版本的内容再反向修改回去,版本会递增,不影响之前提交的内容.

 git revert HEAD          撤销前一次 commit,即删掉前一次提交的内容,这次提交内容不要了,重新生成一个提交,是上次提交的工作文件内容

git revert HEAD^         撤销前前一次 commit    

git revert HEAD~n 重做倒数第n+1次提交 能 否 是

git revert commit_id (比如:fa042ce57ebbe5bb9c8db709f719cec2c58ee7ff)

4 本地仓库的修改,提交全部不要,回到上次git clone或git pull的文件状态

命令:git reset --hard HEAD^

git reset --hard   // HEAD~n 往前回退n次提交 能 否 是

作用:删除工作空间修改过的代码,撤销commit&撤销add;相关与回到上次拉取的状态

或 git reset --hard [commit id]

5 工作区域已经有文件内容修改,从暂存区或者仓库区回退工作区,已经修改的内容保留

从add .即暂存区回到工作区:

git restore --staged div_1.c

6 用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件

   当执行 “git checkout HEAD .” 或者 “git checkout HEAD <file>” 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。

这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动

7、git add .后,从暂存区回退到工作区域

git reset HEAD cal.c  :暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响;如果add后暂存区的内容跟工作去的不一致;保持的是工作区的文件内容;

当执行 “git checkout .” 或者 “git checkout — <file>” 命令时,会用暂存区全部或指定的文件替换工作区的文件。

这个操作很危险,会清除工作区中未添加到暂存区的改动。

也就是:git add .后,工作区又有新的改动,执行后工作区的改动被覆盖;恢复暂存区的内容;如果没有进行git add .修改或删除了内容,恢复的是修改前或删除前的内容

git checkout -- add.c

   当执行 “git checkout HEAD .” 或者 “git checkout HEAD <file>” 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。

这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改 动;

git checkout commit_id 回退到指定commit id的提交

8、清除没有 git add .的文件,即清楚未跟踪的文件

#移除所有未跟踪文件

#一般会加上参数-df,-d表示包含目录,-f表示强制清除。

git clean [options]

9 git add 后,直接从暂存区删除文件

git rm --cached README   //当执行 “git rm –cached <file>” 命令时,会直接从暂存区删除文件,工作区则不做出改变。

git rm test.txt      //暂存区和工作区中删除

git rm -f test.txt  //强行从暂存区和工作区中删除

git mv readme  readme.md  //readme 重命名

10. 回到指定某个人提交的版本进行开发或者问题排查

Git reset --hard  commit id

11.git pull --rebase用法

你基于组内的开发分支checkout -b 出自己的开发分支;

在分支myBranch开发一段时间后,假如你本地有了3个commit;但是devBranch已经被其他同事推送了很多新的commit, 所以你直接pull的话,可能会出现merge; 这时使用git pull -- rebase origin devBranch , 就会将你本地的3个commit, 剪切下来,直接放到当前devBranch最新一个commit的后面;保持了开发线性;

也不需要再替换新的分支,可以一直在myBranch开发,这个分支保持了和devBranch相同的时间线,几乎完全克隆

4.9 忽略文件操作

1.说明

      很多文件不需要纳入版本控制中,比如数据库文件,临时文件,设计文件,编译过程文件等,上传到Git中去其他人pull下来的时候就会和他本地的配置有冲突;git中的.gitignore文件中申明要忽略的文件,使用git add .的时候这些文件就会被自动忽略掉;

有三种方法可以实现忽略Git中不想提交的文件:

(1)在Git项目即工作区中定义.gitignore文件;在.gitingore 文件中,遵循相应的语法,每一行指定一个忽略规则。

定义Git全局的 .gitignore 文件

(2)git config --global core.excludesfile ~/.gitignore

(3)使用python脚本,.sh的shell脚本,提交的时候执行一下脚本,删除不需要提交的文件

2.gitignore 规则说明

在主目录下建立".gitignore"文件,此文件有如下规则:

1.忽略文件中的空行或以井号(#)开始的行将会被忽略。
2.可以使用Linux通配符。例如:星号(*)代表任意多个字符,问号(?)代表一个字符,方括号([abc])代表可选字符范围,大括号({string1,string2,...})代表可选的字符串等。
3.如果名称的最前面有一个感叹号(!),表示例外规则,将不被忽略。
4.如果名称的最前面是一个路径分隔符(/),表示要忽略的文件在此目录下,而子目录中的文件不忽略。
5.如果名称的最后面是一个路径分隔符(/),表示要忽略的是此目录下该名称的子目录,而非文件(默认文件或目录都忽略

3 .gitignore忽略规则简单说明

#               表示此为注释,将被Git忽略

*.a             表示忽略所有 .a 结尾的文件

!lib.a          表示但lib.a除外

/TODO        表示仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO

build/          表示忽略 build/目录下的所有文件,过滤整个build文件夹;

doc/*.txt       表示会忽略doc/notes.txt但不包括 doc/server/arch.txt

bin/:           表示忽略当前路径下的bin文件夹,该文件夹下的所有内容都会被忽略,不忽略 bin 文件

/bin:           表示忽略根目录下的bin文件

/*.c:           表示忽略cat.c,不忽略 build/cat.c

debug/*.obj:    表示忽略debug/io.obj,不忽略 debug/common/io.obj和tools/debug/io.obj

**/foo:         表示忽略/foo,a/foo,a/b/foo等

a/**/b:         表示忽略a/b, a/x/b,a/x/y/b等

!/bin/run.sh    表示不忽略bin目录下的run.sh文件

*.log:          表示忽略所有 .log 文件

config.php:     表示忽略当前路径的 config.php 文件

/mtk/           表示过滤整个文件夹

*.zip           表示过滤所有.zip文件

/mtk/do.c       表示过滤某个具体文件

被过滤掉的文件就不会出现在git仓库中(gitlab或github)了,当然本地库中还有,只是push的时候不会上传。

需要注意的是,gitignore还可以指定要将哪些文件添加到版本管理中,如下:

!*.zip

!/mtk/one.txt

唯一的区别就是规则开头多了一个感叹号,Git会将满足这类规则的文件添加到版本管理中。为什么要有两种规则呢?

想象一个场景:假如我们只需要管理/mtk/目录中的one.txt文件,这个目录中的其他文件都不需要管理,那么.gitignore规则应写为::

/mtk/*

!/mtk/one.txt

假设我们只有过滤规则,而没有添加规则,那么我们就需要把/mtk/目录下除了one.txt以外的所有文件都写出来!

注意上面的/mtk/*不能写为/mtk/,否则父目录被前面的规则排除掉了,one.txt文件虽然加了!过滤规则,也不会生效!

还有一些规则如下:

fd1/*

说明:忽略目录 fd1 下的全部内容;注意,不管是根目录下的 /fd1/ 目录,还是某个子目录 /child/fd1/ 目录,都会被忽略;

/fd1/*

说明:忽略根目录下的 /fd1/ 目录的全部内容;

/*

!.gitignore

!/fw/

/fw/*

!/fw/bin/

!/fw/sf/

说明:忽略全部内容,但是不忽略 .gitignore 文件、根目录下的 /fw/bin/ 和 /fw/sf/ 目录;注意要先对bin/的父目录使用!规则,使其不被排除。

4.gitignore实操

(1)编写的.gitignor文件内容如下,忽略.txt,.md文件但保留lib.md文件

# 表示此为注释,将被Git忽略

*.txt          
*.md        
!lib.md

 (2)添加文件到暂存区,并没有看到工作区的test.txt,mytest.md文件,这些文件被忽略了没被管理。

4.其他

git add -f  run.code  //强制添加忽略的文件

4.10 git分支操作

1 分支使用原则

作用:

1、区分生产环境代码以及开发环境代码,

2、开发新的功能,以免影响开发主线;

3、解决线上bug;

特点:

1、分支master是默认分支,用于发布,当需要发布时将dev分支合并到master分支

2、分支dev是从master创建的分支用于开发的分支,开发完阶段性的代码后,需要合并到master分支;

3、其他分支,个人临时开发或测试的小功能,备份数据

2 分支创建

(1)在远程服务器创建

Gitlab,gihub,码云等都可以在线创建分支;登录账号找到对应的账号很容易找到新建仓库的按钮

(2)在本地创建后上传服务器

git checkout -b dev     //创建并切换到本地dev分支下

git branch                    //查看本地分支

git branch -a                //查看一下现在的分支状态:包括本地和远程分支

git push origin dev:dev //把新建的本地分支push到远程服务器,远程分支与本地分支同名(当然可以随意起名)

(3)从某个分支创建新的分支;一般从master分支创建

(1)切换到你指定的分支。如要从dev上拉一个分支,代码一模一样

git checkout dev

(2)拉取dev的最新代码

git pull

(3)在本地创建一个dev1分支,并切换到该分支

git checkout -b dev1

git branch //执行会看到该分支在本地已创建

(4)把分支推到远程仓库。

git push origindev1

git branch -av  //执行可以看到该分支在远程仓库也有了

(5)将本地分支与远程分支关联

git branch --set-upstream-to=origin/dev1 dev1

(4)将从分支A下载代码,然后开发修改代码提交到分支B(分支B没有则新建一个远程分支)

例子一:

git add .

git commit -m "添加到分支B"

git push origin branchA:branchB

git checkout -b branchB origin/branchB //拉取远程分支并创建和切换本地分支

如从master新建分支dev2:

 例子二:先不修改代码,直接从分支A推送到分支B,即创建远程分支B

git push origin master:dev3     //当前是mster分支,直接把当前最新的master推送到远程dev3分支(远程没有则是新创建dev3)

git checkout -b dev3 origin/dev3     //本地创建并切换到和远程一样的dev3分支

git branch -a       //查看本地和远程分支情况

3 分支查看与切换

git branch   //查看本地分支

git checkout 分支名 //切换分支(checkout)

git checkout -b 分支名 //切换到一个不存在的分支(创建并切换)

git checkout -b dev3_test origin/dev3 //本地创建并切换到和远程一样的dev3分支

4 删除分支

不能删除当前分支,只能删除其他分支

git branch -d b1 删除分支时,需要做各种检查

git branch -D b1 不做任何检查,强制删除

如:

 git branch -d dev2  //删除本地dev2分支

# 删除远程分支:

 git push origin --delete [branch-name]

 git branch -dr [remote/branch]

git push origin --delete dev2    //删除远程仓库的dev2分支

5 合并分支(merge)解决冲突

在合并改动之前,你可以使用如下命令预览差异:

git diff <source_branch> <target_branch>

命令:git merge 分支名称  //一个分支上的提交可以合并到另一个分支

当两个分支上对文件的修改可能会存在冲突,例如同时修改了同一个文件的同一行,这时就需要手动解决冲突,解决冲突步骤如下:

1. 处理文件中冲突的地方,方法:保留自己的删除原来的;保留原来的删除自己的;改成其他情况;

2. 将解决完冲突的文件加入暂存区git add .

3. 提交到仓库:git commit -m “解决冲突”

4、推送远程仓库:git push

6 来回切换分支 工作区改动或add.的内容变化分析

(1)当前分支dev3,对工作区修改的内容仅仅是git add .切换分支到master的时候,git status,看到的还是dev3工作区一样修改的内容
(2)当前分支dev3,对工作区修改的内容git add . ;后git commit切换分支到master的时候,git status,看到的不是是dev3工作区修改的内容,是master分支原始内容
(3)当前分支工作区的内容修改后,只有git add.和git commit后;分支间来回切换才不受影响;才能使用分支将工作切分开来,从而让我们能够在不同开发环境中做事,并来回切换。

7 其他

# 新建一个分支,与指定的远程分支建立追踪关系

git branch --track [branch] [remote-branch]

# 建立追踪关系,在现有分支与指定的远程分支之间

git branch --set-upstream [branch] [remote-branch]

# 选择一个commit,合并进当前分支

git cherry-pick [commit]

4.11 git标签操作

1、使用说明

在版本库中打一个标签(tag)确定了打标签时刻的版本。取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。作用:记录大版本;备份大版本代码;想找回版本,通过找打的标签,比找提交信息找到commit id更快更方便。

2.本地打标签并推送到远程仓库

(1)本地打标签

git tag -a 标签名 -m '描述'

例:

git tag -a V1.0.0 -m "发布V1.0.0版本"

(2)推送标签到远程

git push origin 标签名
例: git push origin V1.0.0


#如想要一次性推送很多标签, 这将会把所有不在远程仓库服务器上标签全部传送到那里。
git push origin --tags

(3)追加标签

git tag -a V1.0.1 80fbf8 -m “发布V1.0.1小版本”

3.删除标签

(1)删除本地标签

git tag -d 标签名

(2)删除远程仓库标签

git push origin --delete tag 标签名

4.查看标签及标签对应修改的内容

(1)git tag

或者也可以找到标签
git log --oneline --decorate --graph
git log --decorate
(2)查看标签对应修改的内容
git show v1.0

4.12 git remote操作

1、拉取一个仓库内容,推送到另一个仓库

git remote add origin_demo git@gitee.com:monkeyqiyu/git_demo.git   

//将代码推送到 git@gitee.com:monkeyqiyu/git_demo.git

git remote -v  //显示所有远程仓库

 git push origin_demo master   

//把origin仓库的代码推送到origin_demo,即:

//origin  git@gitee.com:monkeyqiyu/git_test1.git (fetch)拉取的代码推送到//git@gitee.com:monkeyqiyu/git_demo.git

注:如可以将代码推送到 gitee 和 github 两个平台:

gitee 为:

git remote add gitee git@gitee.com:monkeyqiyu/git_demo.git

github为:

git remote add github git@github.com:monkeyqiyu/git_demo.git

git push gitee master && git push github master  //推送代码到两个仓库

2.查看远程库信息以及和本地库的关系

git remote show origin

或者 git remote show git@gitee.com:monkeyqiyu/git_demo.git

3.其他命令

git remote rm name  # 删除远程仓库

如:git remote rm origin2

git remote rename old_name new_name  # 修改仓库名

4 git submode

       主项目是一个git仓库,其中的一个模块独立使用一个git仓库管理;主仓库使用git submodule 命令来操作使用子仓库的模块。

参考《git submodule 使用教程》:

git submodule 使用教程_git submodule 提交_卓学课堂的博客-CSDN博客

5 repo 介绍

repo是什么?

repo是谷歌用Python脚本写的调用git的一个脚本,用来管理多个git仓库

repo init -u ssh://xxx/manifest

ssh://xxx/manifest 是一个git仓库,这个仓库有1个xml文件,这个文件记录了要管理的git仓库路径

repo sync     #clone所有git仓库

repo start master --all  //所有git仓库创建master分支

 repo forall –c git xxx      #对所有git仓库执行git命令

repo sync #(除非明确让你用,否则不要用) 更新所有仓库的代码

repo forall –c git pull --rebase

#提交所有仓库的commit到远程服务器

repo upload (不稳定,有时处理不了中文)

repo forall –c git push origin HEAD:refs/for/master

6 代码评审及工具介绍

Gerrit是什么?Gerrit 是一个基于 git 的网页版代码评审工具;

实现方式:本地的commit需要push到Gerrit,这样才能被review。Gerrit利用git分支可用带有路径的特性,默认监控refs/for/ 目录下的提交,这个目录下的提交可用通过gerrit对比文件的改动,审核通过后gerrit通过git的merge命令合并到目标分支。

jenkins也是一个基于 git 的网页版代码评审工具

7 图形化操作介绍

Git 有很多图形界面工具 ( GUI ),比如 SourceTree、Github Desktop、TortoiseGit 等

请参考《SourceTree使用教程》,《TortoiseGit 使用教程》

8 git服务器搭建

  公司的服务器一般会有比较牛逼的运维工程师搭建,也可以自己尝试搭建,参考《git服务器搭建》。

9 其它介绍与问题处理

1. 解决GitBash乱码问题

(1) 打开GitBash执行下面命令

git config --global core.quotepath false

(2)${git_home}/etc/bash.bashrc 文件最后加入下面两行

export LANG="zh_CN.UTF-8"

export LC_ALL="zh_CN.UTF-8"

2.执行git commit --amend 怎么退出编辑器

git commit --amend 可以取消上一次提交,并且将暂存区的文件重新提交。也可以不修改内容,仅对描述进行修改。

   刚进去时此时vim编辑器处于不可编辑状态,输入字母 c 可以进入编辑状态,这个时候就可以修改注释信息啦 ~

修改完之后按esc键退出编辑状态,再按大写ZZ就可以保存退出vim编辑器。vim操作符中说的 qw 可以保存并退出 根本没用! 

3.新建本地分支后将本地分支推送到远程库, 使用Git pull 或者 git push 的时候报错:

是因为本地分支和远程分支没有建立联系 (使用git branch -vv 可以查看本地分支和远程分支的关联关系) .根据命令行提示只需要执行以下命令即可。
git branch --set-upstream-to=origin/远程分支的名字
如:git branch --set-upstream-to=origin/master

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐