一、用 Git 进行版本控制:学习如何跟踪和管理代码修改
1.什么是版本控制
初次配置 Git
在开始使用 Git 之前,你需要配置 Git。在命令行工具中运行以下每行,确保所有选项都已被配置好。
设置你的 Git 用户名
git config –global user.name “”
设置你的 Git 邮箱
git config –global user.email “”
确保 Git 输出内容带有颜色标记
git config –global color.ui auto
对比显示原始状态
git config –global merge.conflictstyle diff3
git config –list
Git 与代码编辑器
最后一个配置步骤是让 Git 能与你的代码编辑器结合使用。以下是三个最热门的代码编辑器。如果你使用的是其他编辑器,则在 Google 中搜索“修改 Git 默认编辑器为 X 编辑器”(将 X 替换为你的代码编辑器的名称)。
Atom Editor 设置
git config –global core.editor “atom –wait”
Sublime Text 设置
git config –global core.editor “C:/Program Files/Sublime Text 2/sublime_text.exe’ -n -w”
VSCode 设置
git config –global core.editor “code –wait”
2.创建Git仓库
ls - 用来列出文件和目录
mkdir - 用来新建目录
cd - 用来更改目录
rm - 用来删除文件和目录
使用 git init 命令可以在当前目录下创建新的空仓库。
$ git init
运行此命令可以创建隐藏 .git 目录。此 .git 目录是仓库的核心/存储中心。它存储了所有的配置文件和目录,以及所有的 commit。
git clone 命令用于创建一个与现有仓库完全相同的副本。
$ git clone
该命令:
会获取现有仓库的路径
默认地将创建一个与被克隆的仓库名称相同的目录
可以提供第二个参数,作为该目录的名称
将在现有工作目录下创建一个新的仓库
git status 命令将显示仓库的当前状态。
$ git status
告诉我们已在工作目录中被创建但 Git 尚未开始跟踪的新文件
Git 正在跟踪的已修改文件
3.查看仓库的历史记录
git log 命令。git log 命令用于显示仓库中所有 commit 的信息。
$ git log
默认情况下,该命令会显示仓库中每个 commit 的:
SHA
作者
日期
消息
git 使用命令行分页器 less 浏览所有信息。以下是 less 的重要快捷键:
要按行向下滚动,使用 j 或 ↓
要按行向上滚动,使用 k 或 ↑
要按页向下滚动,使用空格键或 Page Down 按钮
要按页向下滚动,使用 b 或 Page Up 按钮
要退出,使用 q
git log –oneline 小结
–oneline 选项用于更改 git log 显示信息的方式:
$ git log –oneline
此命令:
每行显示一个 commit
显示 commit 的 SHA 的前 7 个字符
显示 commit 的消息
git log –stat 小结
总结下,–stat 选项用于更改 git log 显示信息的方式:
$ git log –stat
此命令会:
显示被修改的文件
显示添加/删除的行数
显示一个摘要,其中包含修改/删除的总文件数和总行数
git log -p 小节
总结下,-p 选项(和 –patch 选项一样)用来更改 git log 显示信息的方式:
$ git log -p
此命令会向默认输出中添加以下信息:
显示被修改的文件
显示添加/删除的行所在的位置
显示做出的实际更改
git show 的作用
git show 命令将仅显示一个 commit。因此,如果你看不到任何其他 commit,不要惊慌。它只显示一个 commit。git show 命令的输出和 git log -p 命令的完全一样。因此默认情况下,git show 会显示:
commit
作者
日期
commit 消息
补丁信息
但是,git show 可以与我们了解过的大部分其他选项一起使用:
–stat - 显示更改了多少文件,以及添加/删除的行数
-p 或 –patch - 显示默认补丁信息,但是如果使用了 –stat,将不显示补丁信息,因此传入 -p 以再次添加该信息
-w - 忽略空格变化
4.向仓库中添加commit
git add 小结
git add 命令用于将文件从工作目录移到暂存区。
$ git add …
此命令:
可接受多个文件名(用空格分隔)
此外,可以使用句点 . 来代替文件列表,告诉 git 添加当前目录至暂存区(以及所有嵌套文件)
git commit 小结
git commit 命令会取出暂存区的文件并保存到仓库中。
$ git commit
此命令:
将打开配置中指定的代码编辑器
(请参阅第一节课中的 git 配置流程,了解如何配置编辑器)
在代码编辑器中:
必须提供提交说明
以 # 开头的行是注释,将不会被记录
添加提交说明后保存文件
关闭编辑器以进行提交
然后使用 git log 检查你刚刚提交的 commit!
git diff 小结
总结下,git diff 命令用来查看已经执行但是尚未 commit 的更改:
$ git diff
此命令会显示:
已经修改的文件
添加/删除的行所在的位置
执行的实际更改
gitignore 小结
总结下,.gitignore 文件用来告诉 git 不应跟踪的文件。该文件应该放在 .git 目录所在的目录。
5.标签、分支、合并
git tag 小结
总结下,git tag 命令用来标记特定的 commit 。当添加新的 commit 时,标签不会移动。
$ git tag -a beta
此命令将:
向最近的 commit 添加标签
如果提供了 SHA,则向具体的 commit 添加标签
git branch 小结
总结下,git branch 命令用来管理 git 中的分支:
列出所有分支
$ git branch
创建新的”footer-fix”分支
$ git branch footer-fix
删除”footer-fix”分支
$ git branch -d footer-fix
此命令用来:
列出本地分支
创建新的分支
删除分支
合并小结
总结下,git merge 命令用来在 git 中合并分支:
$ git merge
合并有以下两种类型:
快进合并 – 要合并的分支必须位于检出分支前面。检出分支的指针将向前移动,指向另一分支所指向的同一 commit。
普通类型的合并
两个完全不同的分支被合并
创建一个合并 commit
6.撤销更改
向 commit 中添加忘记的文件
此外,git commit –amend 使你能够包含忘记包含的文件(或文件更改)。假设你更新了整个网站的导航链接颜色。commit 了该更改,并以为完事了。但是后来发现深藏在页面上的一个特殊导航链接没有新的颜色。你可以执行新的 commit 并更新该链接的颜色,但是这样就会出现两个 commit 执行完全相同的任务(更改链接颜色)。
相反,你可以修改最后一个 commit(更新所有其他链接颜色的 commit)以包含这个忘记的链接。要包含忘记的链接,只需:
编辑文件
保存文件
暂存文件
运行 git commit –amend
你对必要的 CSS 和/或 HTML 文件作出了更改,以便修正被遗忘的链接样式,然后保存所有被修改的文件,并使用 git add 暂存所有被修改的文件(就像要提交新的 commit 那样!),但是你可以运行 git commit –amend 来更新最近的 commit,而不是创建新的 commit。
revert 小结
git revert 命令用于还原之前创建的 commit:
$ git revert
此命令:
将撤消目标 commit 所做出的更改
创建一个新的 commit 来记录这一更改
reset 小结
git reset 命令被用来清除 commit:
$ git reset
它可以用来:
将 HEAD 和当前分支指针移到引用的 commit
使用 –hard 选项清除 commit
使用 –soft 选项将 commit 的更改移至暂存区
使用 –mixed 选项取消暂存已被 commit 的更改
我们通常会用到祖先引用来指代之前的 commit。祖先引用包含:
^ – 表示父 commit
~ – 表示第一个父 commit
二、GitHub 协作:了解如何使用 Git 与他人合作开发项目
1.使用远程仓库
什么是远程仓库?
Git 是一个分布式版本控制系统,这意味着不存在一个主信息仓库。每位开发者使用的都是仓库的一个副本。因此,你可以拥有仓库的一个副本(它包含发布的 commit 和版本历史记录),并且你的朋友也可以拥有相同仓库的一个副本。每个仓库包含的信息与其他副本完全相同,没有哪一个是主要的。在此之前,你可能一直使用的都只是本地仓库。而远程仓库与你的本地 Git 仓库一样,只是它位于其他地方。
访问远程仓库的方式
访问远程仓库的方式有多个:
使用 URL
使用系统文件的路径
git remote 命令可以让你管理远程仓库和与之交互。
$ git remote
你可以连接到多个不同的远程仓库。
简写名是用于指代远程仓库位置的名称。通常该位置为 URL,但也可能是同一台计算机上的文件路径。
git remote add 用于添加到新的远程仓库的连接。
git remote -v 用于查看远程仓库与连接之间的详细信息。
git push 命令用于从本地仓库向远程仓库推送 commit 。
$ git push origin master
git push 命令需要:
你想向其推送 commit 的远程仓库的简写名
包含你想推送的 commit 的分支
git pull 命令你告诉 Git 你想获取修改的远程仓库的简写名以及包含你需要的更改的分支:
$ git pull origin master
在运行 git pull 时,会发生以下活动:
远程分支上的 commit 会被复制到本地仓库
本地跟踪分支(origin/master)移到指向最新的 commit
本地跟踪分支(origin/master)合并到本地分支(master)
另外,可以在 GitHub 上手动添加更改(但不建议这样做,所以别这样做)。
git fetch 命令只执行上面的第一步。它只检索 commit 和移动跟踪分支。它不会将本地分支与跟踪分支合并。提供给 git pull 的同样信息也要传递给 git fetch:
远程仓库的简写名
包含要取回的 commit 的分支
$ git fetch origin master
2.使用其他开发者的仓库
fork仓库
fork 是一种在托管服务上完成的操作,如 GitHub。fork 仓库会创建与原始仓库完全相同的副本,并将该副本移动到你的帐户。你对 fork 的仓库拥有完全控制权。修改 fork 的仓库不会更改原始仓库。
git log 命令
使用 git shortlog 按作者对 commit 分组
$ git shortlog
使用 –author 选项筛选 commit
$ git log --author="Richard Kalehoff"
使用 –grep 选项筛选 commit
$ git log --grep="border radius issue in Safari"
3.与远程仓库保持同步
Pull Request 是让源仓库拉取你的 commit,并融合在其项目中的请求。要创建 Pull Request,你需要完成一些操作:
你必须 fork 源仓库
将你的 fork 克隆到你的计算机
进行一些 commit(最好是在特性分支上!)
将 commit 推送回你的 fork
创建一个新的 Pull Request,并选择包含你的新 commit 的分支
当在你 fork 的项目副本上工作时,初始项目的维护者会继续向他们的项目添加更改。你需要将你的 fork 副本与他们的项目保持同步,以包含他们所做的任何更改。
要将源仓库的更改提取到你在 GitHub 上 fork 的仓库副本,你需要:
获得源仓库的可克隆 URL
使用 git remote add 命令创建一个新的远程仓库
使用简写名 upstream 指向源仓库
提供源仓库的 URL
获取新的 upstream 远程仓库
将 upstream 的分支合并到本地分支
将新更新的本地分支推送到你的 origin 仓库
如果项目维护者要求更改 Pull Request,则:
在你的 Pull Request 所基于的本地仓库的同一分支上添加一些必要 commit
将该分支推送到你的源仓库 fork 副本
这些 commit 最终将显示在 Pull Request 页面上。
rebase 命令
使用 p 或 pick – 使 commit 保持原样
使用 r 或 reword – 保留 commit 的内容,但修改 commit 说明
使用 e 或 edit – 保留 commit 的内容,但先不要执行 commit,以便:
添加新内容或文件
删除内容或文件
修改即将 commit 的内容
使用 s 或 squash – 将此 commit 的更改结合到之前的 commit 中(列表中位于其上面的 commit )
使用 f 或 fixup – 将此 commit 的更改结合到前一个 commit 中,但删除提交说明
使用 x 或 exec – 运行 shell 命令
使用 d 或 drop – 删除 commit