文章目录
前言
lucifer先后在两间企业进行嵌入式软件方面的开发和维护,他们软件的版本控制都是用svn,每次关键时刻你想查看某份软件的更新日记时,打开log的加载速度实在不敢恭维。后来打听几位就业于其他企业的同学用的版本控制软件时,做android或裸框架的linux项目软件的版本维护均为git,然后我就参考廖雪峰的git教程(网址在本文末)产出此篇学习笔记。
第一章 git安装和创建版本库
1. 安装git
-
从网络下载和安装:
sudo apt-get install git
-
设置将来所有仓库的个人信息:
$ git config --global user.name "name"
$ git config --global user.email "email@example.com"
2. 创建版本库
-
初始化当前目录作为仓库:
git init
-
指定文件纳入仓库的管理:
$ git add <file>
$ git commit -m "xxx"
- 移除git对文件的版本管控:
git rm <file>
-
加入暂存区操作的扩展:
-
暂存
所有变化:
git add -A
-
暂存
修改(modified)和
被删除(deleted)文件,不包括新文件(new):
git add -u
-
暂存
新文件(new)和
被修改(modified)文件,不包括被删除(deleted)文件:
git add .
第二章 时光机穿梭
-
查看仓库状态:
git status
-
查看文件差异的内容:
git diff <HEAD -- file>
(忽略文件权限差异:git config core.filemode false
) -
查看提交的记录:
git log <--pretty=oneline>
-
查看被管控的文件:
git ls-files
-
相对当前版本进行回退:
git reset --hard HEAD^
注:“^”的个数表示向后回退版本的个数
-
切换到任意版本:
git reset --hard <commit-id>
-
查看版本变更历史:
git reflog
重要概念:工作区,版本库=暂存区+分支
理解Git是如何跟踪修改的,每次修改,如果不add到暂存区,那就不会加入到commit中。
-
撤销文件的更改:
-
①
暂存区中的修改内容回退到工作区:
git reset HEAD <file>
-
② 丢弃
工作区的修改(实为覆盖目标文件):
git checkout [branch] -- <file>
;丢弃所有:git checkout .
(除新增文件外)
生成补丁和打补丁:
-
①
目标版本工程文件夹内生成补丁:
git diff <老版本commit-id> <新版本commit-id> > xxx.patch
;若两个版本间差异存在二进制文件,如添加了bmp图片时,git diff <old-id> <new-id> --binary > xxx.patch
-
②
老版本工程文件夹内打补丁:
git apply xxx.patch
第三章 远程仓库
-
将github作为远程库:
-
① 创建SSH key:
ssh-keygen -t rsa -C "youremail@example.com"
- ② 登录github,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴 id_rsa.pub文件的内容.
1. 添加远程库
- 将本地库关联远程仓库:
$ git remote add origin git@github.com:<用户名>/<仓库名>.git
| |
本地库给远程库起名 在github上创建时填的仓库名
-
删除与远程库的关联:
git remote rm origin
-
第一次往远程库推送:
$ git push -u origin master
|
本地库主分支默认名
- 后续推送更新到远程库:
git push origin <branch>
2. 从远程库克隆到本地
-
项目从零开始时:
- ① 创建远程库;
-
② 克隆到本地:
git clone <addr>
。
ssh协议克隆github的仓库:
$ git clone git@github.com:<用户名>/<仓库名>.git
Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。
第四章 分支管理
1. 创建与合并分支:
-
查看分支:
git branch
-
创建分支:
git branch <name>
-
切换分支:
git checkout <name>
-
创建+切换分支:
git checkout -b <name>
-
合并某分支到当前分支:
git merge <name>
-
删除分支:
git branch -d <name>
注:HEAD指向的是当前分支,master是主分支的默认名
2. 解决分支冲突
不同分支修改同一位置时,“快速合并”会产生冲突,在冲突位置会有指示。解决冲突后,再提交,合并完成。
显示分支合并图:
$ git log --graph --pretty=oneline --abbrev-commit
| |
简化显示 commit的SHA1只显示7位
3. 分支管理策略
a. 禁用Fast forward合并分支
-
git merge <name>
会用fast forward模式,删除分支后,会丢掉分支信息。 -
强制禁用Fast forward模式,git就会在merge时生成一个新的commit,分支历史上可以看出分支信息。
-
禁用fast forward模式的合并:
$ git merge --no-ff -m "xxx" <brach name>
b. 分支管理
-
master分支应该是非常稳定的,仅用来发布新版本,平时不能在上面干活;
-
一般在dev分支干活,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
-
每个人都在dev分支上干活,每个人都有自己的分支,特定时候再往dev分支合并自己的更新。
4. bug分支
① 修复bug时,创建新的bug分支进行修复,然后合并,最后删除;
②保存工作现场(未commit的更改):
$ git stash
③查看已经保存的工作现场:
$ git stash list
④恢复工作现场:
第一种 先恢复,再删掉:
$ git stash apply stash@{n}
$ git stash drop stash@{n}
第二种 恢复+删除:
$ git stash pop
5. 强行删除分支
-
开发一个新feature,最好新建一个分支;
-
丢弃一个没有被合并过的分支,强行删除:
$ git branch -D <name>
6. 多人协作
a. 推送分支
$ git push origin <branch-name>
master分支:主分支,时刻与远程同步;
dev分支:开发分支,团队所有成员都需要在上面工作,也需要与远程同步;
bug分支:只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
feature分支:是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
b. 抓取分支
① 从远程库克隆下来;
② 在本地只能看到master
分支,需在远程库的其它分支工作时,创建远程origin/dev
分支到本地:
$ git checkout -b <branch> origin/<branch>
③提交更新给本地库,推送到远程库。
c. 合并远程库的更新到本地
-
查看远程库信息:
git remote -v
-
建立本地分支和远程分支的关联:
git branch --set-upstream <branch-name> origin/<branch-name>
-
合并远程库关联的分支下来:
git pull origin <branch-name>
-
更新本地的远程分支列表:
git remote update origin -p
注:如果合并有冲突,则解决冲突,并在本地提交;再推送成功。
第五章 标签管理
1. 创建标签
-
查看所有标签:
git tag
-
给HEAD贴标签:
git tag <tagname>
-
对特定commit id贴标签,并附带信息:
git tag -a <tagname> -m "xxx..." <commit-id>
-
用PGP签名贴标签:
git tag -s <tagname> -m "xxx..." <commit-id>
-
通过标签看commit内容:
git show <tagname>
2. 操作标签
-
推送本地标签到远程库:
git push origin <tagname>
-
推送所有标签:
git push origin --tags
-
删除本地标签:
git tag -d <tagname>
-
删除远程库的标签:①先删除本地标签;②
git push origin :refs/tags/<tagname>
第六章 使用gitHub
-
山寨别人的仓库到自己用户里:
Fork
-
给作者发送修改请求:
New pull request
第七章 自定义git
- 配置git交互的内容具有颜色:
$ git config --global color.ui true
1. 忽略特殊文件
① 在Git工作区的根目录下创建一个特殊的.gitignore
文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。现成的配置文件:https://github.com/github/gitignore
② 把.gitignore
文件也提交到git。
注:强制添加一个已经写入配置文件的文件:
git add -f <file-name>