前言

对于 Git 学习而言,通常枯燥的理论学习并不能帮助我们快速掌握它的使用,需要我们结合实践,才能更好地学会利用 Git 进行多人协作开发。本文就以任务的形式,来介绍 Git 命令的使用,希望在进行学习前,你已经有了些许理论基础。

这里安利一个可以辅助 git 学习的网站:Learn Git Branching

文章目录

  • 前言
  • Task 1:局部设置用户名和邮箱
  • Task 2:提交远端的流程
  • Task 3:提交后的回退操作
  • Task 4:拉新分支进行开发
  • Task 5:提交项目的部分相似文件
  • Task 6:利用 git merge 进行分支合并
  • Task 7:删除本地和远程分支
  • Task 8:删除项目中的 Untracked files
  • Task 9:利用 git rebase 进行分支合并
  • Task 10:给项目打版本标签

Task 1:局部设置用户名和邮箱

描述:我们通常会按照下面命令进行 git 的用户名和邮箱的配置。

# 全局配置用户名:TestName
git config --global user.name TestName# 全局配置邮箱:email@example.com
git config --global user.email email@example.com

但是有时候,我们需要用工作的邮箱维护公司的项目(全局配置),然后用自己的 GitHub 注册邮箱维护自己的开源项目(局部配置),我们就需要局部设置自己项目仓库使用的用户和邮箱了。

# 局部设置用户名:VeggieOrz
git config user.name VeggieOrz# 局部设置邮箱:lwh_233@163.com
git config user.email lwh_233@163.com# 查看仓库当前使用的用户名
git config user.name
# 查看仓库当前使用的邮箱
git config user.email

Task 2:提交远端的流程

描述:目前你已经在本地完成了某个功能的开发,你需要把你写的代码提交到远端。

注意点:在将本地修改提交到远程之前,一定要确保本地的代码是最新的。

# 存储“工作区和暂存区”的修改
git stash# 拉下最新代码
git pull# 取出“工作区和暂存区”的修改
git stash pop# 本地正常提交流程
git add .
git commit -m 'some information'# 提交代码到远端
git push

Task 3:提交后的回退操作

描述1:你不小心将错误的代码提交到本地的暂存区或者仓库了,你希望可以回退你的提交的代码(代码依旧保留)。

# 将提交到本地仓库的代码回退到暂存区
git reset --soft commitID# 从暂存区回退到工作区
git reset Headgit reset Head file_name

描述2:你的某个提交(commitID: 80fbaf0e21)已经 push 到远端了,但是你需要撤销掉该提交中的所有内容。

这个时候就可以用上我们的 git revert 命令

# 将最新提交内容反向修改回去,并形成新的commit
git revert HEAD
# 将指定 commitID 的提交内容反向修改回去,并形成新的commit
git revert commitID

执行完成后,我们发现该次提交的内容已经成功回退,用 git log 还可以看到如下的 revert 操作记录,即 revert 操作是会生成一条单独的 commit 记录

commit 13632e9378cc2dcc404389474f0cef741c868391 (HEAD -> master)
Author: VeggieOrz <VeggieOrz@163.com>
Date:   Wed Nov 25 01:37:29 2020 +0800Revert "Revert "update file again""This reverts commit 80fbaf0e218a48bc665f1e5d11b8ba399ecacf51.

描述3:你执行了某些神奇的操作后,发现场面渐渐失去控制,想让代码变回之前还没有操作过的样子。

这个时候,我们可以执行如下操作:

  1. 我们需要从 git log 中找到还没有操作时的 commitID
  2. git reset --hard commitID 让代码变回那时的样子
# 将代码回退到上一个 commit
git reset --hard HEAD
# 将代码回退到指定 commitID 的提交中
git reset --hard commitID

注意:执行完 git reset --hard 后,(commitID, now_commitID] 直接的记录在 git log 中将会找不到了!

Task 4:拉新分支进行开发

描述:新的需求来了,你需要在主分支的基础上拉一个名为 new_dev 的新分支进行新需求的开发。

注意点:一定要记得和远程建立关联,否则创建的分支只在本地有,后续就会遇到很多麻烦。

# 创建并切换到名为 new_dev 的分支
git checkout -b new_dev
# 上面命令等同于下面两条命令
git branch new_dev
git switch new_dev# 将分支推送到远端
git push --set-upstream origin new_dev# 查看远端分支和本地分支的关联
git branch -vv

Task 5:提交项目的部分相似文件

例如,我们通过 git status 命令看到如下反馈:

On branch dev
Your branch is up to date with 'origin/dev'.Changes not staged for commit:(use "git add <file>..." to update what will be committed)(use "git restore <file>..." to discard changes in working directory)modified:   Resources/a.jsonmodified:   Resources/b.jsonmodified:   Resources/c.jsonmodified:   Resources/d.jsonmodified:   algorithm.cpp
no changes added to commit (use "git add" and/or "git commit -a")

