本片博客纯属个人学习总结用,如果想学入门的完整内容请移步到廖雪峰的官方网站查找GIT教程
1.GIT是什么
git是目前版本管理工具中最先进的分布式版本控制系统,从人工管理文档的版本转变成程序来管理文档的版本,并且可以查文档的历史版本进行相应的回滚操作
2.GIT安装
在linux系统安装根据实际的版本进行,本人用的是centos使用 yum install git 命令。其他版本可以通过官网的源码进行安装,源码解压后进入对应的目录,依次进行一下操作 ./config ,make,sudo make install 这几个命令就可以安装好GIT.
在Windows上使用Git,可以从Git官网直接下载安装程序,(网速慢的朋友请移步国内镜像),然后按默认选项安装即可。
安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!
3.配置全局初始信息
在linux系统的命令行或者windows版本的Git Bash中输入下面命令进行配置用户名和用于的邮箱地址。
$ git config --global user.name "you name";
$ git config --global user.email "[email protected]";
注意 git config 命令的 --global 参数,用了这个参数,表示你这台机器上所有的GIT仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
4.创建版本库
什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被GIT管理起来,每个文件的修改,删除,GIT都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以"还原".创建一个版本库非常简单。首先,选择一个合适的地方,创建一个空目录.然后用git init 命令把这个目录变成GIT可以管理的仓库
$ mkdir learngit
$ cd learngit
$ pwd
/user/data/learngit
$ git init
Initialized empty Git repository in /user/data/learngit/.git/
输入上述命令后就完成了GIT的仓库创建,而且提示当前仓库是为空仓库(empty Git repository),当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。
5.提交一次内容
在上述步骤创建的仓库文件夹里增加一个readme.txt文件,内容根据喜欢随意填写,把一个文件放到Git仓库只需要两步
第一步,用命令git add 告诉GIT,把文件添加到仓库:-f 参数可以无视文件过滤规则强行添加管理文件
$ git add readme.txt
执行上述命令没有任何输出信息表示添加成功,Unix的哲学是“没有消息就是好消息”。
第二步,用命令git commit 告诉GIT,把文件提交到仓库
$ git commit -m "第一次提交内容"
[master (root-commit) eaadf4e] wrote a readme file
1 file changed, 2 insertions(+)
create mode 100644 readme.txt
上述命令中git commit 命令,-m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的这样你就能从历史记录里方便地找到改动记录,其中可以多次使用git add 不同的文件,而只需commit一次就可以提交前面git add的所有文件,如下
$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."
6.工作区,版本库(Respository)/暂存区概念
工作区 : 就是我们电脑中的某个目录,上面提到用git init初始化的目录就是一个工作区
版本库(Repository) : 工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
Git版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD
前面提到的把文件往Git版本库里添加的时候,需要分两步执行:
第一步是用git add把文件添加到进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际就是把暂存区的所有内容提交到当前分支。
创建Git版本库是,Git自动为我们创建了唯一一个master分支,所以,现在git commit就是往master分支上提交更改。
Git跟踪并管理的是修改,而非文件,比如:第一次修改-->git add-->第二次修改-->git commit。但使用git add命令后,在工作区的第一次修改被放入暂存区,准备提交,但是在工作区的第二次修改并没有放入暂存区,所以git commit只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交。提交后
7.常用命令
GIT命令都是以 git 开头后面加对应的参数
常1: git status 用于查看当前仓库的状态,其中包括文件是否被add,被添加后是否需要提交,如果不提交会提示如何回撤文件等等信息
常2: git diff 文件名 查看文件修改内容,如果不指定版本的对比的内容,比对的就是文件和暂存区和仓库对应的文件进行对比,对比顺序先是暂存区然后才是仓库。如果要强制和仓库的文件对比的话可以使用git diff HEAD filename就可以和仓库进行对比。
常3:git log --pretty=oneline -- --graph --abbrev-commit 显示时间倒序的文档提交日志,其中最前面一大串类似字符其实是commit id 这个提交ID可用于后面说到的版本回退功能,--graph
参数可以看到分支合并图
常4: git reset 可以回退版本,也可以回退add到暂存区的文件(git reset HEAD <file>),这个命令主要还是用于回退整体版本用,其中使用 git reset --hard HEAD^ 表示回到上一个版本,其中HEAD表示当前版本,HEAD^表示上个版本,不过建议最好使用上面提到的commit id来进行版本回退,即命令为 git reset --hard 1094a 其中commit id可以不全部提供,git会自动去找,最好多几位不然找到多个版本就无法确定是那个版本了,其中--hard参数是让版本回归到文件未更改的情况,如果不加--hard 参数版本回退后,git status 可以查看回退前你改过的文件,还会提示你有文件需要提交
常5: git reflog 记录操作版本的每一次命令,里面的commit id 可以用来提供你回退任意一个版本,不只是之前的版本。
常6: git checkout -- filename 意思就是,把filename文件在工作区的修改全部撤销,其中 -- 这个参数最好是加上,不然如果文件名称和分支名称相同的话这个命令就是切换分支的命令,所以 -- 最好加上,撤销修改这里有两中情况:
一种是filename自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是filename已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
就是让这个文件回到最近的一次git commit或者git add时的状态
常7: git rm filename 删除工作区内容的文件和手动删除工作区的文件效果相同,删除后需要commit操作才可以提交删除的文件
以下是远程仓库相关的命令
在github完整注册一个帐号后,根据官方提示创建一个仓库用于后面的学习。
常8: ssh-keygen -t rsa -C "[email protected]" 这个命令用于生成SSH远程传输使用。因为本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以需要创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,在看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果没有打开Shell(windows下打开Git Bash),运行上面的命令在用户主目录即可找到id_rsa和id_rsa.pub文件,这两个文件就是SSH Key的密钥对,id_rsa是私钥,不能泄露出去。id_rsa.pub是公钥,可以告诉任何人。其中id_rsa.pub可以用于github里的SSH KEYS设置页面设置你的公钥,用于后面远程提交内容。
常9: git remote add origin git@server-name:path/repo-name.git 这个命令用于将已经初始化好的仓库关联一个远程仓库,其中origin是默认远程名称,可以修改成你想要的名称标识远程库
git remote rm origin 这个命令用于删除关联的远程仓库,origin是默认远程名称,可以修改成你想要的名称标识远程库
常10: git push origin -u [master | localbranch:remotebranch] 第一次推送master分支的所有内容,其中-u参数表示的把本地master分支内容推送远程新的master分支,并且把本地的master分支和远程的master分支关联起来。第一次使用-u参数后,后面推送内容可以不加该参数,origin是默认远程名称,可以修改成你想要的名称标识远程库
常11: git clone [email protected]:lyn/gitskills.git 用于从远程仓库克隆一份项目到本地环境,本地环境的目录可以是一个没有初始化的目录。克隆项目的同时会初始化目录。
以下内容关于分支操作
常12: git branch 用于查看当前工作目录下的所有分支信息
常13: git branch <branchname> 创建指定名称的项目分支
常14: git checkout <branchname> 切换到指定名称的分支上
常15: git checkout -b <branchname> 创建分支并切换到分支上相当于git branch branchname+git checkout branchname
常16: git merge <branchname> 合并指定名称分支到当前分支上,其中如果合并的时候加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward 合并就看不出来曾经做过合并
常17: git branch -d <branchname> 删除指定名称的分支
常18: git branch -D <branchname> 强行删除指定名称的分支
以下内容关于暂停现有所有操作
常19: git stash 用于把当前正在修改的内容“储藏”起来,等以后恢复储藏的内容继续工作,命令使用后当前未修改会
全部储藏起来,此时的工作区git status会显示无任何修改操作。
常20: git stash list 显示所有被储藏起来的工作内容用于恢复之前已经修改的操作
常21: git stash apply [stash@{0}|stash@{n}] 恢复之前的储藏起来的工作,但是stash内容不会被删除。
常22: git stash drop [stash@{0}|stash@{n}] 用于删除储藏起来的工作
常23: git stash pop [stash@{0}|stash@{n}] 作用等于 apply + drop
以下命令承接上面远程仓库的内容
常24:git remote 查看远程库的信息,加参数 -v就可以查看拉取和推送的地址
常25:git checkout -b dev origin/dev 创建拉取远程仓库origin的dev分支内容到本地,如果本地目录是未初始化,会对目录进行 初始化;
常26:git branch dev --set-upstream-to=origin/dev 设置远程仓库的dev项目关联本地的dev
常27: git pull 拉取远程仓库的内容到本地,也用于更新远程最新的修改,另外的作用是如果推送失败,远程分支比本地分支 新,需要通过这个命令来拉取更新和合并内容,如果有冲突必须解决冲突才能提交。
常28: git rebase 操作可以把本地未push的分叉提交历史整理成直线(git log --grap --pretty=oneline)查看,目的是使得查看 历史提交的变化时更容易,因为分叉的提交需要三方对比.
常29: git push origin --delete remotebranchname 删除远程分支remotebranchname
以下内容关于提交历史加上标签,用于方便查找历史,和备注不一样,标签是可以用于直接显示某个提交点及相关详细内容
常30:git tag tagname [commit id] 用于新建一个标签,默认指向当前提交点HEAD,也可以指定一个commit id;
用法:git tag -a tagnme -m "备注内容" commit id 其中的-a 是指定标签名,-m 指定说明文字;
用法:git tag 查看所有的标签
用法:git tag -d tagname 删除标签
推送到远程仓库可以使用git push origin tagname 或者一次性推送所有未推送到远程的标签 git push origin --tags 这里两个 推 送都是推送修改,新增和删除都属于修改。
常31:git show tagname 查看标签对应的提交的详细内容
一下内容是关于自定义git操作内容
.gitignore 文件用于不参与git管理的文件过滤规则,该文件本身也需要放到版本库中,并且可以对这个文件进行版本管理。这个文件内使用正则表达式或者普通文本来表示需要过滤不管理的文件一般忽略文件的原则是
1.忽略操作系统自动生成的文件,比如缩略图等;
2.忽略编译生成的中间文件,可执行文件等,就是如果一个文件是通过另外一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译生成的 .class文件;
3.忽略敏感的配置文件,比如存放口令的配置文件。
配置可参考:https://github.com/github/gitignore
用例:.gitignore配置内容
# Compiled class file
*.class
# Log file
*.log
查看文件是否被过滤可以使用
常32:git check-ignore -v App.class 用于查看文件是否被文件过滤规则过滤,不增加到git管理中
以下内容关于配置信息常用内容
命令别名的使用
git config --global alias.last 'log -1' 其中的 -global 参数是全局变量表示所有仓库都可以用这个配置,去掉就表示当前仓库是使用该命令 ,last 表示的内容是 log -1;
当在命令行输出 git last = git log -1 效果
其他配置信息可以根据git config 双击tab键可以查看可配置的内容;
配置的git的配置文件有2个存放地点,一个是全局的放在用户主目录下的一个隐藏文件.gitconfig中;还有就是每个仓库的都有个仓库独用的配置文件存放在.git/config文件中。两个配置文件都可以删除和重建,也可以从别的地方复制一份配置文件,以供使用