我有两颗糖

博客小屋

By 某只不愿露脸的尹同学


02-Git与Github的使用


1. GETTING STARTED

1.1 Install git

Reference:Download for Linux and Unix

$ su root
$ apt-get install git	## 使用 apt-get 安装 git
$ git --version			## 查看所安装的 git 版本

1.2 Git 配置

git config --list --show-origin					## 查看配置所在文件

git config --global user.name "candy_wind"		## 设置用户名
git config --global user.email jianhauyin@hnu.edu.cn	## 设置 Email
git config --global core.editor Typora			## 文本编辑器

git config --list		## 查看配置信息
user.name=candy_wind
user.email=jianhuayin@hnu.edu.cn
core.editor=vim

git config user.name		## 查看 user.name

Getting help

$ git help <verb>
$ git <verb> --help
$ man git-<verb>

2. GIT BASICS

学习内容

  • 配置并初始化一个仓库(repository)
  • 开始或停止跟踪(track)文件、暂存(stage)或提交(commit)更改
  • 配置 Git 来忽略指定的文件和文件模式、如何迅速而简单地撤销错误操作、如何浏览你的项目的历史版本以及不同提交(commits)之间的差异、如何向你的远程仓库推送(push)以及如何从你的远程仓库拉取(pull)文件

2.1 Git 文件状态

有三种状态: 已提交 (committed)已修改 (modified)已暂存 (staged)

  • 已修改表示修改了文件,但还没保存到数据库中。
  • 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
  • 已提交表示数据已经安全地保存在本地数据库中

2.2 获取 git 仓库

2.2.1 在已存在目录中初始化仓库

$ cd /home/yin/workspace
$ git init					## 初始化仓库,创建一个名为 .git 的子目录

可以通过 git add 命令来指定所需的文件来进行追踪,然后执行 git commit

$ git add FileName		                ## 追踪文件(添加到 cache)
$ git commit -m 'initial project version'	## 提交

2.2.2 克隆仓库

克隆仓库的命令是 git clone 。 比如,要克隆 Git 的链接库 libgit2,可以用下面的命令:

$ git clone https://github.com/libgit2/libgit2	        ## 克隆,在当前目录创建lingit2
$ git clone https://github.com/libgit2/libgit2 mylibgit	## 克隆到 mylibit

2.3 文件基本操作

文件的状态变化如下图:

工作区的文件有 已跟踪未跟踪 两种状态,通过 add 来进行追踪,追踪后文件备份到 cache 中。编辑过某些文件之后,由于自上次提交后你对它们做了修改,Git 将它们标记为已修改文件。 在工作时,你可以选择性地将这些修改过的文件放入暂存区,然后提交所有已暂存的修改,如此反复。

2.3.1 查看文件状态

git status ## 查看状态

git status -s ## 以紧凑的方式显示状态

$ git init		## initialize a repository
$ git status	        ## 查看状态
$ git status -s		## 以紧凑的方式显示状态
$ git status --short	## 以紧凑的方式显示状态

2.3.2 文件的追踪与提交

$ touch README.md
$ git status -s
$ git add README.md         ## 添加追踪
$ git commit -m "initial project version"     ## commit

2.3.3 工作区变动

$ git add/rm <文件>...        ## 更新要提交的内容 (若工作区文件删除,则用rm)
$ git checkout -- <文件>...   ## 丢弃工作区的改动

如果想删除仓库中的文件,但让文件保留在磁盘,但是并不想让 Git 继续跟踪,则用 --cache

$ git rm --cache FileName

在 Git 中修改文件名时使用 git rm

$ git rm filename1 filename2

## 等价于:
$ mv README.md README
$ git rm README.md
$ git add README

2.3.4 查看历史版本

(1)git log 命令可以查看历史提交版本信息

(2)选项是 --pretty可以设置显示历史的方式, oneline 会将每个提交放在一行显示; 另外还有 shortfullfuller 选项。

(3)format 可以定制记录的显示格式

$ git log
$ git log -p -2              ## 只显示最近的两次提交
$ git log --since=2.weeks    ## 列出最近两周的所有提交
$ git log --pretty=oneline   ## 在一行显示每一个版本的信息
$ git log --pretty=format:"%h - %an, %ar : %s"   ## 指定显示格式

2.3.5 回到历史版本

可以使用 git checkout xxxx 回到过去的版本(本地内容也会回到过去):

$ git log --pretty=oneline
362f0446037e774181cbf84ea48b528fc3e0de33 (HEAD -> master) v1.2
6e354fa64f745b49cabdb4f88506d9c7d079a2c4 v1.0

$ git checkout 6e354fa64f745b49cabdb4f88506d9c7d079a2c4 ## 回到历史版本
$ cat start.md          ## 查看内容 (看到的将是过去的版本)

