OK~~ 这个话题估计百度一大推出来了,而且按照他们的步骤也能完成!例如下面的几个步骤就搞定了:
-
Github官网 创建一个项目 例如:sh-demo1
-
git init
-
git add .
-
git commit -m '初始化文件'
-
git push https://github.com/MaWenxing/sh-demo1.git master
- success!成功的显示如下:推送就是这么简单。。。。
Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 351 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/MaWenxing/sh-demo1.git
* [new branch] master -> master
But...步骤是很简单,但是还是有很多细节的!下面对具体知识点介绍一下:
总有一条是你喜欢的。。只要坚持看下去
Git的基本使用
- 查看帮助:
git --help
- 查看命令帮助:
git add -h
- 查看详细帮助:
git add --help
基础配置
- 需要配置:
user.name
和user.email
- 作用:每次 Git 提交时都会引用这两条信息,记录是谁提交了更新
- 配置用户名:
git config --global user.name
"用户名" - 配置邮箱:
git config --global user.email
"邮箱地址" - 查看配置信息:
git config --list
- 使用
--global
实现全局配置,任何位置使用git都有效
初始化仓库
- 命令:
git init
- 作用:使用Git管理项目的初始化操作,会创建一个名为
.git
的隐藏目录 - 在项目的根目录执行这个命令
-
.git
目录:
这个子目录含有你初始化的 Git 仓库中所有的必须文件,这些文件是Git 仓库的骨干。
它是 Git 用来保存元数据和对象数据库的地方。
该目录非常重要,每次克隆镜像仓库的时候,实际拷贝的就是这个目录里面的数据。
![](https://img.haomeiwen.com/i795875/0ea63522998b106c.png)
.git目录结构介绍
1. hooks/: 包含客户端或服务端的钩子脚本(hook scripts)
2. info/: 包含一个全局性排除(global exclude)文件,用以放置那些不希望被记录在 .gitignore
文件中的忽略模式(ignored patterns)
3. objects/: 存储所有数据内容
4. refs/: 存储指向数据(分支)的提交对象的指针
5. config: 存放项目特有的配置选项
6. description: 文件仅供 GitWeb 程序使用,我们无需关心
7. HEAD: 文件保存暂存区信息,一般指向refs下的某文件
跟踪文件
- 命令:
git add
+文件路径 - 作用:将文件由 工作区 添加到 暂存区(Index),暂存文件
- 例如: git add ./README.md
-
git add .
或者git add --all
再或者git add -A
(简写) 添加所有文件 (个人喜好第一个,来自 Se7ven防止抄袭) -
git add a.txt b.txt
同时添加两个文件 -
git add *.js
添加当前目录下的所有js文件
提交更新 提交说明
- 命令:
git commit -m 信息
(信息必须要) - 作用:将文件由 暂存区 添加到 仓库区(HEAD)
- 跳过暂存区直接提交:
git commit -a -m 提交说明
(合写) - 重新提交:
git commit --amend
- 提交信息输入错误
- 遗漏某些需要提交的文件
查看文件状态
- 命令:
git status
- 命令:
git stauts -s
简化日志输出格式- ?? 表示未追踪的文件
- A 表示已经添加暂存区的文件
- M 表示修改过的文件
- 右边的M: 表示该文件被修改了但是还没放入暂存区
- 左边的M: 表示该文件被修改了并放入了暂存区
![](https://img.haomeiwen.com/i795875/8726b1ab2047bdde.png)
三个分区:
1、 工作区:开发者的工作目录
2、 暂存区:临时存放工作目录中变更的文件
3 、仓库 :存储提交之后的文件目录
文件的三种状态
已修改(modified)=> 已暂存(staged)=> 已提交(committed)
- 已修改:表示修改了某个文件,但还没有提交保存
- 已暂存:表示把已修改的文件放在下次提交时要保存的清单中
- 已提交:表示该文件已经被安全地保存在本地git仓库中了
![](https://img.haomeiwen.com/i795875/0f0dc969f8073b30.png)
Git工作流程
1 在工作目录中修改某些文件。
2 对修改后的文件进行快照,然后保存到暂存区域。 #git add .
3 提交更新,将保存在暂存区域的文件快照永久转储到.git目录中。# git commit -m "tijiao"
![](https://img.haomeiwen.com/i795875/0699bdd2f9281693.png)
查看提交日志
- 命令:
git log
查看详细的提交信息 - 命令:
git log --oneline
简洁的日志信息 - 命令:
git reflog
查看所有提交变更操作
版本回退 回滚
- 命令:
git reset --hard [版本号]
(版本号个数随意,最好多点) - 作用:恢复到已经提交的某一个版本中
- 作用:回退到指定的版本号
- 其他方式:
git reset --hard head~1
- 1 表示回到上一次提交
- 2 表示上上一次提交
- 0 表示当前提交
忽略文件
- 作用:忽略一些不需要被git管理的文件
- 一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。 通常都是些自动生成的文
件,比如日志文件,或者编译过程中创建的临时文件等。!!!
1 在与 .git 隐藏目录同级的目录中创建 `.gitignore` 文件
2 打开 .gitignore 文件,加入忽略文件,例如:/test.html
3 路径是相对于当前 .gitignore文件 的路径
路径写法:
/css/a.css
/css/*.css
/a.html
#忽略 build/ 目录下的所有文件
build/
# 忽略后缀名为 .a 的所有文件
*.a
# !表示取反,继续追踪名为:lib.a 的文件
!lib.a
# 只忽略根目录下的 TODO文件夹,不包含 subdir/TODO
/TODO
# 忽略build下的所有文件
build/
# 忽略doc/notes.txt, 但 doc/server/arch.txt 不会忽略
doc/*.txt
# 忽略 doc/ 文件夹下所有后缀名为 .pdf 的文件
doc/**/*.pdf
1 使用
#
表示注释,例如:# 这是注释内容
2 使用*
表示通配符,匹配所有文件,例如:/css/*.css
分支 (超重要,一个不会分支的码农别说是程序员)
-
查看分支:
git branch
,当前分支会标有一个*
-
创建分支:
git branch [分支名称]
分支中的代码,与创建那一刻主分支中的内容完全相同
-
切换分支:
git checkout [分支名称]
- 切换分支之前, 必须在当前分支中完成所有的提交了
- (简写)创建并切换分支:
git checkout -b [分支名称]
-
合并分支:
git merge [其他分支名称]
,即:将其他分支
合并到当前分支
-
删除分支:
git branch -d [分支名称]
合并分支冲突
注意:合并分支时出现冲突只能手动处理文件,然后,再次提交
如果在一个从分支中做了修改,然后,在主分支中也做了修改。
此时,将这个从分支合并到主分支的时候,就会出现合并冲突的问题!
在两个分支中同时修改了一个文件中的内容,此时,就会造成合并分支冲突
,如果发生了合并冲突,需要我们`手动解决`!
1 `决定保留哪个分支中的内容`
2 `重新提交`
操作:将 hotfix 分支,合并到cart分支中
HEAD:表示当前分支
hotfix: 表示被合并分支
<<<<<<< HEAD
<span>第三次修改的内容</span>
<cart>这是在 cart 分支中提交的内容</cart>
=======
<span>第三次修改的内容 --- hotfix 修改bug</span>
>>>>>>> hotfix
分支的说明
- 1 开发的项目都是由多个分支组成:主分支 + dev分支
- 2 项目经理新建项目仓库,所有的程序员都从这个仓库中获取代码,完成开发任务
- 3 项目经理:搭建设计仓库,创建master分支,以及dev分支(以及 debug分支等)
- 4 所有的程序员在 dev分支 上进行开发,并且还有自己维护的分支
- 5 程序员在分支上完成开发任务后,会提交合并请求
- 6 项目经理安排测试,如果没有问题了,最后才会与 master 分支合并
远程仓库操作
将代码提交到远程仓库(HTTPS)
- 1 在本地创建仓库
git init
git config
- 2 新建
README.md
文件,并输入任意内容 - 3 将
README.md
提交到本地git add
git commit
- 4 在github中新建仓库,并拿到仓库地址
- 5 使用命令
git push [仓库地址] master
提交内容到github的默认分支 - 6 刷新github仓库页面,在线修改
README.md
文件,并提交 - 7 使用命令
git pull [仓库地址] master
获取仓库中的最新内容
获取远程仓库内容
- 命令:
git pull [仓库地址] [分支名称]
获取远程仓库最新内容 - 命令:
git clone [仓库地址] [自定义本地仓库名]
将整个仓库克隆到本地- 实例:
git clone git://github.com/jquery/jquery.git myJQ
- 实例:
- 当你执行
git clone
命令的时候,默认配
置下远程 Git 仓库中的每一个文件的每一个版本都将被拉取下来
简化操作
回到开始:看那个推送:
git push https://github.com/MaWenxing/sh-demo1.git master
如果每次更新推送,难道都要把这全部复制一遍吗???是不是觉得这样很坑呢???那么来简化吧!
简化操作效果一:
1. git remote add origin https://github.com/MaWenxing/sh-demo1.git
2. git push origin master
详解一:
-
git remote add origin 仓库地址
- origin 可以是任意的名称,比如:abc
- 作用:使用
origin
代替仓库地址
,方便操作 -
origin
就相当于js的变量
,[仓库地址]
就相当于变量的值
- 重命名:
git remote rename origin abc
- 删除:
git remote rm origin
- 查看
remote
的变量 :git remote
- 设置以后,推送操作命令
git push origin master
- 设置以后,推送操作命令
简化操作效果二:
1. git remote add origin https://github.com/MaWenxing/sh-demo1.git
2. git push -u origin master
3. git push origin
以后拉取:
4. git pull origin
详解二:
- 2省略
-
git push -u origin master
作用:-u
参数将origin与master连
在一起 :unit
-
- 使用简化命令
'git push origin'
就代替原来:"git push [仓库地址] master"
- 使用简化命令
- 以后拉取命令:
git pull origin
- 以后拉取命令:
SSH介绍
非对称加密、公钥和私钥
GitHub 需要识别出你推送的提交确实是你推送的,而不是别人冒充的,
而 Git 支持 SSH 协议,所以,GitHub 只要知道了你的公钥,
就可以确认只有你自己才能推送,从而省去每次输入密码的操作。
可以同时设置多个SSH key,比如:你可以在公司电脑提交需要一个key,
回家后自己的电脑提交也需要一个key
ssh是一种安全的传输模式
github要求推送代码的用户是合法的,所以每次推送时候都要输入账号密码,
用以验证你是否为合法用户,为了省去每次都要输入密码的步骤,采用shh公钥,密钥
也就是你说的sshkey来验证你是否为合法用户
在你的电脑生成了一个唯一的ssh公钥和私钥,公钥放到github上面,当你推送的时候,git就会
匹配你的私钥是否跟github上面的公钥是配对的,正确就认为你是合法的,允许推送。
sshkey可以理解为是你的身份标识,放在github上面表明你是这个项目的一个开发人员,但是别
人是可以截获的,你本机的私钥别人就无法截获,sshkey就可以保证每次传输都是安全的。
将代码提交到远程仓库(SSH)
- 1 创建SSH Key:
ssh-keygen -t rsa
- 2 在文件路径
C:\用户\当前用户名\
找到.ssh
文件夹 - 3 文件夹中有两个文件:
- 私钥:
id_rsa
- 公钥:
id_rsa.pub
- 4 在
github -> settings -> SSH and GPG keys
页面中,新创建SSH key - 5 粘贴 公钥
id_rsa.pub
内容到对应文本框中 - 6 在github中新建仓库或者使用现在仓库,拿到
git@github.com:用户名/仓库名.git
(来自 Se7ven) - 7 此后,再次SSH方式与github“通信”,不用输入密码确认身份了
通过 SSH 的方式能够:
- 实现免密操作(不需要每次都输入用户名和密码)
- 有利于多人合作开发目的(让多个人都能够操作同一个仓库)
最佳实践
- 先获取再提交,即:先pull再push
- 获取跟新的其他方式:fetch
- pull和fetch的区别
github搭建博客
- github 提供了 静态服务器 的功能
- 使用github服务器的
gh-pages
分支
1 在本地工作目录使用git初始化 `git init`
2 创建自己的博客项目
3 将创建好的博客添加到暂存区 `git add [文件路径]`
4 本地提交: `git commit -m "第一个博客"`
5 创建分支:`git branch gh-pages` 分支名称固定!
6 切换分支:`git checkout gh-pages`
7 提交到github:`git push [github仓库地址] gh-pages`
8 查看github中对应的仓库中,是不是提交到了 "gh-pages" 分支
9 访问:<github用户名>.github.io/<仓库名>/<文件名>
10 默认会访问 index.html
动态页面:.jsp / .php / .asp / .aspx
网友评论