1.安装Git
git-scm.com/book/zh/v2 安装地址
通过 git --version 来查看版本(是否安装成功)
/*
*命令行的简单命令
*/
pwd // 当前工作的路径(linux上的命令dir是window)
tree // 查看树状结构图
rd //删除文件夹
type nul>文件名称 //创建文件
echo 内容 > 写入文件路径
del //删除文件
2.使用Git之前需要做的最小配置
配置 user 信息
配置 user.name 和 user.email
git config --global user.name '用户名'
git config --global user.name '邮箱'
/*
*config 的三个作用域
* ----------省略等同于local-----------
* $ git config --local // local 只对某个仓库有效
* $ git config --global // global 对当前用户所有仓库有效
* $ git config --system // system 对系统所有登录的用户有效
*.......................
*--------显示 config 的配置,加上--list --------
* $ git config --list --local
* $ git config --list --global
* $ git config --list --system
*/
3.建Git仓库
两种场景:
1.把已有的项目代码纳入Git管理
cd 项目代码所在的文件夹
git init
2.新建的项目直接用Git管理
cd 某个文件夹
git init your_project //会在当前目录下创建和项目名称同名的文件夹作为仓库
cd your_project
通过实践得出local的优先级要比global高(限于他俩之间)
4.工作区和暂存区
$ git add //后面可以跟多个文件
$ git commit -m '版本描述' //添加到版本库
$ git add -u //把git已经管理的文件一起提交到暂存区
$ git status // 查看git当前状态
$ git log // 查看git的日志
建议把写好的文件(git add)放到暂存区,把为一个目的的所有文件生成一个commit提交到版本库
5.给文件重命名的简便方法
$ mv readme readme.md //检查状态会给你提示
$ git add readme.md
$ git rm readme // git很智能会认为我们在重命名
///////////简便写法/////////
$ git mv readme readme.md //git提供的重命名
-------
$ git reset --hard //此项命令比较危险会清空暂存区所有的操作(进行复原)
6.通过git log查看版本演变历史
$ git log --oneline //简洁的查看commit的列表
$ git log -n4 // -n[val]代表查看最近的几次历史可以和--oneline 配合使用
$ git branch -v //查看本地有多少的分支
$ git log --all //查看所有分支的版本(默认是查看当前分支的)
$ git log --all --graph // 图形化的查看
7.通过图形界面工具来查看版本历史
$ gitk //查看版本历史图形化
8.探秘.git目录
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2020/1/31 23:49 hooks
d----- 2020/1/31 23:49 info
d----- 2020/2/1 15:36 logs
d----- 2020/2/1 16:12 objects
d----- 2020/1/31 23:49 refs
-a---- 2020/2/1 16:12 22 COMMIT_EDITMSG
-a---- 2020/1/31 23:49 130 config
-a---- 2020/1/31 23:49 73 description
-a---- 2020/2/1 20:13 216 gitk.cache
-a---- 2020/1/31 23:49 23 HEAD
-a---- 2020/2/2 0:51 466 index
HEAD //文件告诉我们现在工作在哪个分支上(这是个引用指向refs)
config //里面放的是配置信息(用户名和邮箱)
refs // 它里面包含heads tags
----------
refs => heads 里面放的是你创建的分支(多人协作开发会创建很多分支)
refs => tags //里面放的是你标记的tags,指向commit。
objects //里面有很多松散的文件,git会自我梳理,把过多的文件打包放在pack里。
// **git 中有tree的概念**
// 在git眼里只要内容相同就是唯一的一个blob
/*
*d----- 2020/2/1 16:12 ca
*d----- 2020/2/1 15:36 ee
*d----- 2020/2/1 15:36 ef
*d----- 2020/1/31 23:49 info
*d----- 2020/1/31 23:49 pack
* // 根据git cat-file -t ca(两位文件名和里面的编码信息可以检测出来类型)
*/
===============
$ git cat-file -t 跟编码 //检查类型
$ git cat-file -p //根据对象的类型显示其内容
9.commit、tree、blob三个对象之间的关系
一个commit对应着一个tree。一个tree下面包含着tree和blob。
10.分离头指针情况下的注意事项
detached HEAD // 分离头指针
分离头指针是指你目前正在工作于没有分支的情况下,你可以继续做开发,但是如果偶尔有一天你切换分支工作,没有和分支挂钩的文件会被git清理掉。(好处是你想做尝试开发时可以使用,如果感觉不好直接切换分支不用理会)
- 如果变更的很重要一定要和分支绑定在一起
进一步理解 HEAD 和 branch
// 查看两个commit的区别
$ git diff 编号 编号
$ git diff HEAD HEAD^1 // 每次加^1代表他的父级~1一样^^
11.删除不需要的的分支
使用
git branch -d (branch-name)
// 如果删除不掉用户在有风险把控的情况下可以使用 -D删除。
12.怎么修改最新commit的message?
$ git commit --amend //windows打开commit进行修改 esc退出 大写 ZZ 保存
13.怎么把间隔的几个commit整理成一个
通过
git rebase -i 编号
最好从他父级 git rebase --root 从跟开始
- 进入后pick为保留的,s为合并的。后面一个页面第一行描述一下
14.怎么比较暂存区和HEAD所含文件的差异
git diff --cached // 把暂存区的文件和HEAD指向的作比较
15.怎么比较工作区和暂存区所含文件的差异?
git diff
//默认就是工作区和暂存区比较
git diff -- 文件名
不加文件名是吧工作区所有的文件和暂存区作比较
$ git diff [head] [head] -- 文件名
/*
*比较两个commit的文件区别
*/
16.如何让暂存区恢复成和HEAD一样?
git reset HEAD
//恢复暂存区和HEAD一样
17.如何让工作区的文件恢复成和暂存区的一样
- 如果想变工作区的内容用
checkout
暂存区用reset
$ git checkout -- 文件名 //把工作区文件恢复成暂存区一样
18.怎么取消暂存区部分文件的更改
$ git reset HEAD -- 文件名 //把暂存区指定文件更改成原来
19.消除最近的几次提交
$ git reset --hard 指针 // 恢复到指针的指向
20.正确删除文件的方法
$ git rm 文件名
21.开发中临时加塞了紧急任务怎么处理?
$ git stash // 先把当前未完成任务放到一块区域藏起来,处理紧急任务
$ git stash list //查看区域列表
//////取出来有两种办法//////
$ git stash apply //取出暂时放的文件,不删除可复用
$ git stash pop // 取出暂时放的文件,并删除
22.如何指定不需要Git管理的文件
.gitignore 文件来配置不受git管理的文件
doc //指定doc文件和文件夹里面的文件不受管理
doc/ //指定doc文件夹以下的文件不受管理
//如果doc和doc/同时存在,但要git管doc文件夹,不管doc文件,要怎么设置呢?
doc
!doc/*
23.如何将Git仓库备份到本地
哑协议与智能协议
直观区别: 哑协议传输进度不可见;只能协议传输可见
传输速度: 智能协议比哑协议传输速度要快。
git命令之git remote的基本用法
1.git remote 不带参数,列出已经存在的远程分支
2.git remote -v | --verbose 列出详细信息,在每一个名字后面列出其远程url,此时, -v 选项(译注:此为 –verbose 的简写,取首字母),显示对应的克隆地址。
3.git remote add url 添加一个远程仓库
修改远程仓库在本地名称
git remote rename 已有 变更
24.配置公私钥
ls -al ~/.ssh
查看是否存在现有的SSH秘钥
$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
生成新SSH秘钥 。
drwxr-xr-x 1 dell 197121 0 2月 3 16:02 .
drwxr-xr-x 1 dell 197121 0 2月 3 01:24 ..
-rw-r--r-- 1 dell 197121 3381 2月 3 16:02 id_rsa (私钥)
-rw-r--r-- 1 dell 197121 742 2月 3 16:02 id_rsa.pub (公钥)
-rw-r--r-- 1 dell 197121 802 5月 1 2019 known_hosts
私钥留在本地,公钥配置到公网上
25.把本地仓库同步到GitHub
git push github --all //全都上传到远端
git fetch github 分支 //拉具体分支
git merge -h // 来处理
git merge --allow-unrelated-histories github/master //允许两个不相关的分支进行merge
26.不同人修改了不同文件如何处理
先把分支fetch 下来,然后merge 。再push。
27.不同人修改了同文件的不同区域如何处理
每次做开发时和远端同步一下是个好习惯
git pull
(这个命令执行了git fetch ,git merge)
思路:1.把远端代码拉下来进行merge可以执行git pull
。这时git会给你报冲突的问题,需要我们手动解决。可以利用图形化,和命令行多种解决方式。然后git status
查看一下当前的状态,会告诉你确不确定merge 。如果确定git commit -am
最后push。
28.同时变更了文件名了文件内容如何处理(别人还不知道)
遇见这种情况直接
git pull
git会非常智能的帮我们merge。
29.把同一文件改成了不同的文件名如何处理
这种情况依旧用
git pull
看git会不会帮助我们自动merge。现实是git对于这种情况并不会。他会给我们报文件冲突,让我们自己协商解决。依次删除不需要的,添加更改的。
30.Git集成使用的禁忌
- 禁止向集成分支执行
push -f
操作
$ git push -f
的危害 会强制干掉一些commit
- 禁止向集成分支执行变更历史的操作
公共的分支是禁止执行
git rebase -i
命令的,这样会破坏历史。