重新设置user.name和user.email配置变量
$ git config user.name "Tester"
$ git config user.email "helloworld@gmail.com"
新建分支
Git的分支就是保存在.git/refs/heads/命名空间下的引用。引用文件的内容是该分支对应的提交ID。当前版本库中的默认分支master就对应于文件.git/refs/heads/master。
若在GitHub版本库中创建分支,首先要在本地版本库中创建新的分支(即引用),然后用推送命令将本地创建的新的引用连同所指向的提交推送到GitHub版本库中完成GitHub上分支的创建
- 本地版本库中建立新分支mybranch1
创建分支有多种方法,如使用git branch命令,但最为便捷的就是git checkout -b命令,同时完成新分支的创建和分支切换。
$ git checkout -b mybranch1
Switched to a new branch 'mybranch1'
- 为了易于识别,添加一个新文件hello1,并提交。
$ touch hello1
$ git add hello1
$ git commit -m "add hello1 for mark."
[mybranch1 f46a284] add hello1 for mark.
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 hello1
- 通过推送命令,将本地分支mybranch1推送到GitHub远程版本库,完成在GitHub上的新分支创建。
$ git push -u origin mybranch1
Counting objects: 4, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 281 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:gotgithub/helloworld.git
* [new branch] mybranch1 -> mybranch1
Branch mybranch1 set up to track remote branch mybranch1 from origin.
在GitHub上查看版本库,会看到新增了一个分支mybranch1,不过默认分支仍为master
设置默认分支
可以通过Web UI改变GitHub上版本库显示的默认分支.设置了GitHub默认分支后,如果再从GitHub克隆版本库,本地克隆后版本库的默认分支也将改变。
$ git clone git@github.com:yourname/helloworld.git helloworld-nb
Cloning into 'helloworld-nb'...
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 6 (delta 0), reused 6 (delta 0)
Receiving objects: 100% (6/6), done.
$ cd helloworld-nb
$ git branch
* mybranch1
实际上修改GitHub上版本库的默认分支,就是将GitHub版本库的头指针HEAD指向了其他分支,如mybranch1分支。可以从git ls-remote命令看出头指针HEAD和引用refs/heads/mybranch1指向同一个对象的哈希值:
$ git ls-remote origin
4d970f2ac29554d18ae590747e59d47c5f7a0ceb HEAD
1f1a4941c4ca9f83063c0e212de4bc47c69930d8 refs/heads/master
4d970f2ac29554d18ae590747e59d47c5f7a0ceb refs/heads/mybranch1
删除分支
删除当前工作分支会报错。例如下面的命令试图分支mybranch1,但没有成功:
$ git branch -d mybranch1
error: Cannot delete the branch 'mybranch1' which you are currently on.
错误信息显示不能删除当前工作分支。因此先切换到其他分支,例如从GitHub版本库中取出master分支并切换。
$ git checkout master
可以看出新的工作分支为master分支。
$ git branch
* master
mybranch1
现在可以删除mybanch1分支。下面的命令之所以使用-D参数,而非-d参数,是因为Git在删除分支时为避免数据丢失,默认禁止删除尚未合并的分支。参数-D则可强制删除尚未合并的分支。
$ git branch -D mybranch1
Deleted branch mybranch1 (was f46a284).
现在只是本地分支被删除了,远程GitHub服务器上的mybranch1分支尚在。删除远程GitHub版本库中的分支就不能使用git branch命令,而是要使用git push命令.重新访问GitHub的项目管理页面,将缺省分支设置回master分支.
$ git push origin :mybranch1 (冒号前为空)
To git@github.com:yourname/helloworld.git
- [deleted] mybranch1
执行git ls-remote origin命令可以看到GitHub远程版本库已经不存在分支mybranch1。
里程碑管理
里程碑即tag,其管理和分支管理非常类似。里程碑和分支一样也是以引用的形式存在的,保存在.git/refs/tags/路径下。引用可能指向一个提交,但也可能是其他类型(Tag对象)。
- 轻量级里程碑:用git tag <tagname> [<commit>] 命令创建,引用直接指向一个提交对象<commit>。
- 带说明的里程碑:用git tag -a <tagname> [<commit>] 命令创建,并且在创建时需要提供创建里程碑的说明。Git会创建一个tag对象保存里程碑说明、里程碑的指向、创建里程碑的用户等信息,里程碑引用指向该Tag对象。
- 带签名的里程碑:用git tag -s <tagname> [<commit>] 命令创建。是在带说明的里程碑的基础上引入了PGP签名,保证了所创建的里程碑的完整性和不可拒绝性。
下面演示一下里程碑的创建和管理。
- 先在本地创建一个新提交。
$ touch hello1
$ git add hello1
$ git commit -m "add hello1 for mark."
- 本地创建里程碑mytag1、mytag2和mytag3。
$ git tag -m "Tag on initial commit" mytag1 HEAD
$ git tag -m "Tag on new commit" mytag2
$ git tag mytag3
- 查看新建立的里程碑。
$ git tag -l -n1
mytag1 Tag on initial commit
mytag2 Tag on new commit
mytag3 add hello1 for mark.
- 将本地里程碑推送到GitHub远程版本库。
$ git push origin refs/tags/*
Counting objects: 6, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (5/5), 548 bytes, done.
Total 5 (delta 0), reused 0 (delta 0)
To git@github.com:gotgithub/helloworld.git
* [new tag] mytag1 -> mytag1
* [new tag] mytag2 -> mytag2
* [new tag] mytag3 -> mytag3
- 删除本地里程碑。
$ git tag -d mytag3
Deleted tag 'mytag3' (was c71231c)
- 删除GitHub远程版本库中的里程碑。
$ git push origin :mytag3
To git@github.com:yourname/helloworld.git
[deleted] mytag3
查看GitHub上的项目页-> releases,会看到已有两个里程碑