GitHub 常见操作

登录 GitHub 后,点击右上角的加号,选择 New repository 就可以创建远程库。

远程库别名一般与本地库相同,可以选择公有库和私有库。如果不进行初始化操作(添加 README file 等),就可以进入 Quick setup 界面。

在 Quick setup 界面可以选择两个链接模式,分别是 HTTPS 和 SSH,这就是我们的远程库地址。

远程库操作常用命令

命令名称 作用
git remote -v 查看当前所有远程库别名
git remote add 远程库别名 远程库地址 添加远程库
git push 远程库别名 远程分支名 将本地分支上的内容推送到远程库
git clone 远程库地址 将远程库的内容克隆到本地
git pull 远程库别名 远程分支名 将远程库对于本地分支更新的内容拉下来后与本地分支合并

创建远程库

先利用 git remote -v 来查看远程库别名,发现当前没有远程库。

然后利用 git remote add 来添加远程库,再次查看远程库别名,可以得到以下信息:

GitTest https://github.com/CALEB-jiale/GitTest.git (fetch)

GitTest https://github.com/CALEB-jiale/GitTest.git (push)

推送本地库到远程库

利用 git push 来把本地库推送到远程库,如果之前没有给远程库起别名,可以直接用远程库的地址。注意推送的最小单位是分支。

1
git push GitTest master

上面的命令可以把本地库中的 master 分支推送到远程库 GitTest 中。

确认后会要求输入登录账号和密码,由于 GitHub 要求使用 PATs(Personal access tokens)来登录,所以需要先去官网申请 PAT。

申请完成后将 PAT 复制到账号位置,密码直接回车,就可以推送完成。

如果因为电脑已经记住了别的 token,就需要利用下面的命令来删除保存在计算机上的凭据,然后再次执行Git操作并输入现在的凭据。

1
git config --global --unset credential.helper

拉取远程库到本地库

远程库被更改导致本地库与远程库内容不一样时,就需要拉取远程库到本地库。

先去 GitHub 上对文件进行修改,然后利用 git pull 来拉取。

1
git pull GitTest master

然后显示一下信息:

remote: Enumerating objects: 5, done.

remote: Counting objects: 100% (5/5), done.

remote: Compressing objects: 100% (2/2), done.

remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0

Unpacking objects: 100% (3/3), 663 bytes | 221.00 KiB/s, done.

From https://github.com/CALEB-jiale/GitTest

* branch master -> FETCH_HEAD

304c11e..167ea30 master -> GitTest/master

Updating 304c11e..167ea30

Fast-forward

hello.txt | 1 +

1 file changed, 1 insertion(+)

表示 1 个文件被修改,新增了 1 行内容。

克隆远程仓库到本地库

在本地新创建一个文件夹,取名为 GitClone,在终端中打开并利用 git init 将其初始化。

要想克隆代码,先得拿到代码的链接,同样是之前的 HTTPS 和 SSH 链接。

克隆公共库的代码不需要登陆账号。

1
git clone https://github.com/CALEB-jiale/GitTest.git

然后得到以下信息:

Cloning into ‘GitTest’…

remote: Enumerating objects: 21, done.

remote: Counting objects: 100% (21/21), done.

remote: Compressing objects: 100% (10/10), done.

remote: Total 21 (delta 4), reused 17 (delta 3), pack-reused 0

Receiving objects: 100% (21/21), done.

Resolving deltas: 100% (4/4), done.

然后利用 ls 命令可以查看 GitClone 文件下多了个 GitTest 文件,该文件内甚至还有 .git 文件。

这意味着 clone 命令会做以下 3 个操作:

  1. 拉取代码
  2. 初始化本地库
  3. 创建别名

利用 cd 命令进入恐龙下来的文件当中,然后利用 git remote -v 查看他的远程库信息,可以看到:

origin https://github.com/CALEB-jiale/GitTest.git (fetch)

origin https://github.com/CALEB-jiale/GitTest.git (push)

它起的别名为 origine。

团队合作

现在假设老白和小白在同一个团队内,小白克隆了远程库并进行修改。

在克隆下的文件中利用 vim 命令进入文件,利用 i 进入修改模式,修改后按 esc 然后利用 :wq 保存修改。

然后添加暂存区、添加本地库。

1
2
3
vim hello.txt
git add hello.txt
git commit -m 'clone commit'

然后我们希望利用 push 来把修改推送到远程库,但会发现需要登陆。

此时登陆小白的账号,但会发现仍然报错,因为小白的账号没有权限进行推送。

此时需要登陆老白的账号,把小白邀请进团队中。

具体方法是进入远程库,进入 Settings,进入 Manage access,然后 Invite a collaborator,然后搜索对方账号并邀请。

回到 Manage access,会看到被小白的信息,后面有一个 Pending Invite,把那个链接复制下来,发送给小白。

然后小白登陆账号,查找刚才收到的链接,然后接受邀请。

此时重新利用 push 命令进行推送即可成功。

跨团队协作

当团队外的人(取名为湘玉)想修改老白团队内的文件,就首先须来找到远程库,然后点击右上角的 Fork 按钮,之后会发现在湘玉的账号下面会有个新的文件,该文件为老白的文件。进入该文件可以看到左上角显示这份文件是从老白的团队里 Fork 过来的。

然后湘玉可以在线编辑代码或把代码克隆到本地库进行编辑。

但湘玉的修改还不能被老白他们看到,要想让他们看到,需要湘玉在自己的文件上方点击 Pull requests,然后 New pull request,然后 Creat pull request。

创建完毕后,老白那边就可以在 Pull requests 找到湘玉发来的请求,点击下面的链接文件,就可以看到湘玉写的代码。如果有疑问,也可以在刚才的地方聊天交流。

如果老白认为湘玉的代码不错,就可以点击下面的 Merge pull request,然后确认合并。

之后在老白那边就可以看到修改后的代码。

常见问题处理

本地库与远程库冲突

假设本地库和远程库有共同的版本 A,后来本地库在本地经过修改成为了版本 B,远程库被修改为版本 C,此时需要合并分支。

1
2
3
4
5
git fetch upstream
git checkout master
git merge upstream/master
git commit -m "Merge with upstream/master"
git push origin master

首先利用 fetch 命令获取远程库的更改,然后利用 checkout 命令跳转到要合并的分支上(如果就在这个分支上就不用跳转),最后利用 merge 命令进行合并。合并结束后把更改提交并推送。

如果有文件发生冲突,则打开对应的文件就可以进行手动合并。

fork 项目与原项目冲突

假设从 GitHub 上 fork 了一个项目,并对它进行了更改,原项目也进行了更新,我们希望获取原项目的更新,但这个更新与我们的更改发生了冲突。此时可以进行下面的操作:

1
2
3
4
5
6
7
8
git checkout -b branch-merge-conflict
git remote add upstream https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY.git
git fetch upstream
git checkout master
git merge upstream/master
git add .
git commit -m "Resolved merge conflicts"
git push origin

这里 master 是我们原有的本地库,branch-merge-conflict 是新创建的本地库,origin 是原有的远程库,upstream 是新添加的远程库。

我们先利用 git checkout -b branch-merge-conflict 创建一个新的分支,这个分支相当于一个保险,保存我们现在的版本(其实可以不用这么做)。

接着,在新创建的分支上添加原版项目作为新的远程库。如果上一步没有创建新的分支,也可以直接在原来的分支上添加新的远程库,这样原来的分支上就会有两个远程库,一个是我们自己的 fork 来的库,一个是原版项目的库。

然后,使用 fetch 命令从原版项目(新添加的远程库)获取最新的改动。

之后就是常规的合并分支的操作。