0%

HowToDo笔记:GitHub 使用简易指南

写在前面

这则笔记主要整理GitHub使用基础,主要包括以下内容:

  • ssh连接github

  • git基础:初始化、clone、push等;

  • git进阶:常见工作流

  • 常见问题处理

ssh连接github

准备工作(mac)

  1. 安装Apple公司的Xcode,最新版的Xcode已经默认安装好了git。完成安装之后,就可以使用 git 的命令行工具。
  2. 登陆github网站申请一个免费账号。

第一步:配置账号信息

在终端下输入以下命令行:

1
2
git config --global user.name <name>
git config --global user.email <mail-box>

指的是账户名;指的是注册邮箱

第二步:创建本地ssh

SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。

  • 在终端输入以下命令行:
1
ssh-keygen -t rsa -C "<mail-box>"
  • 一路下一步,看到下图的样子说明成功

  • 在终端输入:
1
cat /users/admin-name/.ssh/id_rsa.pub
  • 一切顺利的话,看到的信息应该是这样子的:
1
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDS0qLtpontavr43AQntX4oBOsg2R3QlWubMYvfgJsIDX6NWd5RaIDLBLEMwIFLDcpvpQKvk5S/bTy4vTuWqeY6fkQ/tZBKksQn1WuYDcSfjLF8BuPMfdkboTh9NaKESKnsiWdranEVbmB5vOAHm8T+HFGdzG7Tz4ygzCnTwvdpBYrd/4jgeazws2d7CuMeuyb+FxdDTQy9YmJJm+82ypfR//bLyzRJo3SYadnPO3VdOAZCO1Isky+p/0nNN/obC4t2y2+oHBAqJV9h37f9S8UShgDmZoVLicRi4poni0i70xj+t/hnOsT8fmEc+vM9USyN+ndawz2oWjikKgln1jOB 345823102@qq.com

第三步:登陆github输入key

登陆github网站,点击Settings——SSH keys——点击右侧的Add SSH key,输入刚才得到的key

  • 验证是否配置成功,在终端输入:
1
ssh -T git@github.com
  • 出现如下信息,说明连接成功
1
2
3
Warning: Permanently added the RSA host key for IP address '192.30.252.131' to the list of known hosts.

Hi hawx1993! You've successfully authenticated, but GitHub does not provide shell access.

git基础操作

仓库初始化

创建新文件夹,打开,然后执行以下创建新的 git 仓库。

1
git init

克隆仓库

执行如下命令以创建一个本地仓库的克隆版本:

1
git clone /path/to/repository

如果是远端服务器上的仓库,你的命令会是这个样子:

1
git clone username@host:/path/to/repository

添加与提交

你的本地仓库由 git 维护的三棵“树”组成:

  • 第一个是你的工作目录,它持有实际文件;

  • 第二个是 缓存区(Index),它像个缓存区域,临时保存你的改动;

  • 第三个是 HEAD,指向你最近一次提交后的结果。

git add用来将需要改动的内容添加到缓存区,这里有两个使用技巧:

  1. add 后面加个点 “.”:直接把工作目录下的所有改动全部放进暂存区;

  2. add 添加的是文件改动,而不是文件名。假定在使用 git add a.txt 后,又对a.txt进行了更改,后来的更改并不会自动放入缓存区,需要再添加一遍。

第一步:

1
2
git add <filename>
git add *

第二步:

1
git commit -m "代码提交信息"

现在,你的改动已经提交到了 HEAD,但是还没到你的远端仓库。

第三步:

1
git push origin master

可以把 master 换成你想要推送的任何分支。

分支操作

创建仓库的时候,默认分支是master;可以手动创建其他分支:

  • 创建一个叫做“feature_x”的分支,并切换过去:
1
git checkout -b feature_x
  • 切换回主分支:
1
git checkout master
  • 再把新建的分支删掉:
1
git branch -d feature_x

注意:

  1. HEAD 指向的 branch 不能删除。如果要删除 HEAD 指向的 branch,需要先用 checkout 把 HEAD 指向其他地方。
  2. 删除 branch 的操作也只会删掉这个引用,并不会删除任何的 commit。
  3. 没有被合并到 master 过的 branch 在删除时会失败,如果需要强行删除,需要使用如下命令:
1
git branch -d feature1
  • 将分支推送到远端仓库(只有当分支被push到仓库,别人才能看到)
1
git push origin <branch>
  • 合并分支

要合并其他分支到你的当前分支(例如 master),执行:

1
git merge <branch>

注意:自动合并并非次次都能成功,并可能导致冲突(conflicts)。 这时候就需要你修改这些文件来手动合并冲突。

在合并改动之前,也可以使用如下命令查看:

1
git diff <source_branch> <target_branch>

标签操作

执行如下命令以创建一个叫做 1.0.0 的标签:

1
git tag 1.0.0 1b2e1d63ff

1b2e1d63ff 是你想要标记的提交 ID 的前 10 位字符。使用如下命令获取提交 ID:

1
git log

你也可以用该提交 ID 的少一些的前6位。

替换本地改动

1
git checkout -- <filename>

此命令会使用 HEAD 中的最新内容替换掉你的工作目录中的文件。已添加到缓存区的改动,以及新文件,都不受影响。

