分支的管理
查询分支的信息,注意结果中带星号的是当前分支,也就是说HEAD指向的分支
$ git branch
* master
testing
查看每个分支的最后一次提交
$ git branch -v
* master 4416a2c [ahead 6] fix conflict
testing 7957b99 changed by testing branch
查看已经合并的分支
$ git branch --merged
* master
testing
查看未合并的分支,因为所有分支都合并过了, 所以这个查询结果是空的
$ git branch --no-merged
如果想删除没有合并的分支, 使用branch -d会出现错误。强制删除可以使用branch -D命令
远程分支
在克隆了一个远程仓库或者从远程仓库拉取最新版本后,git会在本地为用户建立一个和远程一样的分支,并且也会在本地保存远程分支的状态。这样,如果再本地分支修改后,想要回到刚刚克隆下来时的版本,git可以参照本地保存的远程分支的状态返回那时的版本。
远程分支被他人改动后,如果想把最新的版本取到本地,可以使用fetch命令。
$ git fetch origin
之前介绍过,fetch命令是不会自动把远程的文件合并到本地文件的。也就是说同名的本地文件和远程文件内容不一致,它是不会把远程文件合并到本地文件的。
推送
把本地更改好并且提交的文件推送到远程仓库中,可以使用push命令。push命令的一般形式是git push (remote) (branch),这里的(remote)其实是在克隆远程仓库时,git默认为这个远端仓库取名为origin。如下面的示例。
$ git push origin master
Enumerating objects: 13, done.
Counting objects: 100% (13/13), done.
Delta compression using up to 4 threads
Compressing objects: 100% (8/8), done.
Writing objects: 100% (12/12), 1.05 KiB | 53.00 KiB/s, done.
Total 12 (delta 3), reused 0 (delta 0)
remote: Resolving deltas: 100% (3/3), done.
To https://github.com/Kutilion/GitTestProject.git
6e2fa09..4416a2c master -> master
如果示例的命令变为git push origin master:testing,则表明将本地master分支推送到远程分支testing上。区别只是远程和本地的分支名字不一样。
跟踪分支
上边提到,拉去远程分支后,会在本地保存远程分支的状态,其实是在本地创建了一个跟踪分支,用于跟踪远程分支。本地的分支通过跟踪分支来与远程分支进行交互。使用如下命令可以让本地分支跟踪远程分支
$ git checkout --track origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Switched to a new branch 'serverfix'
希望本地分支的名字和远程分支不一样,但是还希望本地分支跟踪远程分支可以用
$ git checkout -b sf origin/serverfix
Branch sf set up to track remote branch serverfix from origin.
Switched to a new branch 'sf'
可以看到,本地分支sf,跟踪了远程服务器origin上的serverfix分支。
查看所有分支的跟踪信息可以用branch -vv
$ git branch -vv
* master 4416a2c [origin/master] fix conflict
testing 7957b99 changed by testing branch
可以看到,master跟踪了origin/master分支。这里有可能出现[origin/master: ahead 3, behind 1]这样的结果, 说明本地分支有三个提交没有推送到远程分支, 远端有一个提交没有反应到本地。
拉取
当 git fetch 命令从服务器上抓取本地没有的数据时,它并不会修改工作目录中的内容。 它只会获取数据然后让你自己合并。
然而, git pull 命令在大多数情况下它的含义是一个 git fetch 紧接着一个git merge 命令。 git pull 都会查找当前分支所跟踪的服务器与分支,从服务器上抓取数据然后尝试合并入那个远程分支。
pull有时候回产生一些让人困惑的结果, 所以最好还是使用fetch和merge来明确指定拉去和合并。
删除远程分支
如下的命令会删除远程分支,但是个人更推荐直接到远程分支服务器上去可视化删除,更加安全可控。
git push origin --delete master
变基(rebase)
变基可以完成和merge结果一样的功能。但是它同时带来了不确定性,特别是多人共用远程残酷的情况下,这种不确定性变的更加复杂。 笔者十分不推荐变基操作。如果感兴趣可以自行参照官方文档。
简而言之,变基就是把其他分支改变的版本, 直接合并到主分支,而不会留下其他分支的履历。这样会使主分支查阅起来更加简明。但是一般的正式项目是需要保留所有提交履历的。