第一章 Git基础
1. git最小配置
- 配置user.name 和user.email.
- global的作用: 每一次的变更,在哪个时间点是谁做出的变更,在做CR的时候,每一次的变更如果带上了 用户的email地址,那么评审的人员在平台上面指出哪里有问题以后,Git会自动把变更者的email取出来,并发送邮件。
git config --global user.name 'your_name'
git config --global user.email 'your_email'
git config --local : local只对某个仓库有效,优先于global设置的
git config --global : global对于当前用户所有仓库有效
git config --system : system对系统所有登录的用户有效
-显示config的配置 加–list
git config --list --local
git config --list --global
git config --list --system
2. 建立Git仓库
2.1 把已有项目代码纳入git管理
cd 项目代码所在文件夹
git init
2.2 新建项目直接用git管理
cd 某个文件夹
git init your_project # 会在当前路径下创建和项目名称同名的文件夹3
3. 通过几次commit来认识工作区和暂存区
git 相关命令:
xcopy:Dos命令行复制文件及文件夹
git add **:添加到暂存区
git commit -m'reason':
git status:
git log:
git add -u:将文件的修改、文件的删除,添加到暂存区。
git add .:将文件的修改,文件的新建,添加到暂存区。
git add -A:将文件的修改,文件的删除,文件的新建,添加到暂存区。
工作中一般是用到 git add . 或者 git add -A, 今天学习更进一步解了 git add -u 以及他们之间的区别
git add -A相对于git add -u命令的优点 : 可以提交所有被删除、被替换、被修改和新增的文件到数据暂存区,而git add -u 只能操作跟踪过的文件
git add -A 等同于git add -all
4. 给文件重命名的简便方法
普通方式:这种方式就是把readme删掉并且新增了一个md结尾的readme文件
1. mv readme readme.md
2. git add readme.md
3. git rm readme
利用git的方式:只需要一步
git mv readme readme.md
5. 通过git log 查看版本演变历史
git log --oneline:以列表的方式查看
git log -n4 --oneline:最近4次log
git branch -v:本地有多少分支
git checkout -b temp dd856d901d76308f5729d767179c8e03ae0c0f76//创建分支
git log --all --graph//图形化的分支代码演进关系
$ git log --oneline --all -n4 --graph:以图像列表的形式查看所有分支最近四次提交
笔记:
? git log --all 查看所有分支的历史
? git log --all --graph 查看图形化的 log 地址
? git log --oneline 查看单行的简洁历史。
? git log --oneline -n4 查看最近的四条简洁历史。
? git log --oneline --all -n4 --graph 查看所有分支最近 4 条单行的图形化历史。
? git help --web log 跳转到git log 的帮助文档网页
6. 以图象的形式查看git
gitk:开启图形界面查看版本管理界面
gitk 后面可以跟上文件的路径, 这样能看单个文件的修改历史的具体内容。
7. 填充.git目录
1. cat命令主要用来查看文件内容,创建文件,文件合并,追加文件内容等功能。
cat HEAD 查看HEAD文件的内容 (显示 refs/heads/mater)
git cat-file 命令 显示版本库对象的内容、类型及大小信息。
git cat-file -t b44dd71d62a5a8ed3 显示版本库对象的类型
git cat-file -s b44dd71d62a5a8ed3 显示版本库对象的大小
git cat-file -p b44dd71d62a5a8ed3 显示版本库对象的内容
HEAD:指向当前的工作路径的引用
config:存放本地仓库(local)相关的配置信息
refs/heads:存放分支,各自分支不相互影响,里面存放的是指针
refs/tags:存放tag,又叫里程牌 (当这次commit是具有里程碑意义的 比如项目1.0的时候 就可以打tag)
objects:存放对象 .git/objects/ 文件夹中的子文件夹都是以哈希值的前两位字符命名 每个object由40位字符组成,前两位字符用来当文件夹,后38位做文件。打包的文件放在pack里;
1. HEAD:指向当前的工作路径 2. objects: objects里的每个文件夹目录名加上文件夹里的内容的hash值就是一个文件 git cat-file -t 33+hash值 ; 可能会得到tree/commit/blob
8. commit、tree和blob三个对象之间的关系
- 设计良好的存储机制是git的版本控制系统是非常关键
- commit: 每次执行git commit都会创建一个对象出来,一个commit会对应一棵树,不可能对应两棵树。
- tree:这个树就是这个commit提交的所有的视图,存放着一次快照。快照的集合里就是放了当前commit对应的本项仓库的所有的文件夹以及文件的一个快照。这个时间点,这个文件夹长什么样,文件长什么样,就是通过这个树来呈现的。
- blob: 具体的某个文件。只要内容相同就认为是一个文件、可以大大的节省空间
9. 小练习: git下有几个tree
git init watch_tree // 创建git仓库
cd watch_tree
mkdir doc // 创建doc目录
cd doc
echo "hello world" > readme // 创建readme文件,内容为hello world
git status // 查看当前状态
find .git/objects -type f // 查看暂存区文件,此时应当是无
git add doc // 将doc加入到暂存区
find .git/objects -type f // 此时已经有./git/objects/3b/18e12xxxx这个hash存在
git cat-file -t 3b18e // tree, 查看对象类型
git cat-file -p 3b18e /// 查看文件内容
git commit -m "Add readme" // 执行这一步操作,此时objects里会创建一个commit对象,两个tree, 一个blob
10. 分离头指针情况下的注意事项
- 就是处于游离于分支外的情况下,没有对应的分支的情况下,做了commit操作。如果没有生成对应的分支,很有可能被git当成垃圾分支
11. 进一步理解HEAD和Branch
git checkout -b new_branch old_branch :基于某个分支创建新分支并切换到新分支- HEAD: 指代当前分支的最后一次提交,如果处于分离头指针的话,就指到对应的commit上;分支也会最终落脚于某个commit
- HEAD其实最终的指向都是指向一个具体的commit;
- 1 一个节点,可以包含多个子节点(checkout 出多个分支)
- 2 一个节点可以有多个父节点(多个分支合并)
- 3
^ 是~ 都是父节点,区别是跟随数字时候,^2 是第二个父节点,而~2是父节点的父节点 - 4 ^和~可以组合使用,例如 HEAD~2^2
第二章 独自使用Git时的常见场景
- 删除分支:
git branch -D 分支名 - 怎么修改最新commit的message:
git commit --amend (修改最近一次提交的变更)- 修改前几次commit的修改
1、git log --oneline -5
查看最近5次commit的简要信息,输出信息为:简短commitID commit_message,可以根据需要查看最近n次的提交
也可以git log -5,输出信息相对详细些,commitID为完整的,这里只需要加上参数--oneline查看简短commitID即可
2、git rebase -i <简短commitID>: 变基: 要选择被变commit的父亲commit
如果需要修改从上往下第2个commit_message,这里的简短commitID为上面输出信息的第3个,以此类推
在弹出的窗口中,以VIM编辑方式显示了最近两次的提交信息
3、(按照VIM操作)按i键,进入编辑模式,将想要修改的提交前的pick改为reword,如果需要修改多个,也可以将对应的多个pick改为reword
4、(按照VIM操作)按ESC键 再按 shift + : 然后输入wq(w是保存,q是退出) 按回车键
5、在弹出的窗口中,按i进入编辑模式,就可以修改commit_message了
6、(按照VIM操作)按ESC键 再按 shift + : 然后输入wq(w是保存,q是退出) 按回车键(同第4步)
如果第3步中修改了多个pick为reword,则会多次弹出修改界面,重复第5~6步即可
7、再使用第1步的命令查看一下修改结果,git log --oneline -5或者git log -5,查看修改是否已经完成
8、最后强制push上去git push --force
- 合并连续commit: git rebase -i 合并id的父级id,然后利用squash
- 合并间隔commit: 还是在变基里用
2. 暂存区和head如何比较
git diff --cached : 和暂存区做对比- 工作区和暂存区的差异:git diff
3. 如何让暂存区恢复成和HEAD一样
4. 如何让工作区的文件恢复成和暂存区一样
- 变更工作区的内容用checkout,变更暂存区的内容用reset
git checkout -- index.html
5. 取消暂存区的部分文件的修改
git reset HEAD --styles/style.css xx xx
6. 消除最近的几次提交
git reset --hard commit_id
7. 看看不同指定文件的差异
git diff temp master --index.html 两个分支之间的比对git diff commit_id1 commit_id12 -- index.html
8. 正确删除文件的方法
9. 开发中临时加加塞了紧急任务怎么处理
- 临时修复bug
- 先用
git stash 存放起来 git stash list 会出现对应idgit stash apply 就恢复了,不会丢掉stash里的信息git stash pop 会丢掉stash里的信息
10. 如何指定不需要GIT里的文件
- 加了斜杠,是说该文件夹下的文件不管,但是当前的文件夹要管
11. 如何将git仓库备份到本地
git clone --bare : bare不在工作区的仓库- 智能协议还做了相应的压缩
12. github和本地git
git remote add xxx git pull 从远程拉代码到本地git branch -va : 把远端代码的分支也显示出来git checkout -b feature/add_git_command origin/feature/add_git_commands - 协同开发的时候不能用
git push -f - 公共分支严禁变基
|