Git与Github入门(一)
环境:
Git与GitHub的来历
Linux 之父 Linus 在 1991 年创建开源的 Linux 操作系统之后,多年来依靠全世界广大热心志愿者的共同建设,经过长足发展,现已成为世界上最大的服务器系统。系统创建之初,代码贡献者将源码文件发送给 Linus,由其手动合并。这种方式维持多年后,代码量已经庞大到人工合并难以为继,于是深恶集中式版本控制系统的 Linus 选择了一个分布式商业版本控制系统 BitKeeper,不过 Linux 社区的建设者们可以免费使用它。BitKeeper 改变了 Linus 对版本控制的认识,同时 Linus 发现 BitKeeper 有一些不足,而且有个关键性的问题使之不能被广泛使用,就是不开源。
在 2005 年,BitKeeper 所在公司发现 Linux 社区有人企图破解它,BitKeeper 决定收回 Linux 社区的免费使用权。Linus 对此事调解数周无果,找遍了当时已知的各种版本控制系统,没有一个看上眼的,一怒之下决定自己搞一个。Linus 花了十天时间用 C 语言写好了一个开源的版本控制系统,就是著名的 Git。
2007 年旧金山三个年轻人觉得 Git 是个好东西,就搞了一个公司名字叫 GitHub,第二年上线了使用 Ruby 编写的同名网站 GitHub,这是一个基于 Git 的免费代码托管网站(有付费服务)。十年间,该网站迅速蹿红,击败了实力雄厚的 Google Code,成为全世界最受欢迎的代码托管网站。2018 年 6 月,GitHub 被财大气粗的 Microsoft 收购。2019 年 1 月 GitHub 宣布用户可以免费创建私有仓库。根据 2021年的 GitHub 年度报告显示,目前在全球已有 7300 万开发者用户,增加了213,319名首次开源项目贡献者。
在GitHub上创建仓库
一、注册
根据提示填写对应信息即可。因为GitHub的服务器在国外,所以可能会访问失败,耐心多是几次即可;另外,某些浏览器可能不受GitHub的支持,会给出相应的提示。
二、创建仓库
在个人主页右上角点击New repository 创建新的仓库:
安装Git
1.Linux
二进制安装程序安装:
基于RPM的发行版,例如CentOs
$ sudo dnf install git-all
基于Debian
$ sudo apt install git-all
从源代码安装:
能得到最新的版本,如果想从源码安装 Git,需要安装 Git 依赖的库:autotools、curl、zlib、openssl、expat 和 libiconv。 如果你的系统上有 dnf
(如 Fedora)或者 apt
(如基于 Debian 的系统), 可以使用对应的命令来安装最少的依赖以便编译并安装 Git 的二进制版:
$ sudo dnf install dh-autoreconf curl-devel expat-devel gettext-devel \
openssl-devel perl-devel zlib-devel
$ sudo apt-get install dh-autoreconf libcurl4-gnutls-dev libexpat1-dev \
gettext libz-dev libssl-dev
为了添加文档的多种格式(doc、html、info),需要以下附加的依赖:
$ sudo dnf install asciidoc xmlto docbook2X
$ sudo apt-get install asciidoc xmlto docbook2x
Note | 使用 RHEL 和 RHEL 衍生版,如 CentOS 和 Scientific Linux 的用户需要 开启 EPEL 库 以便下载 docbook2X 包。 |
---|
如果使用基于 Debian 的发行版(Debian/Ubuntu/Ubuntu-derivatives),你也需要 install-info
包:
$ sudo apt-get install install-info
如果你使用基于 RPM 的发行版(Fedora/RHEL/RHEL衍生版),你还需要 getopt
包 (它已经在基于 Debian 的发行版中预装了):
$ sudo dnf install getopt
此外,如果使用 Fedora/RHEL/RHEL衍生版,需要执行以下命令:
$ sudo ln -s /usr/bin/db2x_docbook2texi /usr/bin/docbook2x-texi
以此来解决二进制文件名的不同。
当安装好所有的必要依赖,你可以继续从几个地方来取得最新发布版本的 tar 包。 可以从 Kernel.org 网站获取,网址为 https://www.kernel.org/pub/software/scm/git, 或从 GitHub 网站上的镜像来获得,网址为 https://github.com/git/git/releases。 通常在 GitHub 上的是最新版本,但 kernel.org 上包含有文件下载签名,如果想验证下载正确性的话会用到。
接着,编译并安装:
$ tar -zxf git-2.8.0.tar.gz
$ cd git-2.8.0
$ make configure
$ ./configure --prefix=/usr
$ make all doc info
$ sudo make install install-doc install-html install-info
完成后,可以使用 Git 来获取 Git 的更新:
$ git clone git://git.kernel.org/pub/scm/git/git.git
2.Windows
Windons也有多种安装方法,官方版本可以在 Git 官方网站下载。 打开 https://git-scm.com/download/win,下载会自动开始。 要注意这是一个名为 Git for Windows 的项目(也叫做 msysGit),和 Git 是分别独立的项目;更多信息请访问 http://msysgit.github.io/。
要进行自动安装,你可以使用 Git Chocolatey 包。 注意 Chocolatey 包是由社区维护的。
另一个简单的方法是安装 GitHub Desktop。 该安装程序包含图形化和命令行版本的 Git。 它也能支持 Powershell,提供了稳定的凭证缓存和健全的换行设置。 稍后我们会对这方面有更多了解,现在只要一句话就够了,这些都是你所需要的。 你可以在 GitHub for Windows 网站下载,网址为 GitHub Desktop 网站。
3.Mac
二进制程序安装:
官方维护的 macOS Git 安装程序可以在 Git 官方网站下载,网址为 https://git-scm.com/download/mac
命令行工具安装:
安装 Xcode Command Line Tools。 Mavericks (10.9) 或更高版本的系统中,在 Terminal 里尝试首次运行 ‘git’ 命令即可。
$ git --version
添加SSH关联授权
2021 年 8 月 GitHub 不再允许使用账户密码操作 GitHub,必须使用 SSH 密钥登陆。
2022 年 3 月 15 日,GitHub 又通过删除较旧的不安全密钥类型提高了安全性。
接下来,我们可以在系统中创建 SSH 公私钥,并将公钥放到 GitHub 指定位置。如此操作即可生成 GitHub 账户对于当前系统中的 Git 授权。
ssh-keygen -t -C "邮箱地址"
这样就生成了公私钥。公私钥存放在位置(隐藏文件)
将pub文件中的公钥内容复制出来,然后在GitHub网页上添加公钥(鼠标单击头像->settings):
title自定义,把剪切板中的内容粘贴到 Key 中,点击绿色按钮添加 SSH Key 即可:
使用ssh的好处:
- 免密码推送,执行
git push
时不再需要输入用户名和密码了; - 提高数据传输速度。但不是必须的,比如不经尝使用或者使用一次性的虚拟环境,就没有必要创建 SSH 了,因为相较好处来说,还是太麻烦了。
克隆GitHub上的仓库到本地
命令:
git clone [仓库地址]
回到仓库主目录:
或者
重要的一点:只有使用 git 开头的地址克隆仓库,SSH 关联才会起作用。
.git隐藏目录:
里面包含了仓库的全部信息,删掉这个目录,仓库就变成普通的目录了:
在 GitHub 上创建一个仓库时,同时生成了仓库的默认主机名 origin,并创建了默认分支 master。GitHub 可以看成是免费的 Git 服务器,在 GitHub 上创建仓库,会自动生成一个仓库地址,主机就是指代这个仓库,主机名就等于这个仓库地址。克隆一个 GitHub 仓库(也叫远程仓库)到本地,本地仓库则会自动关联到这个远程仓库,执行 git remote -v
命令可以查看本地仓库所关联的远程仓库信息:
Git 要求对本地仓库关联的每个远程主机都必须指定一个主机名(默认为 origin),用于本地仓库识别自己关联的主机,git remote
命令就用于管理本地仓库所关联的主机,一个本地仓库可以关联任意多个主机(即远程仓库)。
克隆远程仓库到本地时,还可以使用 -o
选项修改主机名,在地址后面加上一个字段作为本地仓库的主目录名:
Git基础操作
git仓库的三大区域
Git 本地仓库三大区域:工作区、暂存区、版本区
开发者与仓库:
添加修改到暂存区以及撤销修改
1.修改
进入仓库主目录:
cd [目录名]
查看仓库的管理状态:
git status
创建一个文件后再次查看仓库的管理状态:
新增文件后,可见描述内容已经发生了变化,大概内容就是:你的分支为远程主机origin做了更新,可以使用add命令来添加中包含的修改到暂存区才能被commit命令提交修改,使用commit命令提交修改前需要先使用add命令去给文件添加到暂存区跟踪。
命令:
git add [文件名]
即把新增/修改的文件添加到暂存区,以备提交:
如需同时修改/新增了多个文件并需要添加到修改区,可使用:
git add .
将新增/修改文件全部添加到暂存区。
2.撤销修改
撤销添加的修改:
git restore --staged [文件名] 或者 git reset --[文件名] 或者 git rm --cached [文件名称]
如果省略最后的文件名,把命令写成 git reset --
即可把暂存区的全部修改撤销。
查看工作区被跟踪文件的修改详情
命令:
git diff
用来查看工作区被跟踪的文件的修改详情
修改被跟踪文件再次执行执行git diff
:
此时会跳到工作区修改详情页,按 Q
退出此页面
再次添加修改后,被跟踪文件暂无修改,所以看不到详情。
使用 git diff --cached
可查看暂存区的全部修改:
提交修改以及产看提交历史
1.提交修改
命令:
git commit -m
把暂存区的修改提交到版本区,生成一个新的提交版本,-m
用来提供提交的备注(如果不填写,将需要手动编辑):
俩种方式的结果是一样的
命令:
git commit -a
-a
,它的作用是将未添加到暂存区的修改,也就是工作区的修改也一并提交,但会略过未被跟踪的文件,比如新建的文件 helloword.py。此命令的完整格式:git commit -am xxxxx
。
保险的做法是按照前面的顺序,修改工作区 -> 提交到暂存区 -> 随时使用 git status
查看仓库状态 -> 将暂存区的修改提交到版本区生成一次新的提交。
提交后,暂存区的修改被清空。
2.查看修改历史
命令:
git log
查看版本区的提交历史记录
此命令同样会跳转到新页面:
红色框中的十六进制序列号就是提交版本号,这是很重要的信息,每个提交都有自己单独的版本号,这是git辨别提交的根本。
按照时间正序排列:
此命令的一些常用选项:
git log [分支名]
查看某分支的提交历史,不写分支名查看当前所在分支git log --oneline
一行显示提交历史git log -n
其中 n 是数字,查看最近 n 个提交git log --author [贡献者名字]
查看指定贡献者的提交记录git log --graph
图示法显示提交历史
配置个人信息
假如没有进行git的一些本地配置,就不能提交修改以及克隆仓库,说白了就是如果你没有配置你的本地身份,团队就不能区分该修改是谁修改的,所以必须进行配置。
1.配置
命令:
git config --global user.name:GitHub的账户名称
git config --global user.email:GitHub的邮箱号
**global:**传递 --local
选项让 Git 强制读写此文件
2.查看配置
命令:
git config -l 或者 git config --list
产看全部分支的信息
命令:
git branch -avv
说明
L1:开头的星号表示当前所在分支,绿色的 main 是分支名,之所以是绿色,也是因为它是当前所在分支。后面第二项是版本号,第三项中括号里面蓝色的字,表示此分支跟踪的远程分支的名字;冒号后面的文字表示本地分支领先其跟踪的远程分支一个提交。最后一项是提交时填写的备注信息
L2:是 Git 指针信息,它指向远程仓库的 master 分支,这行信息暂不重要
L3:远程分支信息
将本地新增的修改提交推送到GitHub远程仓库中
命令:
git push
把本地仓库 master 分支上的新增提交推送到远程仓库的同名分支上,因为当前所在的分支就是 master,而且上文提到,它已经跟踪了远程仓库的同名分支:
推送成功后执行 git branch -avv
查看分支情况:
本地分支 master 与远程分支 origin/master 的版本号一致,通常看两个版本号是否一致,只需比对前四位。网页上的情况:
版本回滚
如果发现提交的修改有误,可以修改此文件然后再次添加到暂存区,然后按照前面的步骤分别提交、推送,当然,也可以撤销前面的错去提交,也就是把你写的bug重新撤回。
此时,仓库中的文件将会回到没修改前的版本。
命令:
git reset --soft HEAD^
可以撤销最近的一次提交,将修改还原到暂存区。--soft
表示软回回退( 使用–soft回退只回退了commit的信息,不会恢复到暂存区对文件的修改,暂存区文件修改的内容还保存在里面,不会变;如果还要将暂存区里的内容提交,直接commit即可), --hard
硬回退(彻底回退到某个版本,本地的代码会变为上一个版本的内容,修改的内容全部被丢掉;不管是commit的修改,还是暂存区文件中修改的内容都不会被保留!一旦回滚,使用log是找不回来的,只能借助于reflog)。
HEAD^ 表示撤销一次提交,
HEAD^^` 表示撤销两次提交,撤销 n 次可以简写为 `HEAD~n`。软退回一个提交后执行 `git branch -avv` 命令查看分支信息:
可以看到本地仓库分支的版本号已经发生了变化,变成了前一次提交的版本号,中括号里也有提示信息,本地分支落后其跟踪的远程分支 origin/master 一个提交。
执行 git status
查看
上一个提交中的修改就会全部被还原到暂存区
处理commit时间线分叉
所谓的时间线分叉,
命令:
git status #查看仓库状态
git branch -avv #查看分支状态
可以看到本地仓库的分支与远程仓库的 origin/mian分支在提交版本上有了冲突。
这是因为刚才的提交操作不是基于远程仓库 origin/main 分支的最新提交版本,而是撤回了一个版本。这种情况可以将本地分支推送到远程仓库的,需要加一个选项 -f
,它是 --force
的简写,这就是强制推送:
执行 git branch -avv
:
本地 master 与远程 master 的版本号一致,前四位都是 ,刷新 GitHub 页面:
本地仓库commit变化记录
该操作是为了防止被撤回的是正确提交,后面做的操作才是误操作。此时当然可以重新进行版本修改,但是,假如量巨多呢?这岂不是加速了头发掉落的节奏!此时利用好本地的提交变化记录就派上用场啦!
命令:
git reflog
记录本地仓库所有分支的每一次版本变化。实际上只要本地仓库不被删除,随你怎么折腾,都能回退到任何地方。reflog
记录只存在于本地仓库中,本地仓库删除后,记录才消失:
回退到一开始的正确版本
命令:
git reset --hard [版本号]
也可以:
git reset --hard HEAD@{n}
其中HEAD{n}
就是当前分支最近n次提交的版本,而加上git reset
就是回到最近n次提交版本变化前。