此内容为内部分享,大多内容为口述,无需详看
Why
- 自己
- 团队
什么是Git
Git是Linux发明者Linus开发的一款新时代免费、开源的分布式版本控制系统。
Github与Git关系
引用一下stormzhang 初识 GITHUB的一段话
Git 是一款免费、开源的分布式版本控制系统,他是著名的 Linux 发明者 Linus Torvalds 开发的。说到版本控制系统,估计很多人都用过 SVN ,只不过 Git 是新时代的产物,如果你还在用 SVN 来管理你的代码,那就真的有些落伍了。不管是学习 GitHub ,还是以后想从事编程行业,Git 都可以算是必备技能了,所以从现在开始建议你先去学习熟悉下 Git ,后面我会有文章推荐一些适合新手的 Git 学习资料给你们。
而 GitHub 上面说了,主要提供基于 git 的版本托管服务。也就是说现在 GitHub 上托管的所有项目代码都是基于 Git 来进行版本控制的,所以 Git 只是 GitHub 上用来管理项目的一个工具而已,GitHub 的功能可远不止于此!
Git与SVN区别
SVN属于集中式版本控制系统。
Git是分布式版本控制系统。
Git常用命令
本地
- help //帮助
- init //初始化仓库
- status //查看当前工作区和暂存区状态
- add //添加修改至暂存区
- commit //提交暂存区的修改
- log //查看提交日志信息
- reflog //查看所有分支的所有操作记录
branch(分支)
git branch branch-name #创建分支
git branch -d branch-name #删除指定分支
git branch -D branch-name #强制删除指定分支
checkout (检出,也具有撤销功能)
git checkout branch-name #检出分支
git checkout tag-name #检出tag
git checkout commit_id #检出某次commit
git checkout -- file #撤销还未add进暂存区的文件
场景:当你改乱了工作区某个文件的内容,还未add至暂存区,想直接丢弃工作区的修改时,用命令git checkout -- file。
merge & rebase(合并)
#merge(合并)
git checkout master #切换回master分支
git merge featureA #合并目标分支
#rebase(复位基底的)
git checkout master #切换回master分支
git rebase featureA #合并目标分支
rebase 跟 merge 的区别你们可以理解成有两个书架,你需要把两个书架的书整理到一起去,第一种做法是 merge ,比较粗鲁暴力,就直接腾出一块地方把另一个书架的书全部放进去,虽然暴力,但是这种做法你可以知道哪些书是来自另一个书架的;第二种做法就是 rebase ,他会把两个书架的书先进行比较,按照购书的时间来给他重新排序,然后重新放置好,这样做的好处就是合并之后的书架看起来很有逻辑,但是你很难清晰的知道哪些书来自哪个书架的。
只能说各有好处的,不同的团队根据不同的需要以及不同的习惯来选择就好。
reset(回退)
git reset HEAD^ #回退至上一版本, 并重置缓存区
git reset HEAD~10 #回退至10个版本之前, 并重置缓存区
git reset --soft HEAD #回退时不重置缓存区和工作区
git reset --mixed HEAD #回退时重置缓存区, 默认选项
git reset --hard HEAD #回退时重置缓存区和工作区
git reset #不指定HEAD, 用来清空缓存区的修改
git reset filename #清空缓存区指定文件的修改
git reset --hard #不指定HEAD, 用来清空工作区和缓存区的修改
场景:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了checkout场景
tag(标签)
git tag tag-name #在最新提交的commit上打标签
git tag tag-name commit_id #指定某次commit上打标签
git tag -a tag-name -m "message" #在最新提交的commit上打标签并添加说明信息
git show tag-name #查看tag信息
config(配置)
#必须配置
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
#alias(别名)
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.br branch
#炫酷
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
diff(比较差异)
git diff <$id1> <$id2> # 比较两次提交之间的差异
git diff <branch1>..<branch2> # 在两个分支之间比较
git diff --staged # 比较暂存区和版本库差异
clean(清除未跟踪的文件)
git clean -d # 删除未跟踪目录以及目录下的文件,如果目录下包含其他git仓库文件,并不会删除(-dff可以删除)。
git clean -f # 如果 git cofig 下的 clean.requireForce 为true,那么clean操作需要-f(--force)来强制执行。
git clean -i # 进入交互模式
git clean -n # 查看将要被删除的文件,并不实际删除文件
stash(储藏)
git stash 或 git stash save #储藏修改的跟踪文件与暂存改动
git stash list #查看储藏的列表
git stash apply stash@{x} #回复储藏,可以不指定id,代表最近的储藏
git stash drop stash@{x} #删除储藏,可以不指定id,代表最近的储藏
git stash pop stash@{x} #回复并删除储藏,可以不指定id,代表最近的储藏
远程
clone(克隆)
#ssh协议
git clone git@xxx:xxx/xxx.git
#https协议
git clone https://github.com/Walkud/OptUI.git
Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。
使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令
push(推送)
git push origin branch-name #推送至远程仓库对应分支上
pull(抓取)
git pull <remote> <branch>
remote(远程)
git remote #查看仓库
git remote -v #显示仓库更详细信息
忽略文件
Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。
场景
误提交或需求变更场景
已经提交了不合适的修改到版本库时,只能使用版本回退。HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。
穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
团队协作
资料
问题
项目初期在某人一个分支上添加一个库后,怎么把该库单独提交到公共分支上