Note on Git - Part 2
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 个操作:
- 拉取代码
- 初始化本地库
- 创建别名
利用 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 | vim hello.txt |
然后我们希望利用 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 | git fetch upstream |
首先利用 fetch
命令获取远程库的更改,然后利用 checkout
命令跳转到要合并的分支上(如果就在这个分支上就不用跳转),最后利用 merge
命令进行合并。合并结束后把更改提交并推送。
如果有文件发生冲突,则打开对应的文件就可以进行手动合并。
fork 项目与原项目冲突
假设从 GitHub 上 fork 了一个项目,并对它进行了更改,原项目也进行了更新,我们希望获取原项目的更新,但这个更新与我们的更改发生了冲突。此时可以进行下面的操作:
1 | git checkout -b branch-merge-conflict |
这里 master
是我们原有的本地库,branch-merge-conflict
是新创建的本地库,origin
是原有的远程库,upstream
是新添加的远程库。
我们先利用 git checkout -b branch-merge-conflict
创建一个新的分支,这个分支相当于一个保险,保存我们现在的版本(其实可以不用这么做)。
接着,在新创建的分支上添加原版项目作为新的远程库。如果上一步没有创建新的分支,也可以直接在原来的分支上添加新的远程库,这样原来的分支上就会有两个远程库,一个是我们自己的 fork 来的库,一个是原版项目的库。
然后,使用 fetch
命令从原版项目(新添加的远程库)获取最新的改动。
之后就是常规的合并分支的操作。