如果用过mercury(HG),那么理解Git的运作方式就轻松多了。两者是相同的分布式版本管理工具,只是某些功能有着细微的差别 - Git的管理粒度更加细腻,因此操作上也比HG复杂一点。例如,修改文件并提交,hg会自动跟踪到,并不需要你去手动add,但是在git里,无论新增还是修改,都必须add相应的文件才可以commit.这样概念上可以保持一致性(计算机的美学)。
开始
安装和创建版本库:
1 | sudo apt-get install git |
创建全新仓库:
1 | mkdir new_repo |
此时即可创建一个全新的仓库。命令执行后,可以看到.git的隐藏文件夹,这是跟踪版本仓库的数据库。
远程克隆仓库:
1 | git clone git@github.com:homer_simpson/repo_one.git |
执行后会在本地创建同名文件夹repo_one
基本操作:
1 | git reflog # git历史操作 |
分支操作:
GIT管理系统里,每个分支对应一个指针指向当前分支的头部节点,HEAD通过指向分支指针从而指向某一分支的头部节点。
master分支是始终存在的。
如无特殊说明,merge分支优先使用fast-forward模式,如果不能FF,则用普通的merge
merge冲突时,Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,此时直接编辑文件,add 文件并commit1
2
3
4
5
6
7
8
9git branch # 查看分支
git branch <branch name> # 创建分支
git branch -d <branch_name > # 删除分支
git branch -D <branch_name> # 强制删除分支(一般当这个分支没有merge到其他分支而被丢弃时)
git checkout <branch_name> # 切换分支
git checkout -b <branche_name> # 创建分支并切换过去
git merge <branch_name> # 将branch_name merge到当前分支,包括合并文件,add文件+commit
git merge -m "comment" <branch_name> # 为merge的commit添加注释
git merge --no-ff -m "comment" <branch_name> # 禁用ff模式
工作区暂存
1 | git stash // 当前分支的工作区内容暂存起来。此时git status是干净的 |
标签管理
1 | git tag # 查看标签 |
远程协作:
几个基本概念:
远程引用:对远程仓库的引用,用一个名字标识,默认为origin.
远程分支:远端服务器上仓库里的分支。
远程跟踪分支:对远程分支状态的快照,用户不能自己修改,只有clone, fetch或者pull等同步到本地后变更,用于引用远程分支。名字为 remote/branch,例如origin/master
本地分支:本地仓库的分支。
跟踪分支:用于跟踪远程分支的本地分支,一般用于关联远程分支。
一般情况下,如果要远程协作,需要建立远程引用,关联本地跟踪分支到远程跟踪分支。
git clone时,自动创建远程引用,名字为origin;自动创建所有远程跟踪分支,包括origin/master;自动创建本地分支master并关联到origin/master上。git clone -o
git pull 只在当前分支是关联到远程分支上才有效,是git fetch和git merge的封装,只在当前分支上有效。
git remote添加远程引用的情形,所有工作都要自己完成。
所有的分支都是指针,并不是某一个changeset链条的实体,因此某一个“分支”可以自由指向任意链条,或者跟踪远程分支。
可以远程引用多个仓库,仓库名不同,这样fetch到本地后,多个仓库的远程跟踪分支可以共存。自己推动也可以指定任意仓库来推送。分支只是指针,如果多个仓库的changeset有交集,那么本地只有一份changeset链条拷贝,多个仓库的同名分支指向不同的结点。
查看远程分支信息
1 | git remote # 查看本地已有的远程引用 |
本地仓库关联远程仓库(非clone)
1 | git remote add origin git@github.com:homer_simpson/repo_one.git # 创建远程仓库名字,即表示创建本地仓库和远程仓库的连接。origin是约定俗成的远程仓库的名字 |
本地新分支推送到远端(跟踪关系自动建立)
1 | git push origin serverfix # 推送本地分支更新,或本地新分支到仓库上 |
对远端新分支建立本地跟踪分支
1 | git fetch origin # 先获取远程新分支 |
拉取推送
1 | git pull # git fetch + git merge,必须是跟踪分支 |
删除远程分支
1 | git push origin --delete serverfix |
Git系统配置
1 | git config --global user.name "Your Name" #设置名字 |
可在根工作区创建.gitignore,配置GIT不跟踪的文件,但是可用命令git add -f <file_name>强行添加, git check-ignore -v <file_name>可以检查当前文件是否被过滤。
.git/config保存全局配置。