2.4 撤销操作

2.4.1 重新提交

如果上一次提交缺少了文件或者提交信息有误,可以运行带有 --amend (修订)选项的提交命令来重新提交:

$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend				## 第二次提交将代替第一次提交的结果

2.4.2 取消暂存

使用git reset HEAD ... 来取消暂存:

$ git add *	                ## 不小心将所有文件暂存了
$ git reset HEAD CONTRIBUTING.md	## 取消对文件 CONTRIBUTING.md 的暂存

2.4.3 撤消对文件的修改

如果你并不想保留对 CONTRIBUTING.md 文件的修改怎么办?使用 git checkout <FileName> 来丢弃工作区的改动(慎用,因为他会将此前修改的内容全部删除):

$ git checkout CONTRIBUTING.md

2.5 Git 基础 - 远程仓库的使用

2.5.1 查看远程仓库 (remote repository)

$ git clone https://github.com/schacon/ticgit	## clone
$ cd ticgit

$ git remote		## 查看远程(remote)仓库
origin

$ git remote -v		## 显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL
origin  https://github.com/schacon/ticgit (fetch)
origin  https://github.com/schacon/ticgit (push)

2.5.2 远程仓库基础操作

运行 git remote add :添加一个新的远程 Git 仓库

运行 git fetch:从远程仓库中获得数据

运行 git push:将分支上传到服务器

运行 git pull:下拉分支并合并到本地

git remote add [<选项>] <名称> <地址>		## 添加一个新的远程 Git 仓库
$ git remote add pb https://github.com/schacon/ticgit
$ git remote -v
origin  https://github.com/schacon/ticgit (fetch)
origin  https://github.com/schacon/ticgit (push)
pb      https://github.com/schacon/ticgit (fetch)
pb      https://github.com/schacon/ticgit (push)

$ git fetch <remote>		## 从远程仓库中获得数据
$ git push origin master	## 将 master 分支推送到 origin 服务器
设置上游分支
git push --set-upstream origin xxx  ## 为推送当前分支并建立与远程上游的跟踪

2.5.3 在本地创建远程分支

假设 branch1 和 master 位于文件夹:/home/yin/workspace/story

git clone --bare:裸仓库,无项目目录,不用于写项目,只用于做远程分支

  branch1
* master

$ cd /home/yin/
$ git clone --bare /home/yin/workspace/story        ## 在 /home/yin/ 中创建裸仓库 story.git

$ cd /home/yin/workspace/story
$ git remote        ## 查看远程仓库
$ git remote add remote-story /home/yin/story.git   ## 将 story.git 添加为远程的源 命名为 remote-story

$ cd /home/yin/project/                ## 进入到新的目录下
$ git clone /home/yin/story.git        ## 克隆仓库,并自动生成项目目录,自动将被克隆仓库设置为源 origin
$ cd story
$ git remote show origin               ## 查看源 origin 的详细信息

2.5.4 查看、重命名与删除

$ git remote show origin		## 查看远程仓库 origin 的信息
$ git remote rename pb paul	## 将 pb 重命名为 paul
$ git remote remove paul		## 删除远程仓库 paul

2.6 添加标签

在 Git 中创建附注标签十分简单。

最简单的方式是当你在运行 tag 命令时指定 -a 选项:

  • 可以在每次提交完后打标签(需要加上打标签的注释 -m)

  • 也可以在提交了很多个版本后,使用哈希数字来打标签

$ git tag                                 ## 查看所有标签
$ git tag -a <version> -m <message>       ## 前期
$ git tag -a <version> <check_sum> -m <commit message>	## 后期
## 前期打标签
$ git commit -m "version 1.4"           ## 提交了一次
$ git tag -a v1.4 -m "version 1.4"      ## 给上一次提交打标签 'v1.4'
$ git log                               ## log 信息中包含了标签名
commit 1a95e08271d2ab3dceb74d6cb060622ca0c7e714 (HEAD -> master, tag: v3.0)
Author: git-jhy <1437130953@qq.com>
Date:   Fri Dec 25 16:40:33 2020 +0800

## 后期打标签
$ git log --pretty=oneline              ## 查看历史版本
00e494284346b763d4def08a8d3a4d736bb8554e version 3.0
4f13017fe621c0dda92ce694693dc72caad744ab veersion 2.0
d66f70f362024c0d85f44a18c23dc0d9d17ba968 initial version

$ git tag -a v2.0 4f130 -m "version 2.0" ## 添加标签 v2.0 -m后为说明文字
$ git tag                                ## 查看所有标签

3. Git 分支

使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。

Git 的分支,其实本质上仅仅是指向提交对象的可变指针。 Git 的默认分支名字是 master。 在多次提交操作之后,你其实已经有一个指向最后那个提交对象的 master 分支。

