目录
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 其它介绍与问题处理
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.Svn是集中式版本管理系统,需要依赖服务器,安全性不如git;
2.git它采用了分布式版本库的方式,不必服务器端软件支持。
3.Git的分支管理功能甩svn几条街,用了就回不去了;分支在 SVN 中一点都不特别,其实它就是版本库中的另外一个目录;
4.Git 把内容按元数据方式存储,而 SVN 是按文件:所有的资源控制系统都是把文件的元信息隐藏在一个类似 .svn、.cvs 等的文件夹里;
5.Svn支持文件级别的权限管理,git不支持;
6.特点说明:Git是分布式管理.服务器和客户端都有版本控制能力,都能进行代码的提交、合并,如开发人员1和开发人员2等本地的电脑,远程服务器都能进行工程代码版本的管理;
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. 远程仓库(服务器)
托管代码的服务器,即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、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、#表示注释
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也可以看到分支的合并情况
下载地址: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. 设置用户信息;user.name 和user.email可以设置为git服务器上注册的名称和邮箱
git config --global user.name “monkeyqiyu”
git config --global user.email “[email protected]”
查看配置信息
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
有GitHub、码云、GitLab等
gitHub( 地址:https://github.com/ ):
是一个面向开源及私有软件项目的托管平台,因为只支持Git 作为唯一的版本库格式进行托管,故名gitHub;
码云(地址: https://gitee.com/ ):
是国内的一个代码托管平台,由于服务器在国内,所以相比于GitHub,码云速度会更快;
GitLab (地址: https://about.gitlab.com/ ):
是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务,一般用于在企业、学校等内部网络搭建git私服
Gitee - 企业级 DevOps 研发效能平台
1.登录网站:https://github.com/;使用Firefox浏览器、Google的Chrome浏览器;
2.输入邮箱,用户名;确定后,你的邮箱会收到校验码;在对应的界面输入校验码即可注册成功。
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 通过克隆远程仓库项目到本地,再添加或修改文件,再上传(不先创建本地仓库)
【2】本地创建一个文件夹,这里创建test,【2】此文件夹下 点击鼠标右键,点击“Git Bash Here”打开Git Bash;【3】输入命令:
git clone [email protected]: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
上传到远程服务器的文件如下:
前提:已经注册远程仓库;建立了远程仓库工程(参考前面章节);【1】下载工程(克隆);【2】添加修改文件;【3】上传文件到远程仓库;具体操作如下:
1. F:\test目录打开“Git Bash Here”
命令: git clone [email protected]: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
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 [email protected]: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 [email protected]: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 //合并后推送远程仓库
(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
(1)创建本地仓库命令:
mkdir test
cd test/
git init
Ls -a //即可看到.git 文件夹
(2)克隆远程仓库到本地,即下载一个项目到本地
git clone [email protected]:monkeyqiyu/git_test.git
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 //显示两次提交之间的差异
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分支合并
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 以图的形式显示
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
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
这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动
7、git add .后,从暂存区回退到工作区域
git reset HEAD cal.c :暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响;如果add后暂存区的内容跟工作去的不一致;保持的是工作区的文件内容;
当执行 “git checkout .” 或者 “git checkout —
这个操作很危险,会清除工作区中未添加到暂存区的改动。
也就是:git add .后,工作区又有新的改动,执行后工作区的改动被覆盖;恢复暂存区的内容;如果没有进行git add .修改或删除了内容,恢复的是修改前或删除前的内容
git checkout -- add.c
当执行 “git checkout HEAD .” 或者 “git checkout HEAD
这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改 动;
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
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相同的时间线,几乎完全克隆
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 //强制添加忽略的文件
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
命令: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]
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
1、拉取一个仓库内容,推送到另一个仓库
git remote add origin_demo [email protected]:monkeyqiyu/git_demo.git
//将代码推送到 [email protected]:monkeyqiyu/git_demo.git
git remote -v //显示所有远程仓库
git push origin_demo master
//把origin仓库的代码推送到origin_demo,即:
//origin [email protected]:monkeyqiyu/git_test1.git (fetch)拉取的代码推送到//[email protected]:monkeyqiyu/git_demo.git
注:如可以将代码推送到 gitee 和 github 两个平台:
gitee 为:
git remote add gitee [email protected]:monkeyqiyu/git_demo.git
github为:
git remote add github [email protected]:monkeyqiyu/git_demo.git
git push gitee master && git push github master //推送代码到两个仓库
2.查看远程库信息以及和本地库的关系:
git remote show origin
或者 git remote show [email protected]:monkeyqiyu/git_demo.git
3.其他命令
git remote rm name # 删除远程仓库
如:git remote rm origin2
git remote rename old_name new_name # 修改仓库名
主项目是一个git仓库,其中的一个模块独立使用一个git仓库管理;主仓库使用git submodule 命令来操作使用子仓库的模块。
参考《git submodule 使用教程》:
git submodule 使用教程_git submodule 提交_卓学课堂的博客-CSDN博客
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
Gerrit是什么?Gerrit 是一个基于 git 的网页版代码评审工具;
实现方式:本地的commit需要push到Gerrit,这样才能被review。Gerrit利用git分支可用带有路径的特性,默认监控refs/for/ 目录下的提交,这个目录下的提交可用通过gerrit对比文件的改动,审核通过后gerrit通过git的merge命令合并到目标分支。
jenkins也是一个基于 git 的网页版代码评审工具
Git 有很多图形界面工具 ( GUI ),比如 SourceTree、Github Desktop、TortoiseGit 等;
请参考《SourceTree使用教程》,《TortoiseGit 使用教程》
公司的服务器一般会有比较牛逼的运维工程师搭建,也可以自己尝试搭建,参考《git服务器搭建》。
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