Git配置
config文件
/etc/gitconfig文件:系统中对所有的用户都普遍适用的配置。若使用git config —system选项,读写就是这个文件
~/.gitconfig文件:用户目录下的配置文件,只适用于该用户。若使用config —global选项,读写就是这个文件
当前Git仓库的git文件(.git/config),这里配置只对当前项目有效,每个配置级别都会覆盖上层的配置,所以.git/config会覆盖/etc/gitconfig里的文件
在Windows系统上,Git会找主目录下的.gitconfig文件,主目录即$HOME变量指定的目录,一般在C:\Documents and Settings$USER中
此外,Git还会尝试找寻/etc/gitconfig文件,只不过看当初Git装在什么目录,就以此作为根目录来定位
配置用户信息
1 | $ git config --global user.name "loen" |
利用gloabal选项,更改用户主目录下的config文件,以后所有项目都会默认使用这里配置的用户信息
如果要在某个特定项目里使用其他名字或者邮件,只要去掉—global选项重新配置即可,新的设定保存在当前目录的.git/config 文件里
查看配置信息
1 | $ git config --list |
有时候会看到重复的变量名,那就说明它们来自不同的配置文件( 比如/etc/gitconfig和~./gitconfig),不过Git实际采用的是最后一个
也可以在/etc/gitconfig和~./gitconfig里看到
1 | $ vim ~/.gitconfig |
忽略特殊文件.gitignore
有时必须把某些文件放入Git工作目录中,但是又不能将其提交,如存储了数据库密码的配置文件。
只需在Git工作区的根目录下创建一个名为.gitignore的文件,写入过滤规则就可以了
.gitignore不需要从头写,所有配置文件可以直接在线浏览https://github.com/github/.gitignore
忽略文件的原则是:
1.忽略系统自动生成的文件
2.忽略编译生成的中间文件
3.忽略用户带有敏感信息的配置文件
Git工作流程
Git(Global Information Tracker)是一个开源的分布式版本控制系统,是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源代码的软件。
Git一般的工作流程如下:
克隆Git资源作为本地的工作目录
在工作目录上添加或者修改文件
提交修改
可以撤回提交并再次修改
快速入门Git
创建版本库:git init
在本地目录中执行git init,创建一个新的Git仓库FirstGit。.git用于跟踪管理版本库。
添加到暂存区:git add
在FirstGit目录下添加文件README.md
- git status用于查看项目的当前状态,-s表示查看简要信息
- git add命令将其添加到暂存区,也可以使用git add . 用于添加当前目录下的所有文件
改动README.md,再次执行git status
- “AM”状态表示这个文件在被添加到暂存区后进行了修改
- 再次执行git add命令将其添加到暂存区(缓存)
再次改动README.md
- git diff:查看写入缓存与已修改但尚未写入缓存的区别
- git diff —cached:查看已缓存的改动
- git diff HEAD:查看已缓存的与未缓存的所有改动
- git diff —stat:显示摘要而非整个diff
向仓库提交代码:git commit
git add将快照内容写入缓存区,git commit则是将缓存区的内容添加到远程仓库中
- -m 选项表示提交的注释
- 再次执行git status,输出表示在上次提交之后,没有作出任何更改
- 也可以利用git commit -am “lala”来替代git add . 与 git commit -m “lala”
取消已缓存的内容:git reset HEAD
可以看到git add后将README文件添加到了缓存区,利用git reset命令取消了README的缓存,HEAD表示指向的版本为当前版本
删除文件:git rm
- git rm
:从版本库中删除文件 - git rm -f
:从暂存区中删除文件(必须进行强制删除) - git rm —cached
:从暂存区中删除文件,保留工作区中的文件 - git rm -r test:递归删除test目录下的所有目录与文件
回滚: git reset
1 | git reflog |
恢复文件:git checkout
git checkout —file:工作区的文件替换为版本库的文件
移动/重命名:git mv
git mv :用于移动或者重命名一个文件、目录
1 | $ git add README |
远程仓库GitHub
GitHub是一个面向开源及私有软件项目的托管平台,仅支持git作为唯一的版本库格式进行托管。
关联远程仓库
本地创建新的仓库并与GitHub进行关联
1 | git init |
或者将本地已有仓库与之关联
1 | git remote add origin https://github.com/gracekoo/gitlearn.git |
克隆远程仓库
git clone:拷贝一个git仓库到本地,还可以在命令末尾加上自己想要的名字
1 | $ git clone https://github.com/gracekoo/gitlearn.git mygit |
更新数据:git fetch
git fetch:从远程获取最新版本到本地,不会自动merge
1 | $ git checkout issue12 |
(1) 换到issue12分支
(2)从远程的origin的issue12分支下载最新版本到issue12分支上
(3)比较本地issue12分支和origin/issue12分支的差别
(4)将origin/issue12分支合并到issue12
更新数据:git pull
git pull:从远程获取最新版本并merge到本地
1 | $ git checkout issue12 |
Git分支管理
分支原理
执行git init时,缺省情况下Git会创建“master”分支
master指向提交,HEAD指向当前分支
每次提交,master分支都会向前移动一步。当创建新的分支,如dev时,Git新建一个指针dev,指向与master相同的提交,再把HEAD指向dev,表示现在分支在dev上
从现在开始,对工作区的修改和提交就是针对dev分支了,比如一次新提交后,dev指针向前移动一步,而master指针不变
在dev上完成相应的开发后,将其合并到master分支上
基础命令
使用分支意味着从开发主线上分离开,然后在不影响主线的同时继续工作
- 创建新分支new_branch
1 | $ git branch new_branch |
- 切换到新分支new_branch:当切换到新分支时,Git会用该分支的最后提交的快照替换工作目录的内容
1 | $ git checkout new_branch //切换到new_branch |
- 合并分支
1 | $ git merge |
通常Git在合并分支时会用Fast Forward模式,这样删除分支后,会丢失分支信息。
因此在合并分支时可以使用—no-ff,强制禁用Fast Forward模式,这样Git在合并时会生成一个新的commit,然后就可以在历史分支上看到分支信息。
1 | $ git merge --no-ff -m "merge with no-ff" dev2 |
- 删除分支
1 | $ git branch -d new_branch |
- 查看分支
1 | $ git branch |
解决冲突
在两个分支中修改了同一个文件的同一行代码,在合并时就会发生冲突,使用git status可以显示存在冲突的文件和文件名
1 | $ git status |
当发生冲突时,必须手动解决冲突,并再次提交
利用带参数的git log也可以看到合并后的情况
1 | $ git log --graph --pretty=oneline --abbrev-commit |
实际开发中,应该按照以下基本原则来进行分支管理
- master分支应该是非常稳定的,也就是仅用来发布新版本,平时不用于开发
- 团队成员在dev上开发,时不时的往dev上进行合并,等到发布新版本时,再将dev往master上合并
查看远程库信息
当从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了
1 | $ git remote //查看远程库信息,远程仓库默认名字是origin |
推送分支
将本地的master分支推送到远程库origin
1 | $ git push origin master |
将本地的dev2分支推送到远程库origin
1 | $ git push origin dev2 |
拉取分支
将origin最新的提交拉取下来
1 | $ git pull |
关联本地dev分支与远程origin/dev分支
1 | $ git branch --set-upstream dev origin/dev |
回退与撤销
撤销修改:git checkout - - file
把该文件在工作区的修改全部撤销,如果文件修改后还没有放到暂存区,撤销修改就是用版本库里的替代工作区内的。如果文件已经被添加到暂存区,那么撤销修改就是用暂存区里的文件替代当前文件。
总之就是让这个文件回到最近一次git commit或git add时的状态。
1 | git checkout -- file |
历史记录:git log
git log显示从最近到最远的提交日志。
1 | git log |
显示简要的commit历史记录。commit ID用SHA1计算出的16进制表示。
1 | git log --pretty=online |
版本回退:git reset
利用git log来查看当前的历史记录
1 | git log --pretty=online |
使用git reset回退到上一个版本
1 | git reset --hard HEAD^ |
Git中,用HEAD表示当前的版本,上一个版本就是HEAD^,上上个版本就是HEAD^^,前100个版本可以用HEAD~100表示。
如果回退失误,想要改回原来的版本,就必须通过git log命令找到版本的commit id
1 | git log --pretty=online |
假如ID为asdhasdjfnaslkgnsd,利用git reset命令进行版本回退
1 | git reset --hard asdhasdjfnaslkgnsd |
git reflog命令用于显示整个本地库的commit,包括所有branch 的commit,甚至包括已经撤销的commit,只要HEAD发生了变化,就会在reflog中看到。
1 | git reflog |
标签
创建标签:git tag
标签是默认打在最新提交的commit id上的
1 | $ git branch |
1 | $ git tag v1.0 |
也可以直接在某个commit id上打标签
1 | $ git log --pretty=online --abbrev-commit //找到历史的commit id |
也可以创建带有说明的标签:
1 | $ git tag -a v0.9 -m "This is v0.9" |
查看标签
可以使用git tag来查看所有的标签
1 | $ git tag |
查看标签信息
1 | $ git show v0.9 |
删除标签
1 | $ git tag -d v0.9 |
推送标签到远程
推送某个标签到远程
1 | $ git push origin v1.0 |
一次性推送全部尚未送到远程的本地标签
1 | $ git push origin --tags |
如果标签已经推送到远程,要删除远程标签,先从本地删除
1 | $ git tag -d v0.9 |
然后从远程删除
1 | $ git push origin :refs/tags/v0.9 To https://github.com/liming/gitlearn.git |