$ git init                     ## 初始化文件夹,自动生成 master 分支
$ git branch                   ## 查看当前所在分支
$ git checkout -b xxx          ## 创建并跳转到新的分支 xxx
$ git branch -d xxx          ## 删除分支 xxx

git 有一个特殊的指针 HEAD 始终指向当前所在的本地分支

每当创建一个新分支,都会在当前所在的提交对象上创建一个指针

$ git checkout testing               ## 切换分支,HEAD指向 testing
$ vim test.rb
$ git commit -a -m 'made a change'   ## testing 分支提交一次

如图所示,你的 testing 分支向前移动了,但是 master 分支却没有,它仍然指向运行 git checkout 时所指的对象。

此时如果使用 branch 命令切换回 master 分支,则 HEAD 回到 master工作目录恢复成 master 分支所指向的快照内容。 也就是说,你现在做修改的话,项目将始于一个较旧的版本。 本质上来讲,这就是忽略 testing 分支所做的修改,以便于向另一个方向进行开发。


3.1 分支的创建与合并

git merge new_branch 合并 new_branch 分支到当前所在分支

git branch -d new_branch 删除分支 new_branch

$ git checkout -b new_branch	## 新建分支(HEAD指向 new_branch)
$ git touch README.md
$ git add README.md
$ git commit -m "add README.md"

$ git checkout master		## 回到主分支(HEAD指向master)
$ git merge new_branch		## 将 new_branch 合并到 master

$ git branch -d new_branch	## 删除 new_branch

注:合并分支时可能遇到 conflict,需要先解决冲突再进行合并。


3.2 分支管理

下面是git branch的功能:

$ git branch               ## “*”所指的分支为当前所在分支,即HEAD所指向的分支
* master
  branch1
  branch2
$ git merge branch1

$ git branch -v            ## 要查看每一个分支的最后一次提交

$ git branch --merged      ## 查看哪些分支已经合并到当前分支 (此时可删除branch1)
  branch1
* master

$ git branch --no-merged   ## 查看哪些分支还没合并到当前分支
  branch2

3.3 项目分享与更新

git fetch 命令与一个远程的仓库交互,并且将远程仓库中有但是在当前仓库的没有的所有信息拉取下来然后存储在你本地数据库中。

git pull 命令基本上就是 git fetchgit merge 命令的组合体,Git 从你指定的远程仓库中抓取内容,然后马上尝试将其合并进你所在的分支中。

git push 命令用来与另一个仓库通信,计算你本地数据库与远程仓库的差异,然后将差异推送到另一个仓库中。 它需要有另一个仓库的写权限,因此这通常是需要验证的。

当多个用户通过一个源克隆仓库时,不同用户修改好内容后通过 git push 上传更新内容,其他用户使用 git remote show remoteName 命令查看源的信息时,会显示 本地已过时 ,此时可以通过 git pull 或者 git fetch + git merge 来对当前项目进行对应的更新。


4. ssh协议

当我们使用 github 时,要将文件 clone 到本地,进行修改后再 push 到网站上,由于每次 push 都要输入帐号密码很不方便,可以使用 ssh 协议来上传克隆文件,需要做的只是创建密钥并粘贴到 github 个人主页的 setting 中去:

创建密钥:

$ ssh-keygen -t rsa      ## -t rsa可以省略,默认就是生成rsa类型的密钥
$ cd /home/yin/.ssh/     ## 进入 .ssh 文件夹
$ cat id_rsa.pub         ## 查看公钥
$ ssh -vT git@github.com

在终端输入上面的代码后,会在当前用户主目录下生成隐藏的 .ssh 目录,其中包含了存放私钥的文件 id_rsa 和存放公钥的文件 id_rsa.pub,具体过程如下:

当看到下面的 successfully 时,表示成功了!

接着,将 cat id_rsa.pub 显示的公钥粘贴到 github 上:


5. 创建个人博客

5.1 创建个人仓库

github 给了我们每个人一定的空间存放博客,可以直接创建 github page

利用先有的模板搭建个人博客很简单,需要做的事情有:

  • Fock 模板并修改仓库设置
  • 将模板克隆到本地进行修改(推荐用 Atom)
  • 安装 jekyll 预览网页
  • 使用 push 上传内容

5.1.1 仓库设置

在 setting 里面更改仓库名(用自己的名字)

接着设置 source:

5.1.2 jekyll 的安装与使用

$ sudo apt-get install ruby-dev
$ sudo gem install jekyll

安装完成后可以在本地仓库右键终端打开,输入下面命令就可以获得一个网址,浏览器访问即可:

$ jekyll server



「参考内容」

-->