Git 是一个开源的分布式版本控制系统,Github 是全球最大的同性交友网站基于 Git 的代码托管平台,因为只支持 Git 作为唯一的版本库格式进行托管,故名 GitHub,就是一个平台上面有无数个 Git 仓库——Git 版的百度云,承担存储远程仓库的作用。
唯一版本库是什么意思?
唯一版本库通常指的是仅有一个主版本库(Main Repository),所有开发人员都从该主版本库中进行代码的拉取、修改和推送,从而保证代码的唯一性和一致性。
在大学的时候老师要求你交一个论文或大作业,但你不知道在老师的要求下你的版和最终版差了多少个兄弟姐妹
初版.rar——>修改版.rar——>再次修改版.rar——>进阶版.rar——>最终版.rar——>真的最终版.rar——> 完成版.rar——>再改我是狗.rar——> cnm不想再改了.rar——>…
那如果大作业是程序设计的话,你的代码可能前一秒还健步如飞,下一秒就当场去世了,就算程序员没对象,也总是会问自己到底我哪错了,版本控制的作用之一就是解决这些问题的,它可以帮助你管理不同的版本,并且可以随时回退到任意时刻。
版本控制的第二个作用是协同开发,Git 可以自动合并代码,从而大大增加生产效率。
为了大家进一步了解和使用 Git 和 GitHub,我们一起来看看 GitHub 的常用术语,也可以说是基本概念:
Repository:简称 Repo,可以理解为“仓库”,我们的项目就存放在仓库之中。也就是说,如果我们想要建立项目,就得先建立仓库;有多个项目,就建立多个仓库。
Issues:可以理解为“问题”,举一个简单的例子,如果我们开源一个项目,如果别人看了我们的项目,并且发现了 bug,或者感觉那个地方有待改进,他就可以给我们提出 Issue,等我们把 Issues 解决之后,就可以把这些 Issues 关闭;反之,我们也可以给他人提出 Issue。
Star:可以理解为“点赞”,当我们感觉某一个项目做的比较好之后,就可以为这个项目点赞,而且我们点赞过的项目,都会保存到我们的 Star 之中,方便我们随时查看。在 GitHub 之中,如果一个项目的点星数能够超百,那么说明这个项目已经很不错了。
Fork:可以理解为“拉分支”,如果我们对某一个项目比较感兴趣,并且想在此基础之上开发新的功能,这时我们就可以 Fork 这个项目,这表示复制一个完成相同的项目到我们的 GitHub 账号之中,而且独立于原项目。之后,我们就可以在自己复制的项目中进行开发了。
Clone:git clone xx
是比较熟悉的操作,它类似于 Download 功能,可以理解为将云端代码下载到我们自己电脑的本地。
正常的话需要我们本机安装了 git,然后使用 git clone [仓库地址]
即可将制定仓库地址代码下载到我们本机。
Push:可以理解为“推送”,当你在本地进行修改后,将修改同步到你的 Github 上的仓库中。
Pull Request:可以理解为“提交请求”,此功能是建立在 Fork 之上的,如果我们 Fork 了一个项目,对其进行了修改,而且感觉修改的还不错,我们就可以对原项目的拥有者提出一个 Pull 请求,等其对我们的请求审核,并且通过审核之后,就可以把我们修改过的内容合并到原项目之中,这时我们就成了该项目的贡献者。
Merge:可以理解为“合并”,如果别人 Fork 了我们的项目,对其进行了修改,并且提出了 Pull 请求,这时我们就可以对这个 Pull 请求进行审核。如果这个 Pull 请求的内容满足我们的要求,并且跟我们原有的项目没有冲突的话,就可以将其合并到我们的项目之中。当然,是否进行合并,由我们决定。
Watch:可以理解为“观察”,如果我们 Watch 了一个项目,之后,如果这个项目有了任何更新,我们都会在第一时候收到该项目的更新通知,如果设置了邮件还会邮件通知。
Gist:如果我们没有项目可以开源或者只是单纯的想分享一些代码片段的话,我们就可以选择 Gist。不过说心里话,如果不的话,Gist 并不好用。
下图展示了 Git 的工作流程,以及主要的命令对仓库的影响
workspace 即工作区,逻辑上是本地计算机,还没添加到 repository 的状态;
staging area 即版本库中的 stage,是暂存区。修改已经添加进 repository,但还没有作为 commit 提交,类似于缓存;
local repository 即版本库中 master 那个地方。到这一步才算是成功生成一个新版本;
remote repository 则是远程仓库。用来将本地仓库上传到网络,可以用于备份、共享、合作。
下载:Git 官方下载地址,下载对应版本安装即可。
在本地配置用户信息:
git config
#查看本机是否配置了个人信息
git config --global user.name "……"
#定义全局的用户名
git config --global user.email "……"
#定义全局的邮件地址
git config --global user.password "……"
#配置密码
git config --list
#查看本地配置信息
git config --global --list
#查看全局配置信息
pull
,push
每次都要输入密码,相当的烦。使用 SSH 密钥,可以省去每次都输密码运行 ssh-keygen -t rsa -C "你在github上注册的邮箱"
,最后在你的主目录中能看到这两个文件。
id_rsa 是私钥不要轻易告诉别人,id_rsa.pub 是公钥可放心告诉任何人
添加公钥到 Github 服务器:copy 本地 id_rsa.pub 的内容到 Github 的 Setting 中,具体如图:
首先,在我们进行任何的 git 操作之前,我们都得先切换到 Git 的仓库目录。换言之,我们得到先进入到(我们定义的)Git 仓库的最顶层文件目录下,然后在此目录中 Git Bash Here,这样之后的操作才能顺利进行。
Git Bash下的复制和粘贴为 Ctrl + Ins 和 Shift + Ins。
第 1 个命令:git status
查看当前仓库的状态。
第 2 个命令:git init
用来初始化仓库,这条命令运行后,所在目录便成为一个 Git 仓库了,并且默认进入 Git 仓库的 master 分支,即主分支,且当前目录会生成一个隐藏的 .git 目录。如果没有看到 .git 目录,那是因为这个目录默认是隐藏的,用 ls -ah
命令就可以看到了。
在该文件夹下新建一文本文档命名为 hit,然后在 Git Bash 命令行窗口的光标处,输入 git add hit.txt
命令,便将 hit.txt 文件添加到 Git 仓库的暂存区。
第 4 个命令:git commit
在命令行窗口的光标处,输入 git commit -m "text commit"
命令,将 hit.txt 文件提交到 Git 仓库
我们成功将文件 hit.txt 提交到了 Git 仓库,其中 commit 表示提交,-m 表示提交信息,双引号""内的是提交信息。
第 5 个命令:git log
在命令行窗口的光标处,输入 git log
命令,打印 Git 仓库提交日志
如上图所示,显示了我们的提交记录,提交记录的内容包括 Author 提交作者、Date 提交日期和提交信息。
第 6 个命令:git branch
在命令行窗口的光标处,输入 git branch
命令,查看 Git 仓库的分支情况:
显示了当前仓库中的分支情况,现在仅有一个 master 分支,其中 master 分支前的 * 号表示“当前所在的分支”,例如 * master 就意味着我们所在的位置为 demo 仓库的主分支。输入命令 git branch a
,再输入命令 git branch
,结果如下图所示:
如上图所示,我们创建了一个名为 a 的分支,并且当前的位置仍然为主分支(分支是很容易被创建的)。
第 7 个命令:git checkout
在命令行窗口的光标处,输入 git checkout a
命令,切换到 a 分支:
如上图所示,我们已经切换到 a 分支啦!通过命令 git branch
查看分支情况 * 号也已出现在 a 分支前。
在这里,我们还有一个更简单的方法来查看当前的分支,即命令行的最后已经给出了当前所在分支。此外,我们也可以在创建分支的同时,直接切换到新分支,命令为 git checkout -b
,例如输入 git checkout -b b
命令:
第 8 个命令:git merge
切换到 master 分支,然后输入 git merge a
命令,将 a 分支合并到 master 分支:
(合并过程就是先切换一下当前分支,之后使用 git merge a
(就是自己想要合并的分支,自己选))
如上图所示,我们已经将 a 分支合并到主分支啦!此外,在这里需要注意一点,那就是:在合并分支的时候,要考虑到两个分支是否有冲突,如果有冲突,则不能直接合并,需要先解决冲突;反之,则可以直接合并。
git中的两个分支是否有冲突是什么意思,这是因为什么导致的?
在 Git 中,如果两个分支都修改了同一个文件的同一部分,并且尝试将它们合并在一起,就会发生冲突。这种情况下,Git 无法自动决定应该保留哪个更改,因此需要手动解决冲突。
解决冲突通常需要打开包含冲突的文件,并手动编辑它们,以删除冲突并选择要保留的更改。然后,可以将文件标记为已解决冲突,并将更改提交到 Git 中,以表示解决了冲突。
冲突通常发生在多个人在同一个代码库中工作,并对相同的文件或代码进行更改时。如果没有正确的协调和通信,就会导致冲突。因此,在使用 Git 进行协作开发时,需要密切关注其他人的更改,并努力避免同时更改相同的代码。
第 9 个命令:git branch -d & git branch -D
在命令行窗口的光标处,输入 git branch -d a
命令,删除 a 分支:
如上图所示,我们已经将分支 a 删除啦!不过有的时候,通过 git branch -d
命令可以出现删除不了现象,例如分支 a 的代码没有合并到主分支等,这时如果我们一定要删除该分支,那么我们可以通过命令 git branch -D
进行强制删除。
第 10 个命令:git tag
在命令行窗口的光标处,输入 git tag v1.0
命令,为当前分支添加标签:
如上图所示,我们为当前所在的 master 分支添加了一个 v1.0 标签。通过命令 git tag
即可查看我们添加标签的记录。通过命令 git checkout v1.0
即可切换到该标签下的代码状态。
第11个命令:git push
在命令行窗口的光标处,输入 git push <远程仓库地址> <本地分支名>:<远程分支名>
命令,将当前分支推送到远程仓库:
如上图所示,master 分支被推送到远程仓库,远程仓库无 master 分支,所以自动创建了 master 分支。
第12个命令:git clone
在命令行窗口的光标处,输入 git clone <远程仓库地址>
命令,将远程 Git 仓库拷到本地,让自己能够查看该项目,或者进行修改。
创建版本库
git clone
:从网络上某个地址拷贝仓库 (repository) 到本地
git init
:在本地的当前目录里初始化 git 仓库,会在当前目录生成一个隐藏的 .git 目录
修改与提交
git status
: 查看当前仓库的状态
git diff
: 显示暂存区和工作区的差异
git add
: 添加当前目录下的所有文件到暂存区
git add
: 添加一个或多个文件到暂存区
git mv
: 文件改名
git rm
: 将文件从暂存区和工作区中删除
git rm --cached
: 把文件从暂存区域移除,但仍然保留在当前工作目录中
git commit -m "commit message"
: 提交暂存区到本地仓库中,提交信息最好能体现更改了什么
查看提交历史
git log
: 查看当前版本及之前的 commit 记录
git log -p
: 查看指定文件的提交历史
git blame
: 以列表形式查看指定文件的提交历史
分支与标签
git branch
: 列出分支基本信息
git branch
: 创建新分支
git branch -d
: 删除分支
git checkout
: 切换到指定分支或标签
git checkout -b
: 创建并切换到新分支
git switch
:切换到指定分支
git switch -c
:创建并切换到新分支
git tag
: 列出所有本地标签
git tag
: 基于最新提交创建标签
git tag -d
: 删除标签
合并与衍合
git merge
: 合并指定分支到当前分支
git rebase
: 衍合指定分支到当前分支
远程操作
git remote -v
: 查看所有远程版本库
git remote show
: 显示某个远程仓库的信息
git remote add
: 添加远程版本库
git fetch
: 从远程库获取代码
git pull
: 下载代码及快速合并
git push
: 上传代码及快速合并
git push
: 删除远程分支或标签:
git push --tags
: 上传所有标签