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

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

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

分支图形讲解

引用一下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@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就会自动忽略这些文件。

.gitignore文件模板配置参考

场景

误提交或需求变更场景

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

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

团队协作

资料

Git官方网站

Git官方中文Book

廖雪峰 Git教程

Git忽略文件模板

Git图形化客户端官方推荐

Git常用命令

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

问题

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342

推荐阅读更多精彩内容

  • 1. 安装 Github 查看是否安装git: $ git config --global user.name "...
    Albert_Sun阅读 13,626评论 9 163
  • 本片内容转自CSDN http://blog.csdn.net/ithomer/article/details/7...
    五娃儿阅读 4,911评论 2 88
  • Android开发中的MVP架构 这篇文章背后的故事 原文链接 MVP Architecture in Andro...
    mimimomo阅读 733评论 0 15
  • 这是现实。哎。 在别人面前,每个家庭都是互相关爱,互相理解,互相支持的。这种美好情景只出现在理想世界。关上门,只有...
    by小微阅读 257评论 1 0
  • 陌陌是陌生人社交,现在是在通过群组活动去沉淀关系转化为半熟人关系,而微信是熟人关系的封闭系统,却要打造连接一切的开...
    公子F阅读 170评论 0 1