现在,我们希望只提交那部分 json 文件的改动,可以尝试下面命令

# 利用 * 通配符进行匹配,其他提交流程照旧
git add Resources/*

Task 6:利用 git merge 进行分支合并

描述:你现在刚在 new_dev 分支上完成新需求的开发,现在你需要将 new_dev 分支的内容合并到 release 发布分支中。

注意点:需要保证本地两个分支(new_dev 和 release)的代码都是最新的。

# 保证 new_dev 分支的代码是最新的
git pull# 切换到 release 分支
git switch release# 保证 release 分支的代码是最新的
git pull# 将本地的 new_dev 分支合并到 release 分支中
git merge new_dev# 提交本地的合并记录
git push

Task 7:删除本地和远程分支

描述1:现在你已经完成了一系列需求的开发,并且改动都已经合并到了 develop 分支,你发现本地存在很多以后根本不会用到的分支。为了方便分支管理,你需要将这些无用的分支删除,下面以删除 new_dev 分支为例。

注意点:在进行删除之前,需要确保分支中的内容已经合并到主分支了,而且以后不再需要该分支。

# 查看本地和远程的所有分支
git branch -a
# 如果远程分支太多,可以用
git branch -vv# 删除远端分支
git push origin --delete new_dev# 删除本地分支
git branch -d new_dev
# 如果提示删除失败则用
git branch -D new_dev

描述2:经过相当长一段时间的开发,你发现本地已经堆积了大量的分支,这增加了你查找分支的成本,你希望清空本地所有无用的分支。(不删除远程分支,远程分支由 QA 管理)

# 删除当前分支以外的所有分支
git branch | xargs git branch -d# 删除分支名满足匹配结果的分支
git branch | grep 'dev*' | xargs git branch -d

tip:管道 ‘|’ 是实现「将前面的标准输出作为后面的标准输入」;xargs是实现「将标准输入作为命令的参数」。

Task 8:删除项目中的 Untracked files

描述: 进行 Merge 操作的回退之后(git reset HEADgit checkout .),用git status命令发现工程目录下还存在着很多 Untracked files(如下文所示),我们需要将他它们删除。

On branch new_dev
Your branch is up to date with 'origin/new_dev'.Untracked files:(use "git add <file>..." to include in what will be committed).gitlab/Resources/icon.pngimage_resources.pynothing added to commit but untracked files present (use "git add" to track)

使用命令如下:

# 删除所有的 Untracked files
git clean -f
# 删除所有的 Untracked file 和 Untracked directory(目录)
git clean -fd

注意点: 由于删除了之后没有办法再复原,我们需要谨慎一点,先用以下命令确认要删除的文件不再需要才进行删除。

# 查看将要删除文件或者目录
git clean -nf
git clean -nfd

Task 9:利用 git rebase 进行分支合并

描述: 你正在 new_dev 分支上进行新需求的开发,dev 分支上刚合入了新版本的代码,你需要将 dev 分支的代码合入到你的分支中。

由于 git merge 操作会让 git 提交记录变得不美观(时间线上有过多的分叉),这里需要用 git rebase 进行操作。

首先,我们需要切换到 dev,然后拉取最新代码,rebase 之前需要保证本地该分支代码为最新版本。

git switch dev
git pull

为了减少解决冲突的次数,我们还需要压缩提交。先找到拉分支时,原来分支最新的commitID,然后利用git rebase -i进行开发分支的提交压缩。

git switch new_dev# 找到拉分支时,原来分支最新的commitID
git log# 压缩(commitID, HEAD] 成一个 commit
git rebase -i commitID

这里介绍一个 vim 的字符串替换命令,辅助我们将 pick 修改为 s。通常我们执行2,ns/pick/s/,其中 n 为最后一次提交所在的行数。

# 替换第 m 行到第 n 行中每一行的第一个 str1 为 str2
m,ns/str1/str2/

最后,我可以进行合并的 rebase 操作了。完成合并和冲突的解决后,需要将加-f参数,将代码强推到远端。

git rebase dev# rebase 会影响时间线,所以需要强推
git push -f

Task 10:给项目打版本标签

描述1: 我们在完成一个版本的开发的时候,需要给代码打上版本标签。现在,我们刚完成 0.1.0 版本代码的开发,需要完成打标签的操作。

# 在本地打标签
git tag '0.1.0'# 将标签推送到远端
git push --tags

描述2: 再精巧的工匠也有操作失误的时候,在打了标签之后,我们发现还有部分该版本的代码没有提交。现在,我们需要删除本地和远端的刚打下的 0.1.0 标签,以方便后续提交了代码再重新打标签。

# 删除本地的 0.1.0 标签
git tag -d '0.1.0'# 查看标签
git tag# 删除远端的 0.1.0 标签
git push origin :'0.1.0'

持续更新中……

面向任务的 Git 学习法相关推荐

  1. 面向过程给出《贝叶斯思维:统计建模的Python学习法》——二维彩球问题学习代码

    背景 给出读<艾伯特贝叶斯思维:统计建模的Python学习法.pdf>的时候,写的代码,以面向过程的方式给出. 本章彩弹问题,求似然度的时候,假设已知隐藏点时,射手等概率从各个角度射击. ...

  2. Git学习系列之如何正确且高效地将本地项目上传到Github(图文详解)

    不多说,直接上干货! 首先你需要一个Github账号,所以还没有的话先去注册吧! https://github.com/ 见 如何走上更高平台分享传递干货知识:(开通个人Github面向开源及私有软件 ...

  3. 别出心裁的Linux系统调用学习法

    别出心裁的Linux系统调用学习法 操作系统与系统调用 操作系统(Operating System,简称OS)是计算机中最重要的系统软件,是这样的一组系统程序的集成:这些系统程序在用户对计算机的使用中 ...

  4. 最高效的学习方法——逆向学习法

    如何让更多的同学更加快速.高效地投入IT学习中去呢 本期的[逆向学习法]以短动画的形式为大家展示迥异于填鸭式教学的高效学习方法 流量党同学也可以看下面的文字介绍: 在学习编程的过程中,主要有两种方式, ...

  5. git学习笔记——Linux和Windows下git的基本操作

    git学习笔记--Linux和Windows下git的基本操作 github主页:https://github.com/Taot-chen 一.Linux环境 1.安装git sudo apt-get ...

  6. 循环结构c语言乘电梯,C语言程序设计循环结构之“四要素学习法”

    摘要:C语言程序设计中循环结构是顺序.选择.循环三大基本结构之一,功能强大,使用灵活方便,但是学生学习难度比较大.该文以累加和为切入点深入分析循环结构特点,总结出循环结构"四要素学习法&qu ...

  7. Linux命令学习法

    转载自 https://www.cnblogs.com/rocedu/p/4902411.html 别出心裁的Linux命令学习法 操作系统操作系统为你完成所有"硬件相关.应用无关" ...

  8. 亲测有用!轻松get新技能的四步学习法

    全文共1965字,预计学习时长7分钟 图源:unsplash 置身于滚滚的庞大信息流当中,我们常常会不知所措.新框架和新技术接踵而至,每个人都在声称自己的比其他框架和技术更快.更安全.更高效.作为开发 ...

  9. 二元学习法3.0:三把学习大剑,打通学习的底层密码_学习方法

    单纯靠机会赚钱的时代已经过去,未来是认知赚钱的时代. 前两天还跟朋友聊到这个话题,未来的机会将会不断涌现,人工智能.5G.万物互联.虚拟现实-- 而这些东西,都跟知识挂钩.以前那种胆大就能挣钱,站在风 ...

最新文章

  1. 构建安全的 ASP.NET 应用程序
  2. 连续对焦 auto对焦_如何在Windows 10上使用对焦辅助(请勿打扰模式)
  3. php cgi漏洞,Nginx + PHP CGI的一个可能的安全漏洞
  4. java web 手机验证_JAVA-WEB,好知网,登录注册,手机验证
  5. 封装Js事件代理方法
  6. ubuntu 12.04陷入software center的searching/cancelling...
  7. moodle环境安装linux,Linux下安装Moodle
  8. java电子小词典课程设计,java课程设计---英汉电子词典
  9. Cisco Devnet CCNA【200-901】题库稳定
  10. 智能算法——蚁群算法
  11. Google安装鼠标手势插件方法
  12. 82、组合分配式气体灭火系统所需的气体单向阀的数量
  13. OracleRAC基本概念及入门
  14. ubuntu计算机名用户名,修改ubuntu的用户名(注意用户名和主机名的区别)
  15. 一起捉妖服务器还要维护多久,一起来捉妖:在线6小时被劝退?只需网络断开,跳过等待15分钟...
  16. 2:哆来A梦的时光穿梭机
  17. 苹果safari浏览器怎么样(好不好用)
  18. 如何把excel里面中文小写数字转换成阿拉伯数字
  19. 数字逻辑设计(何建新)第二章
  20. 忘记密码,如何解除Excel的限制保护?

热门文章

  1. [reference]-ARM core timeline
  2. optee_os中静态共享内存的注册
  3. [crypto]-31-crypto engion的学习和总结
  4. MySQL基本操作(表,字段)
  5. 布隆过滤器Redis缓存穿透雪崩击穿热点key
  6. linux运维防火墙考题,Linux运维工程师:30道面试题整理 | 张戈博客
  7. 利用邻接表完成图的BFS和DFS
  8. 寒假每日一题(入门组)【week2 完结】
  9. 3.2.1 虚拟内存的基本概念
  10. 第三章 处理机调度与死锁