基本概念
- 当工作区修改的文件执行
git add
命令后,暂存区的目录树会被更新,并且修改文件内容会被写入到对象库的一个新的对象中(对象的id被记录到暂存区的文件索引中)。 - 当执行
git commit
命令后,暂存区的目录树被写到版本库中,master分支做更新,它指向的目录树就是提交时暂存区的目录树 - 当执行
git reset HEAD
命令后,暂存区的目录树会被重写,替换成master分支指向的,但工作区不受影响
安装配置
git config —global user.name/email 配置用户主目录下的信息,用于识别用户
for mac: user.name minihippo
user.email gengxiaoyu1996@gmail.com
- 查看配置信息1git config --list
创建版本库
git init
进入目录12git initInitialized empty Git repository in /Users/shawygeng/Project/blog/.git/clone
添加远程仓库*1git clone [url]add
添加修改文件到缓存12git add filenamegit add --all /. //添加所有改动(包括删除操作)commit
提交修改到仓库1git commit -m 'information' //附加信息
远程仓库
remote/clone
,remote add
,remote rm
,push
,fetch
,merge
ssh加密
12ssh-keygen -t rsa -C 'gengxiaoyu1996@gmail.com'Generating public/private rsa key pair.remote add
添加远程仓库地址12git remote add origin https://github.com/minihippo/LeetCode.gitgit remote add -f ssh/http //fetch,添加并获取最新版本到本地remote rm
删除远程仓库1git remote rm origin //主机名remote
查看当前远程库12345git remoteorigingit remote -vorigin https://github.com/minihippo/LeetCode.git (fetch)origin https://github.com/minihippo/LeetCode.git (push)push
向远程库提交内容12git push -u origin masterßgit push -u origin branchname:branchname提取远程库内容
fetch
从远程仓库下载新分支与数据1git fetch origin //主机名merge
从远程仓库提取数据并合并到当前分支1git merge origin/master //将origin master分支合并到本地分支
分支管理
branch
,branch -d
,cheeckout
,merge
,clean
branch
创建分支1git branch branchnamebranch
删除分支1git branch -d branchnamebranch
列出分支12git branchgit branch -r //显示远程分支checkout
切换分支123git checkout branchnamegit checkout -b branchname //创建新分支并切换到当前目录下git checkout -b branchname origin/branch //创建远程分支到本地分支ßmerge
合并分支1git merge <branchname> //合并分支branchname到当前分支clean
切换分支冲突当我们在一个分支下修改文件并未add,此时需要切换另一分支,就会产生冲突。
clean命令就是用来删除未add的文件123456The following untracked working tree files would be overwritten by checkoutgit clean -d -fx//-n 显示将要删除的文件和目录;//-x -----删除忽略文件已经对git来说不识别的文件//-d -----删除未被添加到git的路径中的文件//-f -----强制运行
撤销修改
checkout
,reset
,revert
,rm
,mv
checkout
撤销对工作区的修改1git checkout ./<filename>reset
撤销对缓存区的修改,取消add。 //用master指向的目录替换缓存区目录文件12git reset HEAD /filegit reset --merge //撤销mergerm
移除缓存区内容12git rm filename //同时删除工作区内容git rm --cached filename //只删除缓存区内容revert
已经commit且push,撤销commitgit revert是用一次新的commit回滚之前的commit,不会造成版本冲突问题。
1git revert commit标识码reset
已经commit且push本地版本回退
12git reset --hard <版本号> //抛弃当前工作区修改git reset --soft //保留工作区修改本地提交,此时本地版本落后远程版本
1git push origin branch --forcemv
移动或重命名工作区文件1git mv filename filenname
版本管理
status
,diff
status
查看缓存区状态12git statusgit status -s //简短输出diff
查看项目缓存区状态1234git diff //没缓存的改动git diff --stat //摘要git diff --cached //已缓存的改动git diff HEAD //查看所有改动
标签
tag
,tag -d
,show
,log
tag
添加标签12git tag v1.0git tag -a v1.0 //创建一个带注解的标签tag
查看已有标签1git tagtag
删除标签1git tag -d v1.0show
查看版本修改内容12git show v1.0git log -oneline
子项目
subtree
,subtree add
,subtree pull
,subtree push
subtree
概念当一个项目里有个目录,而这个目录是包括其他独立项目。因此需要使用subtree管理同步子目录下的项目。
添加子项目的远程库
1git remote add subpro ssh/httpsubtree add
添加子项目12git subtree add --prefix=subfile_path subpro branchnamegit subtree add --prefix subfile_path hostname branchname --squash //把子项目的更新记录当作一个commit合并,并且合并到主项目中subtree push
提交子项目更改1git subtree push --prefix=subfile_path hostname branchnamefetch,subtree pull
更新子项目12git fetch hostname branchnamegit subtree pull --prefix=subfile_path hostname branchname [--squash]
Reference
[官网手册]https://git-scm.com/docs