0%

Git

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
2
$ git config --global user.name "loen"
$ git config --global user.email loen@qq.com

利用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资源作为本地的工作目录

  • 在工作目录上添加或者修改文件

  • 提交修改

  • 可以撤回提交并再次修改

    屏幕快照 2019-08-18 下午9.21.01

快速入门Git

创建版本库:git init

在本地目录中执行git init,创建一个新的Git仓库FirstGit。.git用于跟踪管理版本库。

屏幕快照 2019-08-18 下午9.34.53

添加到暂存区:git add

在FirstGit目录下添加文件README.md

屏幕快照 2019-08-18 下午9.43.56

  • git status用于查看项目的当前状态,-s表示查看简要信息
  • git add命令将其添加到暂存区,也可以使用git add . 用于添加当前目录下的所有文件

改动README.md,再次执行git status

屏幕快照 2019-08-18 下午9.50.02

  • “AM”状态表示这个文件在被添加到暂存区后进行了修改
  • 再次执行git add命令将其添加到暂存区(缓存)

再次改动README.md

屏幕快照 2019-08-18 下午10.04.07

屏幕快照 2019-08-18 下午10.04.47

  • git diff:查看写入缓存与已修改但尚未写入缓存的区别
  • git diff —cached:查看已缓存的改动
  • git diff HEAD:查看已缓存的与未缓存的所有改动
  • git diff —stat:显示摘要而非整个diff

向仓库提交代码:git commit

git add将快照内容写入缓存区,git commit则是将缓存区的内容添加到远程仓库中

屏幕快照 2019-08-18 下午10.18.43

屏幕快照 2019-08-18 下午10.22.09

  • -m 选项表示提交的注释
  • 再次执行git status,输出表示在上次提交之后,没有作出任何更改
  • 也可以利用git commit -am “lala”来替代git add . 与 git commit -m “lala”

取消已缓存的内容:git reset HEAD

屏幕快照 2019-08-18 下午10.47.03

可以看到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
2
git reflog
git reset --hard 5ec6ff1

恢复文件:git checkout

git checkout —file:工作区的文件替换为版本库的文件

移动/重命名:git mv

git mv :用于移动或者重命名一个文件、目录

1
2
3
4
$ git add README
$ git mv README README.md
$ ls
README.md

远程仓库GitHub

GitHub是一个面向开源及私有软件项目的托管平台,仅支持git作为唯一的版本库格式进行托管。

关联远程仓库

本地创建新的仓库并与GitHub进行关联

1
2
3
4
5
git init
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/gracekoo/gitlearn.git
git push -u origin master

或者将本地已有仓库与之关联

1
2
git remote add origin https://github.com/gracekoo/gitlearn.git
git push -u origin master

克隆远程仓库

git clone:拷贝一个git仓库到本地,还可以在命令末尾加上自己想要的名字

1
$ git clone https://github.com/gracekoo/gitlearn.git mygit

更新数据:git fetch

git fetch:从远程获取最新版本到本地,不会自动merge

1
2
3
4
$ git checkout issue12 
$ git fetch origin issue12
$ git log -p issue12..origin/issue12
$ git merge origin/issue12

(1) 换到issue12分支

(2)从远程的origin的issue12分支下载最新版本到issue12分支上

(3)比较本地issue12分支和origin/issue12分支的差别

(4)将origin/issue12分支合并到issue12

更新数据:git pull

git pull:从远程获取最新版本并merge到本地

1
2
$ git checkout issue12
$ git pull origin issue12 // git fetch + git merge

Git分支管理

分支原理

  • 执行git init时,缺省情况下Git会创建“master”分支

  • master指向提交,HEAD指向当前分支

  • 每次提交,master分支都会向前移动一步。当创建新的分支,如dev时,Git新建一个指针dev,指向与master相同的提交,再把HEAD指向dev,表示现在分支在dev上

    WechatIMG265

  • 从现在开始,对工作区的修改和提交就是针对dev分支了,比如一次新提交后,dev指针向前移动一步,而master指针不变

    WechatIMG263

  • 在dev上完成相应的开发后,将其合并到master分支上

    WechatIMG264

基础命令

使用分支意味着从开发主线上分离开,然后在不影响主线的同时继续工作

  • 创建新分支new_branch
1
$ git branch new_branch 
  • 切换到新分支new_branch:当切换到新分支时,Git会用该分支的最后提交的快照替换工作目录的内容
1
2
$ git checkout new_branch //切换到new_branch
$ git checkout -b new_branch //创建并切换到new_branch
  • 合并分支
1
$ git merge

通常Git在合并分支时会用Fast Forward模式,这样删除分支后,会丢失分支信息。

因此在合并分支时可以使用—no-ff,强制禁用Fast Forward模式,这样Git在合并时会生成一个新的commit,然后就可以在历史分支上看到分支信息。

1
2
$ git merge --no-ff -m "merge with no-ff" dev2
$ git log --graph --pretty=oneline --abbrev-commit
  • 删除分支
1
$ git branch -d new_branch
  • 查看分支
1
2
3
$ git branch 
$ git branch -r //查看远程分支
$ git branch -a //查看远程和本地的所有分支

解决冲突

在两个分支中修改了同一个文件的同一行代码,在合并时就会发生冲突,使用git status可以显示存在冲突的文件和文件名

1
$ git status

当发生冲突时,必须手动解决冲突,并再次提交

利用带参数的git log也可以看到合并后的情况

1
$ git log --graph --pretty=oneline --abbrev-commit

实际开发中,应该按照以下基本原则来进行分支管理

  • master分支应该是非常稳定的,也就是仅用来发布新版本,平时不用于开发
  • 团队成员在dev上开发,时不时的往dev上进行合并,等到发布新版本时,再将dev往master上合并

查看远程库信息

当从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了

1
2
3
4
5
$ git remote //查看远程库信息,远程仓库默认名字是origin
origin
$ git remote -v //更详细的信息
origin
https://github.com/asdf2014/algorithm.git

推送分支

将本地的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
2
3
4
5
$ git branch
* dev
master
$ git checkout master
Switch to branch 'master'
1
$ git tag v1.0

也可以直接在某个commit id上打标签

1
2
3
4
5
6
$ git log --pretty=online --abbrev-commit //找到历史的commit id
a923sad1 You is pig
a923sad2 You is cat
$ git tag v0.8 a923sad2 //给You is cat打标签
$ git tag //查看当前标签
v0.8

也可以创建带有说明的标签:

1
$ git tag -a v0.9 -m "This is v0.9"

查看标签

可以使用git tag来查看所有的标签

1
2
$ git tag
v1.0

查看标签信息

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