开发工具-Github

杨雪松
2023-12-01


大名鼎鼎的 GitHub是一个面向开源及私有软件项目的托管平台,因为只支持 Git 作为唯一的版本库格式进行托管,故名 GitHub。此平台上有大量的开源程序代码,方便使用和学习。对于开发者,也可以使用此平台进行版本控制、多人协作、团队开发等。

GitHub官方网站

github 网站对中国大陆用户来说不太稳定,之前一直想学习使用,但是总无法登录,网上教学更改 host 的方法也没几个靠谱。最近发现能够直接登录了,赶紧学习使用。但是因为其稳定性的原因,代码最好本地有备份。

另外 github 是全英文的,所以最好有一定的英文功底,感觉翻译的不太靠谱……。如果真是英文很烂,可以尝试去 gitee,这个是国内搭建的类似 github 的平台,里面很多项目是 github 上的,或者使用其他大神开发搭建的 github 爬虫站,例如 GitHub中文社区

注册并登录

进入官网页面,可以直接输入 E-mail 然后 Sign up for GitHub,根据提示输入相关信息。然后可以登录了,登录后需要接收邮件进行激活,成功激活后进入主页面。

基础使用

简单的基础使用,可以搜索、查看其他程序员分享的项目、程序、源码等。简单的查看 GitHub 上的项目,甚至无需注册账号,只要键入地址即可访问。

搜索项目

可以在左上角 Search or jump to… 搜索并跳转到感兴趣的项目。在网上应该有很多有趣的或使用的程序,提供 github 的源代码,根据它们提供的 id 或项目名称,在此搜索就能进入项目查看信息或下载源码了。

当然也可以搜索一些关键字,看看其他程序员们都留下了哪些痕迹。例如检索关键字:python技巧 等。

Trending 是官方的趋势列表,可以查看最近 star 上升最快的项目。这个页面可以根据说话语言筛选中文项目,也可以根据编程语言筛选相关项目。

查看

如果判断一个项目好不好,简单的可以关注三点:Star、README、Issues。

Star

一个项目的星星越多,上涨越快,说明此项目在社区中认同度越高,类似于被点赞。

README

可以在 code 一栏中查看,主要是对于该项目的介绍。readme 是 markdown 格式的文本

issues

Issues 在某种程度上来说,像是一种团队协作、头脑风暴的呈现形式。对于下一步需要完善的工序、项目的优化进程都可以在 issue 中找到动态——诸如 feature 的添加、bug 的修复等等。

仓库

仓库,顾名思义,就是用来存放我们想放在GitHub上的项目的地方,可以是代码项目,或者是任何其他内容。

创建完账号后,点击进入自己的主页 。这个「repositories」(中文:存放处)指的就是我们俗称的仓库。

通常新建立的账户会有默认的一个仓库 MyGit

新建仓库

可以在个人主页上新建仓库,也可以在仓库页新建。

新建仓库有几个需要注意的地方:

  • Repository Name : 仓库名称,通常跟在账户名后面,标识了仓库的地址。
  • Public / Private : 仓库性质,如果选择了 Pubilc(公开),那么会在 Github 公开,其他人都可以看到。

然后就可以创建仓库了。

设置仓库

新建的仓库可以直接使用,但是也可以进一步设置相关信息。进入仓库,点击 Settings,进行设置。

  • General : 常规设置
  • Collaborators : 合作者,管理共同开发项目团队

Fork

Fork 是复刻,在看到别的大神的仓库很棒,则可以使用 Fork 功能复制一个副本到自己的仓库,然后进行修改使用。

使用 git 同步代码

使用仓库同步代码需要使用 git 工具

git官方网站
git官方中文文档

下载和安装

linux

linux 可以使用包管理工具,也可以使用源码进行安装。

git官方源码下载页面
git官方各版本软件库

使用源码安装,先下载需要的源码包

wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.9.5.tar.xz

下载完成后得到的是 xz 压缩包,需要解压

xz -d git-2.9.5.tar.xz

解压完成后,是 tar 归档文件,需要解归档

tar -xvf git-2.9.5.tar

解归档之后是同名的文件夹,进入文件夹可以使用 configure 修改安装参数,并使用 Makefile 构建和安装。安装过程中可能会报错,需要装一些依赖包,可以使用包管理工具进行安装。需要注意的是,补依赖库时可能会连带安装低版本的 git (由包管理器安装),需要在依赖库安装完成后删除。

./configure --prefix=/usr/local/

make && make install

windows

git 官方windows版本下载地址

windows 版本下载完成后,执行安装程序一路 next 就可以了。

创建本地 git 仓库

