一、git安装以及初始化配置
1、在使用git之前,需要进入官网创建一个账号,以便后面的学习。
2、安装好git,点击桌面图标git bash,进入到Git的命令行工具,使用命令
1 $ git config --global user.name "Your Name"
2 $ git config --global user.email "email@example.com"
3、git类似一个小型的linux操作系统,所有有些命令在git上也是支持的。列如(mkdir,cat,pwd,vi等待)
4、git区域划分神图
二、创建版本库
1、创建目录learngit
1 $ mkdir learngit
2 $ cd learngit
3 $ pwd
4 /learngit
注意:根目录为Git的安装目录
2、将learngit目录变为git可管理的仓库
1 $ git init
2 Initialized empty Git repository in D:/Git/learngit/.git/
瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),细心的读者可以发现当前目录下多了一个.git
的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。
如果你没有看到.git
目录,那是因为这个目录默认是隐藏的,用ls -ah
命令就可以看见。
3把文件添加到版本库
注意:使用window系统的童鞋们,尽量不要使用系统附带的记事本开发,可能会出现编码格式的问题,可以采用Eitplus等软件(将编码格式改为UTF-8)
编写一个readme.txt文件,内容如下:
Git is a version control system.
Git is free software.
1、将文件添加到暂存区
1 $ git add readme.txt
2、将文件添加到本地库
1 $ git commit -m "wrote a readme file"
2 [master (root-commit) e3f4b5b] wrote a readme file
3 1 file changed, 2 insertions(+)
4 create mode 100644 readme.txt
简单解释一下git commit
命令,-m
后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。
嫌麻烦不想输入-m "xxx"
行不行?确实有办法可以这么干,但是强烈不建议你这么干,因为输入说明对自己对别人阅读都很重要。
git commit
命令执行成功后会告诉你,1 file changed
:1个文件被改动(我们新添加的readme.txt文件);2 insertions
:插入了两行内容(readme.txt有两行内容)。
注意:
利用vi、及vim进行操作后,使用git add readme.txt进行提交时可能会出现错误!
warning: LF will be replaced by CRLF in readme.txt.
The file will have its original line endings in your working directory
解决方案:
1 $ git config --global core.autocrlf false
三、时光机穿梭
这部分的内容参考廖雪峰的官方网站
里面的内容非常详细,希望读者仔细观看!在这里我只是针对性的说明。
1、版本回退
- git staus 查看仓库的当前状态
- git diff 查看文件修改的内容
- git log 显示从最近到最远的提交日志
- git log
--pretty=oneline 精简内容
- git reset --hard HEAD^ 回退到上一个版本
- git reset --hard HEAD^^ 回退到上上一个版本
- git reset --hard HEAD~2 回退到上上一个版本
- git reset --hard
commit id(一般值输入前7位数据就行)
- git reflog 用来记录你的每一次命令
2、工作区和暂存区
工作区(Working Directory)
就是你在电脑里能看到的目录,比如我的learngit
文件夹就是一个工作区:
版本库(Repository)
工作区有一个隐藏目录.git
,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master
,以及指向master
的一个指针叫HEAD
。
3、管理修改
注意:Git管理的是修改,而不是文件!
列如:
第一次修改 -> git add
-> 第二次修改 -> git commit
你看,我们前面讲了,Git管理的是修改,当你用git add
命令后,在工作区的第一次修改被放入暂存区,准备提交,但是,在工作区的第二次修改并没有放入暂存区,所以,git commit
只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交。
提交后,用git diff HEAD -- readme.txt
命令可以查看工作区和版本库里面最新版本的区别
4、撤销修改
注意:(执行这些操作必须要)
命令git checkout -- readme.txt
意思就是,把readme.txt
文件在工作区的修改全部撤销,这里有两种情况:
一种是readme.txt
自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt
已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
git reset HEAD <file>
可以把暂存区的修改撤销掉(unstage),重新放回工作区
git reset
命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD
时,表示最新的版本
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file
。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>
,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
5、删除文件
一般情况下,你通常直接在文件管理器中把没用的文件删了,或者用rm
命令删了:
现在你有两个选择,一是确实要从版本库中删除该文件,那就用命令git rm
删掉,并且git commit
四、远程仓库
1、添加远程仓库
要关联一个远程库,使用命令git remote add origin git@github.com:lilong1314520/learngit.git(把lilong1314520换成自己的账号)
关联后,使用命令git push -u origin master
第一次推送master分支的所有内容
把本地库的内容推送到远程,用git push
命令,实际上是把当前分支master
推送到远程。
由于远程库是空的,我们第一次推送master
分支时,加上了-u
参数,Git不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取时就可以简化命令。
2、克隆远程仓库
git clone git@github.com:lilong1314520/learngit.git
五、分支管理
1、创建于合并分支
1 $ git branch dev 创建dev分支
1 $ git checkout dev 切换到dev分支
1 $ git checkout -b dev 创建分支并切换到dev
1 $ git branch 查看所有分支,当前分支前面会标一个*
号
1 $ git merge dev 合并指定分支到当前分支
1 $ git branch -d dev 删除dev
分支
1 $ git checkout master 切换到主分支
2、解决冲突
1 $ git log --graph --pretty=oneline --abbrev-commit 查看分支的合并情况
解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交
3、分支策略管理
通常,合并分支时,如果可能,Git会用Fast forward
模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward
模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
准备合并dev
分支,请注意--no-ff
参数,表示禁用Fast forward
:
1 $ git merge --no-ff -m "merge with no-ff" dev
相比较而言,使用Fast forword模式:
所有实际当中的模式:
4、Bug分支
Git还提供了一个stash
功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:
1 $ git stash
查看保存的进度
1 $ git stash list
恢复进度
一是用git stash apply
恢复,但是恢复后,stash内容并不删除,你需要用git stash drop
来删除;
另一种方式是用git stash pop
,恢复的同时把stash内容也删了:
5、Feature分支
1 $ git branch -D feature-vulcan 如果要强行删除,需要使用大写的-D
参数
6、多人协作
1 $ git remote 查看远程库的信息
1 $ git remote -v 显示更详细的信息
如果使用git remote没有任何反应,则是因为没有与远程仓库进行关联!关联后即可看见信息。
1 $ git push origin master 推送主分支
1 $ git push origin dev 推送支分支
-
master
分支是主分支,因此要时刻与远程同步; -
dev
分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步; -
bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
-
feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
抓取分支:
1 $ git checkout -b dev origin/dev 创建远程origin
的dev
分支到本地
1 $ git pull 最新的提交从origin/dev
抓下来
1 $ git branch --set-upstream-to=origin/dev dev 设置dev
和origin/dev
的链接
因此,多人协作的工作模式通常是这样:
-
首先,可以试图用
git push origin <branch-name>
推送自己的修改; -
如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并; -
如果合并有冲突,则解决冲突,并在本地提交;
-
没有冲突或者解决掉冲突后,再用
git push origin <branch-name>
推送就能成功!
如果git pull
提示no tracking information
,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>
。
这就是多人协作的工作模式,一旦熟悉了,就非常简单。
7、Rebase
1 $ git rebase 提交历史“整理”成一条直线
-
rebase操作可以把本地未push的分叉提交历史整理成直线;
-
rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
六、标签管理
1、创建标签
1 $ git tag v1.0 默认标签是打在最新提交的commit上的
1 $ git tag 查看所有标签
1 $ git tag v0.9 f52c633 历史提交
1 $ git show v0.9 查看tag信息
1 $ git tag -a v0.1 -m "version 0.1 released" 1094adb 创建带有说明的标签,用-a
指定标签名,-m
指定说明文字
2、操作标签
1 $ git tag -d v0.1 删除tag
1 $ git push origin v1.0 推送tag
1 $ git push origin --tags 一次性推送tag
1 $ git tag -d v0.9 删除远程tag
2 $ git push origin :refs/tags/v0.9
七、自定义Git
1、忽略特殊文件
在Git工作区的根目录下创建一个特殊的.gitignore
文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。
不需要从头写.gitignore
文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览:https://github.com/github/gitignore
忽略文件的原则是:
- 忽略操作系统自动生成的文件,比如缩略图等;
- 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的
.class
文件; - 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
.gitignore文件大致内容:
# Windows:
Thumbs.db
ehthumbs.db
Desktop.ini
# Python:
*.py[cod]
*.so
*.egg
*.egg-info
dist
build
# My configurations:
db.ini
deploy_key_rsa
最后一步就是把.gitignore
也提交到Git,就完成了!当然检验.gitignore
的标准是git status
命令是不是说working directory clean
。
使用Windows的童鞋注意了,如果你在资源管理器里新建一个.gitignore
文件,它会非常弱智地提示你必须输入文件名,但是在文本编辑器里“保存”或者“另存为”就可以把文件保存为.gitignore
了。
1 $ git add -f App.class 可以用-f
强制添加到Git
1 $ git check-ignore 检查规则
2、配置别名
1 $ git config --global alias.st status st
就表示status
1 $ git config --global alias.unstage 'reset HEAD' 既然是一个unstage操作,就可以配置一个unstage
别名
配置Git的时候,加上--global
是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。
配置文件放哪了?每个仓库的Git配置文件都放在.git/config
文件中
本文摘选自:Git教程-廖雪峰的官方网站