假如你想要丢弃你所有的本地改动与提交,可以到服务器上获取最新的版本并将你本地主分支指向到它:

1
2
git fetch origin
git reset --hard origin/master

git log

  • git log用来查看历史记录,常用参数如下:

  • git log -p 查看commit 的每一行改动,所以很适合用于代码 review

  • log --stat 查看大致更改内容,例如什么文件更改了,更改有几处

  • git show 5e68b0d8 查看具体的commit,后面的这串数字是commit的SHA-1码的前8位;

  • git show 5e68b0d8 shopping\ list.txt 查看某个commit下的指定文件

  • git diff --staged 比对暂存区和上一条提交,与git diff –cached完全等价,可以换用

有用的贴士

  • 内建的图形化 git:gitk
  • 彩色的 git 输出:git config color.ui true
  • 显示历史记录时,只显示一行注释信息:git config format.pretty oneline
  • 交互地添加文件至缓存区:git add -i

GIT 进阶篇

Feature Branching:最流行的工作流

  1. 每个新功能都新建一个 branch 来写;

  2. 写完以后,把代码分享给同事看;写的过程中,也可以分享给同事讨论。另外,借助 GitHub 等服务提供方的 Pull Request 功能,可以让代码分享变得更加方便;

  3. 分支确定可以合并后,把分支合并到 master ,并删除分支。

实现步骤:

创建分支,编写代码,提交

1
2
3
// 假设要开发一个books的新功能
git checkout -b books //创建并切换到boos分支
git push origin books //提交代码到books分支

代码审阅

1
2
3
//假设是另一个同事在审阅
git pull
git chekcout books

合并分支

1
2
3
4
git checkout master
//merge 之前 pull 一下,让 master 更新到和远程仓库同步
git pull
git merge books

提交合并结果并删除books分支

1
2
3
4
git push
git branch -d books
//-d 参数把远程仓库的 branch 也删了
git push origin -d books

github常见问题

问题一:刚刚提交的代码,发现写错了怎么办?

解决思路:commit -—amend会把当前 commit 里的内容和暂存区(stageing area)里的内容合并起来后创建一个新的 commit,用这个新的 commit 把当前 commit 替换掉。

  • 第一步:修改错误文档 比如a.txt

  • 第二步:git add a.txt

  • 第三步:git commit –amend

问题二:更进一步,如果要修改的不是最新的commit,而是之前的commit(吃饱了闲的),应该怎么做?

解决思路:

  • 第一步:git log 查询具体是哪一个commit

  • 第二步:开启交互式 rebase 过程,有两种方式:

git rebase -i HEAD^^ 在 commit 的后面加一个或多个 ^ 号,可以把 commit 往回偏移,偏移的数量是 ^ 的数量,这里指的是HEAD 所指向的 commit 往前数两个 commit。

git rebase -i HEAD~5 在 commit 的后面加上 ~ 号和一个数,可以把 commit 往回偏移,偏移的数量是 ~ 号后面的数。例如:HEAD~5 表示 HEAD 指向的 commit往前数 5 个 commit。

  • 第三步:选择 需要更改的commit ,将pick改为edit,之后推出编辑界面

  • 第四步:修改写错的 commit
1
2
git add 笑声
git commit --amend
  • 第五步:继续 rebase 过程

git rebase –continue

git rebase的详细用法参见这里

问题三:之前提交的commit太烂,如何直接删除?

解决思路:

删除最近提交的commit,可以用git reset

git reset --hard 目标commit //这里可以用HEAD^ 来删除最近一条的commit

问题四:想删除的不是最近一条commit,而是之前的某一条,应该怎么做?

解决思路:

还是使用rebase -i 的方式来删除

1
2
3
4
5
6
7
8
9
10
11
//查询commit历史记录
git log
//找到要删除倒数第二条,之后直接删除掉需要删除的那一行
git rebase -i HEAD^^
```

### 问题五:当你手头有一件临时工作要做,需要把工作目录暂时清理干净,处理完临时工作再切换回来,这个要怎么实现?

**解决思路:**

`stash` 指令可以帮你把工作目录的内容全部放在你本地的一个独立的地方,它不会被提交,也不会被删除,你把东西放起来之后就可以去做你的临时工作;完成临时工作后再切换回来,恢复之前的进度

git stash // 没有add的文件不会被stash,如果所有的文件一起,需要用git stash -u,-u表示 –include-untracked的简写

git checkout fearture1 //假定原来的工作再feature1分支

git stash pop

1
2
3
4
5
6
7
8
9
10

### 问题六:误删了commit需要找回,应该怎么做?

**解决思路:**

git reflog //reflog 是 "reference log" 的缩写,用来查看 Git 仓库中的引用的移动记录

![](https://farm5.staticflickr.com/4625/40100633492_68c5336a9f_o.jpg)

从图中可以看出,HEAD 的最后一次移动行为是「从 branch1 移动到 master」。而在这之后,branch1 就被删除了。所以它之前的那个 commit 就是 branch1 被删除之前的位置了,也就是第二行的 c08de9a。

git checkout c08de9a
git checkout -b branch1
`

这样,之前误删的commit就回来了。

-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!