当安装好 git 软件后,可以在本地将某一个文件夹(项目文件夹)变为 git 的仓库,之后代码放在此文件夹中。

在命令行模式进入需要创建 git 仓库的文件夹,并初始化 git

git init

完成后,就将此文件夹创建成了本地 git 仓库。

管理 git 暂存

在仓库里可以存放各种各样的文件,需要使用 git 进行控制的文件需要先添加至 git 暂存

git add filename
# 或使用 git add . 添加所有文件

此时如果查看暂存区状态,能看到当前文件夹和暂存区各文件的状态。例如能够看到新文件中有刚添加的文件,另外还有未添加至 git 暂存的文件,已经添加至 git 但是被删除的文件等。

# 查看暂存区状态
git status

此时就将文件添加至暂存区了

设置 git

设置一下 git 才能提交至本地仓库

git config --golbal user.email "you@example.com"	# 设置 email
git config --global user.name "your name" 	# 设置用户名

提交至仓库

当更新完暂存区的状态后,可以将暂存区的文件提交至仓库

git commit -m '这里写备注说明详情'

这样就可以在仓库中创建一个新的版本

查看 git 日志

通过日志可以查看日志信息,包括之前提交的提交人员、版本、时间、备注信息等

git log

本地 git 的三大区域

git 有三个区域

  • working tree : 工作区,就是工作所在目录,当代码进行修改或文件有变动 working tree 的状态就改变了
  • index file : 索引文件,也叫暂存区。它是连接 working tree 和 commit 的桥梁。每当使用 git add 命令登记后, index file 的状态就改变了,此时 index file 和 working tree 趋于同步
  • commit : 将暂存区的文件提交至仓库。因为仓库会记录所有的 commit 历史,所以 commit 的状态通常是仓库中最新版本的状态

git 有命令来检查这三个区域的不同:

git diff	# 查看 working tree 和 index file 的差别
git diff --cached	# 查看 index file 与 commit 的差别
git diff HEAD # 查看 working tree 和 commit 的差别(HEAD 代表的是最近一次 commit 的信息)

本地 git 的机制和状态维护

工作区就是本地代码文件目录,commit 就是提交到仓库后的(最新)状态。

暂存区是一个快照,初始默认是空的,使用 git status 查看状态会显示快照比对后的结果。

例如上次提交后(此时暂存区保留了一个状态),在工作区删除了某一个文件,暂存区经过快照比对后会标注某文件被删除。这时使用 git add / rm 来将新建的文件提交至暂存区,或将已经删除的文件从暂存区里确认删除(即提交文件被删除的状态)。git add 实际上是对暂存区状态的修改,是根据工作区修改暂存区的状态。例如删除了文件后,再使用 add 添加此文件,会将文件被删除的状态添加到暂存区。

add 会将文件状态添加到暂存区,rm 会将文件从暂存区和工作区同时删除。

也可以根据暂存区的状态修改工作区的文件,例如有文件被删除了,暂存区快照比对后会标识为 deleted,可以通过这个命令恢复此文件。

git checkout --filename		# 按照暂存区的状态修复文件

即通过 git add / rm / checkout 来维护 working tree 和 index file 的状态

暂存区也会和 commit 进行比较,如果有不同的地方,会在 commit 时将不同处进行提交。将暂存区状态修改至我们需要的状态,然后再 commit 进行提交,就会将此时暂存区的文件提交至仓库,形成一个新的版本。

回滚机制

如果有需要,可以恢复至仓库中的某一版本

# 恢复至某仓库中的某一版本
# --hard 参数可以直接同步工作区的文件,否则需要手动从暂存区同步
git reset --hard <ID>		# 恢复至版本号的版本,版本号可以是部分,只要能唯一定位即可
git reset --hard HEAD		# 恢复至 HEAD(最新)版本
git reset --hard HEAD^		# 恢复至 HEAD 版上一个版本
git reset --hard HEAD^^		# 恢复至 HEAD 版上上个版本

需要注意的是,一旦 reset 到某一版本,此版本即变为HEAD版,在 log 中之后的版本会被丢弃。但是可以使用 git reflog 来查看版本变更信息,这时还可以通过 reset 命令恢复到某一版本。

即通过提交 git commit / reset 来维护 index file(working tree) 和 commit 仓库的状态

分支

当从某版本开始,之后的版本可能会有不同,则生成了不同的分支。例如版本4和版本5都是从版本3生成的,但是这两个版本是不同的,这就产生了分支。分支是可以合并的,方便灵活使用和修改。

