git 知识汇总补充
Git的分支功能可以支持同时进行多个功能的开发和版本管理。
查看分支情况
- 查看当前分支和本地分支
1 | git branch |
- 查看远程分支
1 | git branch -r |
- 查看所有分支
1 | git branch -a |
创建本地分支
- 直接创建本地分支
1 | git branch issue3 |
- 切换分支
1 | git checkout issue3 |
- 创建并切换本地分支
1 | git checkout -b issue3 |
合并分支
使用如下命令合并分支,如果目前是在issue3分支,首先需要切换到master分支,然后再合并issue3分支到master分支
1 | git checkout master |
除了merge命令外,还有一种命令可以合并分支,那就是rebase,更多内容可以查看:分支的合并
删除分支
1 | git branch -d issue3 |
删除远程分支
1 | git push origin --delete add-license-1 |
注意:删除远程分支不使用git branch -d,而是使用git push origin –delete命令
但是,当远程仓库没有该分支时,或者在本地使用git branch -r能够看到远程仓库名,但远程仓库却已经不存在时,使用上面删除远程分支,会出现如下错误:
1 | error: unable to delete 'xxx': remote ref does not exist |
这时候需要我们更新本地仓库的远程仓库列表信息,命令如下:
1 | git fetch --prune |
之后,再使用命令 git branch -r 查看,就会发现最新的远程仓库列表信息
添加标签
首先运行如下命令,查看commit id,
1 | git log |
运行如下命令添加标签
1 | git tag 1.0.0 c584a15bd2 |
其中,1.0.0为标签,版本号,c584a15bd2为commit id,只要唯一即可。
查看标签
1 | git tag -n |
删除标签
1 | git tag -d <tagname> |
提交本地分支 issue3 到远程分支 dis
1 | # issue3 表示本地分支 |
如果远程分支不存在,则自动创建一个分支
删除远程分支 dis
1 | git push -u origin :dis |
自建 git 托管服务器
这里以 Ubuntu 为例
首先,需要有一个 vps 服务器,假设 IP 地址是 1.14.1.14
其次,在服务器上增加用户和组,比如添加 jinzhongxu 用户
1 | adduser jinzhongxu |
然后,安装git命令
1 | sudo apt update && sudo apt install git |
最后,建立远程仓库
1 | git init --bare monkey.git |
把远程仓库克隆到本地
1 | git clone jinzhongxu@1.14.1.14:/home/jinzhongxu/monkey.git |
远程仓库
当从远程仓库克隆后,git默认远程仓库名为origin,并将远程的master分支与本地的master分支对应。查看远程仓库名称使用如下命令
1 | git remote |
or
1 | git remote -v |
将显示更多信息,不仅有远程仓库名称,还有fetch和push的远程仓库地址。当没有push权限时,将不显示push地址。
多人协作开发提交
当克隆远程仓库到本地,一般是master分支,产品版本分支,该分支是主分支,时刻与远程仓库同步;除此之外,开发人员在本地还会创建dev分支、bug分支和feature分支。其中dev分支是开发分支,团队开发人员开发分支,重大版本迭代时merge到主分支,一般也需要时刻与远程dev分支同步;bug分支是本地修复bug的分支,一般不进行远程同步;feature分支同步取决于团队需要。该小节可参考:多人协作
leader或首位开发者在本地master分支外使用如下命令创建了dev分支,并提交到远程origin仓库
1
2
3
4
5在本地创建dev分支,并切换到dev分支,进行开发
git checkout -b dev
推送本地dev分支到远程仓库origin,并同时在远程仓库origin创建dev分支
git push origin dev第二位开发人员首先克隆远程开发仓库到本地,然后在本地增加远程origin/dev分支到本地dev分支
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24克隆远程origin仓库到本地机器
git clone jinzhongxu@1.14.1.14:/home/jinzhongxu/monkey.git
查看分支情况,特别是远程,发现远程仓库origin除了有master分支,还有分支origin/dev
git branch -a
//* master
// remotes/origin/HEAD -> origin/master
// remotes/origin/dev
// remotes/origin/master
将远程仓库origin的dev分支增加到本地,并切换到本地dev分支
git checkout -b dev origin/dev
查看本地分支信息
git branch
//* dev
// master
该开发人员进行了本地开发,并在dev分支增加部分代码,然后提交到远程仓库origin的dev分支
git status
git add .
git commit -m "repair bug"
git status
git push origin dev:dev第三位开发人员也同样和第二位开发人员一样,下载了远程仓库origin的master分支和dev分支,并同时进行开发
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52克隆远程origin仓库到本地机器
git clone jinzhongxu@1.14.1.14:/home/jinzhongxu/monkey.git
查看分支情况,特别是远程,发现远程仓库origin除了有master分支,还有分支origin/dev
git branch -a
//* master
// remotes/origin/HEAD -> origin/master
// remotes/origin/dev
// remotes/origin/master
将远程仓库origin的dev分支增加到本地,并切换到本地dev分支
git checkout -b dev origin/dev
查看本地分支信息
git branch
//* dev
// master
该开发人员进行了本地开发,并在dev分支增加部分代码,然后提交到远程仓库origin的dev分支
git status
git add .
git commit -m "repair bug"
git status
但是,使用如下命令在提交时出现问题
git push origin dev:dev
// To 1.14.1.14:/home/jinzhongxu/monkey.git
// ! [rejected] dev -> dev (fetch first)
// error: failed to push some refs to 'jinzhongxu@1.14.1.14:/home/jinzhongxu/monkey.git'
// hint: Updates were rejected because the remote contains work that you do
// hint: not have locally. This is usually caused by another repository pushing
// hint: to the same ref. You may want to first integrate the remote changes
// hint: (e.g., 'git pull ...') before pushing again.
// hint: See the 'Note about fast-forwards' in 'git push --help' for details.
上面的错误提示很明白,那就是团队中已经有人提交的最新更新到远程dev分支,需要先git pull,然后再git push,使用如下命令解决
git pull # 如果失败,可能的原因是没有指定本地dev分支与远程origin/dev分支的链接,可使用右边命令设置dev和origin/dev的链接:git branch --set-upstream-to=origin/dev dev
成功后,出现如下提示,就是需要手动修改冲突,然后,再git push
// remote: Counting objects: 5, done.
// remote: Compressing objects: 100% (3/3), done.
// remote: Total 3 (delta 1), reused 0 (delta 0)
// Unpacking objects: 100% (3/3), done.
// From 1.14.1.14:/home/jinzhongxu/monkey
// 4461cc8..7056c16 dev -> origin/dev
// Auto-merging main.py
// CONFLICT (content): Merge conflict in main.py
// Automatic merge failed; fix conflicts and then commit the result.
git status
git add main.py
git commit -m "repair bugs for xlabel and ylabel"
git push origin dev前面三个过程,特别是2和3,是公司开发时常遇到,并且经常这样的迭代进行。特别是3,我们要经常使用,要熟练掌握。
更改远程仓库的 URL
当远程仓库 IP 地址更改、SSH 和 HTTPS 切换等其他导致远程仓库的 URL 地址发生改变时,需要切换地址,才能够正确提交本地修改的代码等内容上传到远程仓库。
更改远程仓库的 URL 需要使用命令:
1 | git remote set-url |
git remote set-url
命令使用两个参数:
现有远程仓库的名称。 例如,
源仓库
或上游仓库
是两种常见选择。远程仓库的新 URL。 例如:
如果您要更新为使用 HTTPS,您的 URL 可能如下所示:
1
https://github.com/USERNAME/REPOSITORY.git
如果您要更新为使用 SSH,您的 URL 可能如下所示:
1
git@github.com:USERNAME/REPOSITORY.git
将远程 URL 从 SSH 切换到 HTTPS
打开 Terminal(终端)。
将当前工作目录更改为您的本地仓库。
列出现有远程仓库以获取要更改的远程仓库的名称。
1
2
3git remote -v
origin git@github.com:USERNAME/REPOSITORY.git (fetch)
origin git@github.com:USERNAME/REPOSITORY.git (push)使用
1
git remote set-url
命令将远程的 URL 从 SSH 更改为 HTTPS。
1
git remote set-url origin https://github.com/USERNAME/REPOSITORY.git
验证远程 URL 是否已更改。
1
2
3
4git remote -v
Verify new remote URL
origin https://github.com/USERNAME/REPOSITORY.git (fetch)
origin https://github.com/USERNAME/REPOSITORY.git (push)
下次对远程仓库执行 git fetch
、git pull
或 git push
操作时,您需要提供 GitHub 用户名和密码。 When Git prompts you for your password, enter your personal access token (PAT) instead. Password-based authentication for Git is deprecated, and using a PAT is more secure. For more information, see “Creating a personal access token.”
You can use a credential helper so Git will remember your GitHub username and personal access token every time it talks to GitHub.
将远程 URL 从 HTTPS 切换到 SSH
打开 Terminal(终端)。
将当前工作目录更改为您的本地仓库。
列出现有远程仓库以获取要更改的远程仓库的名称。
1
2
3git remote -v
origin https://github.com/USERNAME/REPOSITORY.git (fetch)
origin https://github.com/USERNAME/REPOSITORY.git (push)使用
1
git remote set-url
命令将远程的 URL 从 HTTPS 更改为 SSH。
1
git remote set-url origin git@github.com:USERNAME/REPOSITORY.git
验证远程 URL 是否已更改。
1
2
3
4git remote -v
Verify new remote URL
origin git@github.com:USERNAME/REPOSITORY.git (fetch)
origin git@github.com:USERNAME/REPOSITORY.git (push)
提交时忽略某些文件或文件夹
在仓库主目录下,编写
1 | vim .gitignore |
添加忽略的(或包含的)文件、文件夹。这里以 hexo 部署博客为例:
1 | .DS_Store |
如果出现 !db.json
即表示提交时包含 db.json
.