- Git是分布式版本控制系统
- GitHub是代码托管平台
两者配合食用,GitHub不仅是代码版本库还将Git操作可视化。
简介
Git是Linux之父为了管理Linux内核开发而创立的。
git基本概念
- 工作区:仓库的目录。工作区是独立于各个分支的。
- 暂存区:数据暂时存放的区域,类似于工作区写入版本库前的缓存区。暂存区是独立于各个分支的。
- 版本库:存放所有已经提交到本地仓库的代码版本。
- 版本结构:树结构,树中每个节点代表一个代码版本。
Git的版本控制实现原理就是树结构
git常用命令
查看仓库状况是最常用的命令。
git status:查看该仓库状态
git diff XX:查看XX文件相对于暂存区修改了哪些内容,若暂存区无对应文件则比较版本库中Head指向版本的文件区别。
git log:查看当前(HEAD指向)分支的所有(empty到HEAD)版本
git log --pretty=oneline:显示更加条理性,查看当前(HEAD指向)分支的所有(empty到HEAD)版本
git reflog:查看HEAD指针的移动历史(包括被回滚的版本)
从下到上(最新)可以查看每次的提交详情和切换分支的操作
git branch:查看所有分支和Head当前所处分支
本地Git仓库
git config --global user.name xxx:设置全局用户名,信息记录在~/.gitconfig文件中
git config --global user.email xxx@xxx.com:设置全局邮箱地址,信息记录在~/.gitconfig文件中
git init:将当前目录配置成git仓库,信息记录在隐藏的.git文件夹中
git status:查看该仓库状态
git add XX:将XX文件添加到暂存区
- git add .:将所有待加入暂存区的文件加入暂存区

git rm --cached XX:将文件从仓库索引目录中删掉,不再处理扫描对应文件。
git commit -m “给自己看的备注信息”:将暂存区的内容提交到当前(HEAD指向)分支
git diff XX:查看XX文件相对于暂存区修改了哪些内容,若暂存区无对应文件则比较版本库中Head指向版本的文件区别。
git log:查看当前(HEAD指向)分支的所有(empty到HEAD)版本

git log --pretty=oneline:显示更加条理性,查看当前(HEAD指向)分支的所有(empty到HEAD)版本
git reflog:查看HEAD指针的移动历史(包括被回滚的版本)
从下到上(最新)可以查看每次的提交详情和切换分支的操作
git reset --hard HEAD^ 或 git reset --hard HEAD~:将代码库回滚到上一个版本(实质上是将HEAD指向对应版本节点)
回滚后更新工作区代码为对应HEAD指向版本内容。
- git reset --hard HEAD^^:往上回滚两次,以此类推
- git reset --hard HEAD~100:往上回滚100个版本
- git reset --hard 版本号:回滚到某一特定版本
配合git reflog或者log查询版本号(前七位)食用
git checkout — XX或git restore XX:将XX文件尚未加入暂存区的修改全部撤销
- git restore XX:回滚文件将暂存区或HEAD指向版本节点中的xx文件回滚到工作区
- git restore 文件名 会撤销到缓存区或者当前版本库版本
- 撤消工作区的修改返回到最近一次add(缓存区)的版本或者最近一次commit(当前版本库)的版本
- git restore --staged XXX: 撤销 暂存区但不修改工作区
- git restore XXX: 撤销 暂存区修改工作区
- git restore详细
远程Git仓库(SSH)
git push:将当前所在(Head指向)分支push到远程仓库
git remote add origin user@hostname:账号/仓库XXX.git:将本地仓库关联到远程仓库(需要在本地仓库的父级目录下执行)
- user: 服务器用户名
- hostname: 服务器公网IP地址或域名
git push -u origin master(第一次需要-u以后不需要):将当前分支推送到远程仓库
git push origin branch_name:将本地的某个分支推送到远程仓库
git clone user@hostname:账号/仓库XXX.git:将远程仓库XXX下载到当前目录下
多分支
注意:多分支和本地工作区没关系,不管切换到哪个分支,本地工作区内容不变。
但是暂存区中的内容则是需要考虑到是否在对应分支中提交修改所以切换分支的时候需要保证暂存区为空。
git branch:查看所有分支和Head当前所处分支
git branch branch_name:创建新分支
git checkout -b branch_name:创建并切换到(Head指向)branch_name这个分支
git checkout branch_name:切换到branch_name这个(Head指向)分支
git merge branch_name:将分支branch_name合并到当前(head指向)分支上。实际上是将该分支作为节点添加到当前(head指向)分支。
合并分支可能产生冲突,先在本地工作区文件中体现冲突内容,人为修改完本地冲突后再commit添加到当前分支节点。
git branch -d branch_name:删除本地仓库的branch_name分支
git push:将当前所在(Head指向)分支push到远程仓库
git push --set-upstream origin branch_name:设置当前所在(Head指向)分支的branch_name分支对应远程仓库的branch_name分支
git push -d origin branch_name:删除远程仓库的branch_name分支
git pull:将远程仓库的当前(Head指向)分支与本地仓库的当前(Head指向)分支合并
- git pull origin branch_name:将远程仓库的branch_name分支与本地仓库的当前(Head指向)分支合并
将远程仓库的新节点更新到本地仓库
git branch --set-upstream-to=origin/branch_name1 branch_name2:将远程的branch_name1分支与本地的branch_name2分支对应
git checkout -t origin/branch_name将远程的branch_name分支拉取到本地
git stash:将工作区和暂存区中尚未提交的修改存入栈中
git stash list:查看栈中所有元素
git stash apply:将栈顶存储的修改恢复到当前分支,但不删除栈顶元素
git stash drop:删除栈顶存储的修改
git stash pop:将栈顶存储的修改恢复到当前分支,同时删除栈顶元素
总结
注意:多分支和本地工作区没关系,不管切换到哪个分支,本地工作区内容不变。
但是暂存区中的内容则是需要考虑到是否在对应分支中提交修改所以切换分支的时候需要保证暂存区为空。
合并分支可能产生冲突,会在本地工作区文件中体现冲突内容,人为修改完本地冲突后再commit添加到当前分支节点。
分支融合冲突和异步上传冲突根本原因都是因为相同文件不同内容融合产生的冲突,冲突会体现在的本地工作区文件中。
修改本地冲突文件内容后commit提交就可以生成新节点了。