例如在版本3后继续开发版本4到一定程度后,因为特殊原因需要回滚到版本3进行修改生成版本5,这时可以将版本4保存为一个分支,在完成了版本5后可以和版本4进行合并,继续完成版本4的功能生成版本6。

在 git 中,默认主线名称为 master ,其他分支可以自定义名称。可以查看当前分支

git branch 	# 查看当前分支情况

当有需要时,可以创建新分支,例如创建分支 dev。

git branch dev	# 创建分支 dev

需注意的是,创建了新分支后,当前版本还处于老分支。如果需要使用新分支则需要切换

git checkout dev	# 切换到分支 dev

切换分支,即重置版本为创建分支时的状态。例如在开发过程中,切回主分支处理 bug

git checkout master		# 切换回分支 master
git branch bug		# 创建分支 bug
git checkout bug	# 切换到分支 bug

当在某一分支处理完成后,可以合并到主分支。这时需要切换到主分支,然后进行合并(当没有冲突时能够直接合并)

git checkout master		# 切换到主分支
git merge bug		# 合并 bug 分支

此时使用 git log 可以看到 master 和 bug 分支合并了,该分支的使命暂时也就结束了,可以删除了

git branch -d bug	# 删除 bug 分支

此时可以切换到开发分支继续开发,注意此时 dev 分支中的 bug 是没有处理的情况

git checkout dev	# 切换回 dev 分支,继续开发

当开发完成,则需要将 dev 分支合并回 master 分支。需注意的是,因为 dev 分支是没有修复 bug 的,而 master 是修复了 bug 的,这里就是一个冲突。

git checkout master 	# 切换到 master 分支
git merge dev		# 合并 dev 分支

合并后,因为有冲突,所以 git 会进行提示,同时冲突文件中也会将冲突代码标出。这时需要手动将冲突文件进行更改,然后再次提交为没有冲突的版本。

在开发中,dev 分支应该是以 master 最新的代码进行开发,但是如果 dev 分支不是 master 分支最新的代码,则可以将 master 分支合并到 dev 分支中(只是代码合并,分支并没合并),相当于更新以下 dev 分支的代码。

git checkout dev	# 切换到 dev
git merge master	# 将 master 分支代码合并过来

使用网络托管仓库

可以将本地仓库同步至网络的代码托管平台,例如 github、码云(gitee)、扣钉(coding)等。

  • 码云开源中国推出的基于 Git 的代码托管平台
  • 扣钉是腾讯旗下的一个代码托管平台
  • Github是全球最大的一个代码托管平台

首先,在选择好的平台上注册账号,并建立好托管仓库。建立好托管仓库后,会有一个仓库链接地址(无论是自己的还是其他人的,都会有),通常包含了用户、仓库名称,且以 .git 结尾。

克隆

已有的仓库可以克隆到本地,在需要克隆仓库的文件夹中执行

git clone 仓库链接地址

如果是新建立的托管仓库,克隆到本地后会是一个空仓库,可能里面会有 README.md。使用这个文件夹写项目代码就可以了。注意,使用 clone 克隆有分支的仓库只显示了 master 分支,但是其他分支也是存在的,可以直接切换。

如果已有代码,可以将自己的代码文件复制到此仓库,此时暂存区是空的,添加文件至暂存区,并提交。

git add .
git commit -m '这里写备注信息'

创建远端

也可以不使用克隆,而是将本地现有的仓库远程提交(连接至服务器仓库)

# 在 仓库地址 中建立名为 仓库名称 的远端仓库,等于将本地仓库链接到远端仓库
git remote add <仓库名称> <仓库地址>
# 添加文件并提交至本地仓库
git add .
git commit -m '这里写备注信息'

可以查看创建好的远程信息

git remote	# 查看已经创建的远程仓库
git remote -v	# 查看远程仓库对应的本地仓库
git remote show 仓库名 	# 查看具体的远程仓库的信息

推送

commit 提交的是本地仓库,然后需要将本地仓库同步到服务器上。推送时是需要用户名和密码的,就是在托管平台注册的账户。

git push 仓库名称 分支名称 # 将本地仓库推送到服务器
# 如果是使用远端创建,第一次推送时需要参数 -u 
# git push -u 仓库名称 master
# 以上命令只推送一条分支,如果需要推送其他分支,则重复执行
# git push -u 仓库名称 dev

推送完成后,可以在服务器的仓库中看到。

需要注意的是,提交的版本必须是新版本,如果本地仓库里的版本比服务器仓库的版本低则会报错,需要先拉取,然后提交,再推送。

拉取

如果托管仓库中的代码和本地仓库不同(例如在另一台计算机修改了代码并成功提交推送),可以从托管仓库中拉取

