目录
Git是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理,是目前使用范围最广的版本管理工具。
Git 是一个很强大的分布式版本控制系统。它不但适用于管理大型开源软件的源代码,管理私人的文档和源代码也有很多优势。
Windows上安装Git
一般我们工作的电脑都是Windows系统,要使用git首先要进行安装。从软件管家或者其他平台找到git的安装包,下载后默认安装即可。
安装成功之后,可以在开始菜单里面找到git:
或者在桌面右键,也可以看到:
其中GUI为用户界面模式,Bash为命令行模式,这里就以Bash为例子介绍git的基本使用方法(其实相比于GUI,个人觉得Bash更容易学习理解)。
由于git是分布式管理工具,需要输入用户名和邮箱以作为标识,因此,在命令行输入下列的命令:
PS:注意git config --global参数,有了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然你也可以对某个仓库指定的不同的用户名和邮箱,根据个人情况设置。
工作原理
安装好之后,在使用前先来了解一下Git的工作原理,是很有必要的一件事,下面是Git的工作流程和简化原理图:
Git工作流程
Git简化原理图
Git Bash基本用法
Git 常用的是以下 6 个命令:git clone、git push、git add 、git commit、git checkout、git pull,后面我们会详细介绍。
说明:
workspace:工作区
staging area:暂存区/缓存区
local repository:版本库或本地仓库
remote repository:远程仓
一个简单的操作步骤:
$ git init
$ git add .
$ git commit
git init - 初始化仓库。
git add . - 添加文件到暂存区。
git commit - 将暂存区内容添加到仓库中。
创建版本库
版本库就是我们所说的“仓库”,英文名repository,你可以理解为一个目录,这个目录里面的所有文件都可以被Git管理,文件的修改,删除Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻还可以将文件”还原”。
1.创建一个目录, 进入该目录
在Linux下能用的文件操作命令,这里基本也都可以使用;cd d:移动到d:盘下,创建一个目录,我这里叫做firstRepo,通过mkdir firstRepo命令。
2.通过git init命令将这个文件夹变成一个本地的仓库,以后就可以通过Git管理这个本地仓库了。
这时候我们发现当前目录下会多了一个.git的目录,这个目录是Git来跟踪管理版本的,除非你明确知道自己在干什么,否则最好不要动这个目录里面的文件。
补充知识:所有的版本控制系统,都能跟踪文本文件的改动,比如txt文件,网页,所有程序的代码等,Git也不列外,版本控制系统可以告诉你每次的改动,但是图片,视频这些二进制文件,虽能也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动记录下来,也就是知道图片从1kb变成2kb,但是到底改了什么,版本控制也不知道。
下面是在我的电脑→D盘→TEST文件下,创建一个名为lianxi的版本库:
命令解析:
cd:进入某个目录
mkdir:创建一个文件
pwd:显示当前的目录路径
添加文件到版本库
要添加文件到版本库,首先需要将这个目录变为git可以管理的仓库,命令如下:
然后,在lianxi目录下创建一个文件,这里我创建的文件为0409.txt,内容为123456
使用下列的命令,将创建的文件添加到暂存区,然后提交到仓库:
命令解析:
git add:将文件提交到暂存区
git commit -m:将暂存区文件提交到仓库(单引号内为注释)
检查是否有未提交的文件
通过下面的命令,检查该版本库是否有文件未提交:
命令解析:
git status:检查当前文件状态
检查文件是否被修改
修改0409.txt的文件,然后重新检查状态:
修改文件后,通过命令git status发现,文件已经被修改,但是未提交,如果要检查文件修改了什么内容,可以通过上图中的命令来查看,发现文件的第二行增加了666666的内容。
检查无误后,继续提交修改后的文件,提交命令和上面一样。
命令解析:
git diff:查看文件修改的内容
查看历史变更记录
再次修改文件内容,第三行增加233333的内容,然后保存提交:
现在已经修改了2次文件,可以通过如下命令查看历史修改记录:
如上图所示:每次提交都会有自己的版本号,当然,入过觉得这样看起来比较费事,可以使用命令,获得精简版本的日志记录。
命令解析:
git log:获得历史修改记录
git log --pretty=oneline:使记录只显示主要的内容,一行显示
版本回退
首先通过命令行查看当前的文件内容:
然后通过下列的命令,执行版本回退:
可以看到内容已经回退到上一个版本,通过git log查看修改记录,发现最近的一次233333内容的记录已经看不到了,如果想回到最新的版本,可以通过如下命令进行回退:
从上图可以看到,文件版本又回退到了最新的状态。
命令解析:
cat:查看文件内容
git reset --hard HEAD^:回退到上一个版本
git reflog:获取历史版本号
git reset --hard 版本号:回退到该版本号对应的版本
PS:如果要回退到上上个版本,可以使用git reset --hard HEAD^^命令,但是这样稍显麻烦,如果回退到100个版本之前,只需要执行这个命令即可:git reset --hard HEAD~100;
将本地文件推送到github仓库
PS:关于Git和github关联,可以参考这篇博客:Git关联github,这里跳过不细说。
检查文件是否还有未提交或者修改的,然后将文件提交到github仓库,命令如下:
命令解析:
git remote add origin https://github.com/zwg481026/APITest.git是将你本地的仓库和github仓库进行关联,在操作时候,需要将github地址替换为自己的,否则无法推送!
然后执行下面的命令:
第一次推送master分支时,加上了 –u参数,Git会将本地的master分支内容推送的远程新的master分支,还会把2个master分支关联起来,在以后的推送或者拉取时就可以简化操作。
推送成功后,可以立刻在github页面中看到远程库的内容已经和本地一模一样了,登录你的github,从仓库中查看:
之后,只要本地做了修改提交,就可以使用git push origin master命令进行文件推送。
Git常用操作命令
创建仓库命令
命令 | 说明 |
初始化仓库 | |
拷贝一份远程仓库,也就是下载一个项目。 |
提交与修改
命令 | 说明 |
添加文件到仓库 | |
查看仓库当前的状态,显示有变更的文件。 | |
比较文件的不同,即暂存区和工作区的差异。 | |
提交暂存区到本地仓库。 | |
回退版本。 | |
删除工作区文件。 | |
移动或重命名工作区文件。 | |
提交日志
命令 | 说明 |
查看历史提交记录 | |
以列表形式查看指定文件的历史修改记录 | |
远程操作
命令 | 说明 |
远程仓库操作 | |
从远程获取代码库 | |
下载远程代码并合并 | |
上传远程代码并合并 |
远程仓库相关命令
检出仓库:$ git clone git://github.com/jquery/jquery.git
查看远程仓库:$ git remote -v
添加远程仓库:$ git remote add [name] [url]
删除远程仓库:$ git remote rm [name]
修改远程仓库:$ git remote set-url --push [name] [newUrl]
拉取远程仓库:$ git pull [remoteName] [localBranchName]
推送远程仓库:$ git push [remoteName] [localBranchName]
*如果想把本地的某个分支test提交到远程仓库,并作为远程仓库的master分支,或者作为另外一个名叫test的分支,如下:
$git push origin test:master // 提交本地test分支作为远程的master分支
$git push origin test:test // 提交本地test分支作为远程的test分支
分支(branch)操作相关命令
查看本地分支:$ git branch
查看远程分支:$ git branch -r
创建本地分支:$ git branch [name] ---- 注意新分支创建后不会自动切换为当前分支
切换分支:$ git checkout [name]
创建新分支并立即切换到新分支:$ git checkout -b [name]
删除分支:$ git branch -d [name] ---- -d选项只能删除已经参与了合并的分支,对于未有合并的分支是无法删除的。如果想强制删除一个分支,可以使用-D选项
合并分支:$ git merge [name] ----将名称为[name]的分支与当前分支合并
创建远程分支(本地分支push到远程):$ git push origin [name]
删除远程分支:$ git push origin :heads/[name] 或 $ gitpush origin :[name]
*创建空的分支:(执行命令之前记得先提交你当前分支的修改,否则会被强制删干净没得后悔)
$git symbolic-ref HEAD refs/heads/[name]
$rm .git/index
$git clean -fdx
版本(tag)操作相关命令
查看版本:$ git tag
创建版本:$ git tag [name]
删除版本:$ git tag -d [name]
查看远程版本:$ git tag -r
创建远程版本(本地版本push到远程):$ git push origin [name]
删除远程版本:$ git push origin :refs/tags/[name]
合并远程仓库的tag到本地:$ git pull origin --tags
上传本地tag到远程仓库:$ git push origin --tags
创建带注释的tag:$ git tag -a [name] -m 'yourMessage'
子模块(submodule)相关操作命令
添加子模块:$ git submodule add [url] [path]
如:$git submodule add git://github.com/soberh/ui-libs.git src/main/webapp/ui-libs
初始化子模块:$ git submodule init ----只在首次检出仓库时运行一次就行
更新子模块:$ git submodule update ----每次更新或切换分支后都需要运行一下
删除子模块:(分4步走哦)
1) $ git rm --cached [path]
2) 编辑“.gitmodules”文件,将子模块的相关配置节点删除掉
3) 编辑“ .git/config”文件,将子模块的相关配置节点删除掉
4) 手动删除子模块残留的目录
git忽略某个目录或文件不上传
1、首先我们通过git status来查看能被上传的文件,如下图所示:
2、我们查看到node_modules目录默认是可以被上传的,那么我们需要在目录总创建一个.gitignore文件,可以在目录中右键选择git bash Here,如下图所示:
3、然后输入touch .gitignore,如下图所示:
4、此时就会在目录中新建了一个.gitignore文件,如下图所示:
5、然后打开编辑器,将node_modules添加到文件中,如下图所示
忽略规则:
1.target //忽略这个target目录 2.angular.json //忽略这个angular.json文件 3.log/* //忽略log下的所有文件 4.css/*.css //忽略css目录下的.css文件 |
6、保存退出
7、然后在执行git status查看,就没有node_modules目录了,如下图所示:
8、然后执行git add .,就没有node_modules,如下图所示:
9、然后执行git commit -m "package",如下图所示:
10、最后执行git push即可,如下图所示:
11、此时web上已经上传成功了,如下图所示:
注意:此目录必须是通过git clone下来的,否则在push时要加上url
Git中.gitignore的配置语法
规则:
1.空行或是以”#”开头的行即注释行将被忽略。
2.可以在前面添加正斜杠/来避免递归(以斜杠 “/” 结尾表示目录)。
3.可以在后面添加正斜杠/来忽略文件夹,例如build/即忽略build文件夹。
4.”!” 表示取消忽略,来否定忽略,即比如在前面用了*.apk,然后使用!a.apk,则这个a.apk不会被忽略。
5.用来匹配零个或多个字符,如.[oa]忽略所有以".o"或".a"结尾,*忽略所有以结尾的文件(这种文件通常被许多编辑器标记为临时文件);[]用来匹配括号内的任一字符,如[abc],也可以在括号内加连接符,如[0-9]匹配0至9的数;?用来匹配单个字符。
6.以星号 “*” 通配多个字符;
7.以问号 “?” 通配单个字符;
8.以方括号 “[]” 包含单个字符的匹配列表;
9.以叹号 “!” 表示不忽略(跟踪)匹配到的文件或目录;
10.** 表示匹配零到多级目录
# 忽略 .a 文件 *.a # 但否定忽略 lib.a, 尽管已经在前面忽略了 .a 文件 !lib.a # 仅在当前目录下忽略 TODO 文件, 但不包括子目录下的 subdir/TODO /TODO # 忽略 build/ 文件夹下的所有文件 build/ # 忽略 doc/notes.txt, 不包括 doc/server/arch.txt doc/*.txt # 忽略所有的 .pdf 文件 在 doc/ directory 下的 doc/**/*.pdf |
Git 常用命令
命令 | 说明 |
git init | 初始化本地git仓库(创建新仓库) |
git config --global user.name "xxx" | 配置用户名 |
git config --global user.email "xxx@xxx.com" | 配置邮件 |
git config --global color.ui true | git status等命令自动着色 |
git config --global color.status auto | |
git config --global color.diff auto |
|
git config --global color.branch auto |
|
git config --global color.interactive auto |
|
git config --global --unset http.proxy | remove proxy configuration on git |
git clone git+ssh://git@192.168.53.168/VT.git | clone远程仓库 |
git status | 查看当前版本状态(是否修改) |
git add xyz | 添加xyz文件至index |
git add . | 增加当前子目录下所有更改过的文件至index |
git commit -m 'xxx' | 提交 |
git commit --amend -m 'xxx' | 合并上一次提交(用于反复修改) |
git commit -am 'xxx' | 直接提交全部修改,相当于 add 和 commit 一起执行了。 注意:全部文件为 tracked 才行,你新建了文件为 untracked 时,该命令不会执行。 |
git rm xxx | 删除index中的文件 |
git rm -r * | 递归删除 |
git log | 显示提交日志 |
git log -1 |
显示1行日志 -n为n行 |
git log -5 | 显示提交日志及相关变动文件 |
git log --stat | |
git log -p -m | |
git show dfb02e6e4f2f7b573337763e5c0013802e392818 | 显示某个提交的详细内容 |
git show dfb02 | 可只用commitid的前几位 |
git show HEAD | 显示HEAD提交日志 |
git show HEAD^ | 显示HEAD的父(上一个版本)的提交日志 ^^为上两个版本 ^5为上5个版本 |
git tag | 显示已存在的tag |
git tag -a v2.0 -m 'xxx' | 增加v2.0的tag |
git show v2.0 | 显示v2.0的日志及详细内容 |
git log v2.0 | 显示v2.0的日志 |
git diff | 显示所有未添加至index的变更, 查看工作区与暂存区的不同。 |
git diff –cached [<commit>] | 查看暂存区与指定提交版本的不同,版本可缺省(为HEAD) |
git diff <commit> | 查看工作区与指定提交版本的不同 |
git diff <commit>..<commit> | 查看2个指定提交版本的不同,其中任一可缺省(为HEAD) |
git diff <commit>...<commit> | 查看2个不同分支指定提交版本的不同,其中任一可缺省(为HEAD),该命令相当于git diff $(git-merge-base A B) B |
git diff --cached | 显示所有已添加index但还未commit的变更 |
git diff HEAD^ | 比较与上一个版本的差异 |
git diff HEAD -- ./lib | 比较与HEAD版本lib目录的差异 |
git diff origin/master..master | 比较远程分支master上有本地分支master上没有的 |
git diff origin/master..master --stat | 只显示差异的文件,不显示具体内容 |
git remote add origin git+ssh://git@192.168.53.168/VT.git | 增加远程定义(用于push/pull/fetch) |
git branch | 显示本地分支 |
git branch --contains 50089 | 显示包含提交50089的分支 |
git branch -a | 显示所有分支 |
git branch -r | 显示所有原创分支 |
git branch --merged | 显示所有已合并到当前分支的分支 |
git branch --no-merged | 显示所有未合并到当前分支的分支 |
git branch -m master master_copy | 本地分支改名 |
git checkout | 与 git reset 不同,reset 是替换整个目录树,多余的文件将被删除。而 checkout 只是替换指定的文件,对多余的文件保留不做任何处理。 |
git checkout -b master_copy | 从当前分支创建新分支master_copy并检出 |
git checkout -b master master_copy | 上面的完整版 |
git checkout features/performance | 检出已存在的features/performance分支 |
git checkout --track hotfixes/BJVEP933 | 检出远程分支hotfixes/BJVEP933并创建本地跟踪分支 |
git checkout v2.0 | 检出版本v2.0 |
git checkout -b devel origin/develop | 从远程分支develop创建新本地分支devel并检出 |
git checkout -- README | 检出head版本的README文件(可用于修改错误回退) |
git merge origin/master | 合并远程master分支至当前分支 |
git cherry-pick ff44785404a8e | 合并提交ff44785404a8e的修改 |
git push origin master | 将当前分支push到远程master分支 |
git push origin :hotfixes/BJVEP933 | 删除远程仓库的hotfixes/BJVEP933分支 |
git push --tags | 把所有tag推送到远程仓库 |
git fetch | 获取所有远程分支(不更新本地分支,另需merge) |
git fetch --prune | 获取所有原创分支并清除服务器上已删掉的分支 |
git pull origin master | 获取远程分支master并merge到当前分支 |
git mv README README2 | 重命名文件README为README2 |
git reset --hard HEAD | 将当前版本重置为HEAD(通常用于merge失败回退) |
git rebase | |
git branch -d hotfixes/BJVEP933 | 删除分支hotfixes/BJVEP933(本分支修改已合并到其他分支) |
git branch -D hotfixes/BJVEP933 | 强制删除分支hotfixes/BJVEP933 |
git ls-files | 列出git index包含的文件 |
git show-branch | 图示当前分支历史 |
git show-branch --all | 图示所有分支历史 |
git whatchanged | 显示提交历史对应的文件修改 |
git revert dfb02e6e4f2f7b573337763e5c0013802e392818 | 撤销提交dfb02e6e4f2f7b573337763e5c0013802e392818 |
git ls-tree HEAD | 内部命令:显示某个git对象 |
git rm | 把文件从工作区和暂存区中删除。使用 —cached 只从暂存区中删除。使用 –rf <directory> 可删除指定目录下的所有文件和子目录。 |
git mv <source> <destination> | 在工作区和暂存区中进行移动或重命名。若 <destination> 不为一个目录名,则执行重命名。如果为一个目录名,则执行移动。 |
git rev-parse v2.0 | 内部命令:显示某个ref对于的SHA1 HASH |
git reflog | 显示所有提交,包括孤立节点 |
git show HEAD@{5} | |
git show master@{yesterday} | 显示master分支昨天的状态 |
git log --pretty=format:'%h %s' --graph | 图示提交日志 |
git show HEAD~3 | |
git show -s --pretty=raw 2be7fcb476 | |
git stash | 暂存当前修改,将所有至为HEAD状态 |
git stash list | 查看所有暂存 |
git stash show -p stash@{0} | 参考第一次暂存 |
git stash apply stash@{0} | 应用第一次暂存 |
git grep "delete from" | 文件中搜索文本“delete from” |
git grep -e '#define' --and -e SORT_DIRENT | |
git fsck | |
git gc | |
git clone <source repository> <destination repository> | 复制本地仓库的命令方式: <source repository>:想克隆的本地仓库路径 <destination repository>:想克隆去另一个地方的路径。例如 git clone d:/git e:/git11 是将 d:/git 的仓库(即包含隐藏文件 .git 的目录)克隆到 e:/git11 目录下。 注意: 1、<destination repository> 目录必须没有在文件系统上创建,或创建了但里面为空,不然会克隆不成功。 2、与从远程拉取仓库不同,路径的最后不用写 .git 来表明这是一个仓库。 |
git status –s | 获得简短的状态输出 |
git commit、git push、git pull、 git fetch、git merge 的含义与区别
- git commit:是将本地修改过的文件提交到本地库中;
- git push:是将本地库中的最新信息发送给远程库;
- git pull:是从远程获取最新版本到本地,并自动merge;
- git fetch:是从远程获取最新版本到本地,不会自动merge;
- git merge:是用于从指定的commit(s)合并到当前分支,用来合并两个分支;