面向任务的 Git 学习法
前言
对于 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:你执行了某些神奇的操作后,发现场面渐渐失去控制,想让代码变回之前还没有操作过的样子。
这个时候,我们可以执行如下操作:
- 我们需要从
git log
中找到还没有操作时的 commitID - 用
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 HEAD
和git 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 学习法相关推荐
- 面向过程给出《贝叶斯思维:统计建模的Python学习法》——二维彩球问题学习代码
背景 给出读<艾伯特贝叶斯思维:统计建模的Python学习法.pdf>的时候,写的代码,以面向过程的方式给出. 本章彩弹问题,求似然度的时候,假设已知隐藏点时,射手等概率从各个角度射击. ...
- Git学习系列之如何正确且高效地将本地项目上传到Github(图文详解)
不多说,直接上干货! 首先你需要一个Github账号,所以还没有的话先去注册吧! https://github.com/ 见 如何走上更高平台分享传递干货知识:(开通个人Github面向开源及私有软件 ...
- 别出心裁的Linux系统调用学习法
别出心裁的Linux系统调用学习法 操作系统与系统调用 操作系统(Operating System,简称OS)是计算机中最重要的系统软件,是这样的一组系统程序的集成:这些系统程序在用户对计算机的使用中 ...
- 最高效的学习方法——逆向学习法
如何让更多的同学更加快速.高效地投入IT学习中去呢 本期的[逆向学习法]以短动画的形式为大家展示迥异于填鸭式教学的高效学习方法 流量党同学也可以看下面的文字介绍: 在学习编程的过程中,主要有两种方式, ...
- git学习笔记——Linux和Windows下git的基本操作
git学习笔记--Linux和Windows下git的基本操作 github主页:https://github.com/Taot-chen 一.Linux环境 1.安装git sudo apt-get ...
- 循环结构c语言乘电梯,C语言程序设计循环结构之“四要素学习法”
摘要:C语言程序设计中循环结构是顺序.选择.循环三大基本结构之一,功能强大,使用灵活方便,但是学生学习难度比较大.该文以累加和为切入点深入分析循环结构特点,总结出循环结构"四要素学习法&qu ...
- Linux命令学习法
转载自 https://www.cnblogs.com/rocedu/p/4902411.html 别出心裁的Linux命令学习法 操作系统操作系统为你完成所有"硬件相关.应用无关" ...
- 亲测有用!轻松get新技能的四步学习法
全文共1965字,预计学习时长7分钟 图源:unsplash 置身于滚滚的庞大信息流当中,我们常常会不知所措.新框架和新技术接踵而至,每个人都在声称自己的比其他框架和技术更快.更安全.更高效.作为开发 ...
- 二元学习法3.0:三把学习大剑,打通学习的底层密码_学习方法
单纯靠机会赚钱的时代已经过去,未来是认知赚钱的时代. 前两天还跟朋友聊到这个话题,未来的机会将会不断涌现,人工智能.5G.万物互联.虚拟现实-- 而这些东西,都跟知识挂钩.以前那种胆大就能挣钱,站在风 ...
最新文章
- 构建安全的 ASP.NET 应用程序
- 连续对焦 auto对焦_如何在Windows 10上使用对焦辅助(请勿打扰模式)
- php cgi漏洞,Nginx + PHP CGI的一个可能的安全漏洞
- java web 手机验证_JAVA-WEB,好知网,登录注册,手机验证
- 封装Js事件代理方法
- ubuntu 12.04陷入software center的searching/cancelling...
- moodle环境安装linux,Linux下安装Moodle
- java电子小词典课程设计,java课程设计---英汉电子词典
- Cisco Devnet CCNA【200-901】题库稳定
- 智能算法——蚁群算法
- Google安装鼠标手势插件方法
- 82、组合分配式气体灭火系统所需的气体单向阀的数量
- OracleRAC基本概念及入门
- ubuntu计算机名用户名,修改ubuntu的用户名(注意用户名和主机名的区别)
- 一起捉妖服务器还要维护多久,一起来捉妖:在线6小时被劝退?只需网络断开,跳过等待15分钟...
- 2:哆来A梦的时光穿梭机
- 苹果safari浏览器怎么样(好不好用)
- 如何把excel里面中文小写数字转换成阿拉伯数字
- 数字逻辑设计(何建新)第二章
- 忘记密码,如何解除Excel的限制保护?