git pull 仓库名称 分支名称	# 将服务器托管仓库拉取到本地

拉取后会有提示,哪个文件有变动。此时本地文件和托管仓库中的文件就会同步了,实际上仓库的版本信息也会同步,有需要也可以重置为历史某一版本。

更新

个人使用时,每次有改动都提交并推送,保证远端仓库是最新版本。

保存设置信息

使用远端仓库时,可能需要远端的用户名密码。如果每次都需要输入用户名密码嫌麻烦,可以创建本地保存文件以记录这些信息。进入项目文件夹进行操作:

git config --global credential.helper store

变基 rebase

当提交次数变多,在一条分支上会产生越来越多的版本记录,可能很多的中间版本记录是无意义的,这时可以通过变基来合并这些无意义的中间版本成为一条记录。

git rebase -i 版本号		# 将目标版本到目前版本进行合并
# 或使用 git rebase -i HEAD~3	# 从 HEAD版本往上找3个版本(包含HEAD版本)进行合并

执行完成后,会提示给合并的各版本做标记

  • p : 使用此版本提交
  • s : 使用此版本提交,但是合并到上一个版本中
  • r : 使用此版本提交,但编辑提交信息

需注意,不推荐合并推送到服务器版本仓库的记录,因为可能会引起版本冲突。

关于开发环境,忽略文件

由于项目开发中,使用不同的 IDE 会往项目目录中添加不同的文件或配置信息,同时不同的开发环境也会造成代码文件有不同。所以在使用时需要设置忽略文件,将 IDE、环境等添加的和项目代码无关的文件忽略。

在仓库文件夹内创建 .gitignore 文件,在此文件中列出的文件和目录会被 git 忽略。例如

# 忽略 dist 文件夹
dist/
# 忽略所有 .spec 结尾的文件
*.spec

如果是在建立托管仓库时,选择创建忽略文件,则会自动创建该语言开发中应该忽略的各种文件。

团队开发

github 可以创建组织,进行团队管理,当有组员上传项目后并通过后,能够自动更新生产环境。

创建组织

团队开发需要先创建个组织,使用 New organization,然后填入组织名称(Organization name),选择免费组织,根据提示填写一些信息,然后就可以创建了。

接下来可以添加组织成员,或之后再添加。

创建团队

在组织界面,点击 Team 标签,进入团队选单。点击 New Team 创建新团队。

填写一些团队信息,例如团队名称等。然后就可以创建团队,并添加成员。一个团队默认最多5个成员。

创建仓库

在组织下创建仓库,和个人仓库创建方法一样。创建好仓库后,在设置里面的 Collaborators & teams 栏中,添加创建的团队,并设置权限。

创建项目

团队组长来创建项目(同个人),包括 README.md、环境等基础文件,然后上传项目代码到仓库。其他团队人员克隆此仓库。

拉取、推送

组长创建好项目后,团队成员就可以拉取项目文件了。然后各自进行开发,完成后可以将各自开发的文件推送到仓库中。

拉取时如果没有冲突(没有多人修改同一文件,或多人修改同一文件的非同一部分代码),会直接拉取或自动合并拉取(合并拉取后,会要求直接提交,需要输入提交信息)。

如果因为文件改动出现冲突,可以参考冲突处理。推送本地代码时也可能会因版本、文件改动出现问题,可以参考更新

冲突处理

当某文件仓库和本地都有改动时,拉取和推送就会产生冲突:以仓库为主则本地的更改会丢失,以本地为主仓库的更改会丢失。git 推荐解决冲突的方法是:检测冲突文件,并结合双方更改的代码合并成为新的文件。

通常用户有四种处理方法:

  • 直接 commit 本地的修改,即以本地为主(不建议)
  • 通过 git stash 将工作区恢复到上次提交的内容,同时备份本地所做的修改,之后就可以正常 pull 了。完成后,执行 git stash pop 将之前本地做的修改应用到当前工作区(合并,常用,但是冲突部分会被本地代码覆盖)
git stash
git pull
git stash pop
  • 直接拉取,拉取后产生冲突的文件内容会被修改,根据修改的内容手动确定使用哪段代码,然后保存并提交(合并,不会出错,但是手动需手动确定冲突部分),注意更新远端。
  • 放弃本地修改,拉取远程仓库代码,以远程为主(本地代码丢失,不建议)
git reset --hard
git pull

更新

更新实际上就是将本地我呢见推送到服务器。当更新时会检测服务器版本,当服务器版本比本地版本新时,需要先拉取,并处理冲突,将本地版本变为最新版,再推送更新。

 类似资料: