(内部分享)Git常用命令和团队协作开发

(内部分享)Git常用命令和团队协作开发_第1张图片

此内容为内部分享,大多内容为口述,无需详看

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 //查看所有分支的所有操作记录
(内部分享)Git常用命令和团队协作开发_第2张图片

branch(分支)

git branch branch-name #创建分支
git branch -d branch-name #删除指定分支
git branch -D branch-name #强制删除指定分支
(内部分享)Git常用命令和团队协作开发_第3张图片

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 #合并目标分支

分支图形讲解

引用一下stormzhang GIT 进阶

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 protected]"

#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 .. # 在两个分支之间比较 
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(远程)

git remote #查看仓库
git remote -v  #显示仓库更详细信息

忽略文件

Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。

.gitignore文件模板配置参考

场景

误提交或需求变更场景

已经提交了不合适的修改到版本库时,只能使用版本回退。HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。
穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。

要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。

团队协作

(内部分享)Git常用命令和团队协作开发_第4张图片
(内部分享)Git常用命令和团队协作开发_第5张图片

资料

Git官方网站

Git官方中文Book

廖雪峰 Git教程

Git忽略文件模板

Git图形化客户端官方推荐

Git常用命令

代码回滚:Reset、Checkout、Revert的选择

问题

项目初期在某人一个分支上添加一个库后,怎么把该库单独提交到公共分支上

你可能感兴趣的:((内部分享)Git常用命令和团队协作开发)