一、Git配置
Git提供了一个git config配置文件,用来配置和读取相应的工作环境变量,这些变量可以存放在以下三个不同的地方:优先级分别是1<2<3。
1、/etc/gitconfig:系统级别的配置,适用于系统中所有用户。使用git config时,用–system选项,读写的就是这个文件。
2、~/.gitconfig 或 ~/.config/git/config:用户级别的配置,适用于当前用户。使用git config时,用–global选项,读写的就是这个文件。
3、 /.git/config :项目目录,项目级别的配置,只对当前项目生效。
二、Git仓库
获取一个git仓库的方法有以下两种:
1、将尚未进行过版本控制的项目转换为git仓库。需进入该项目根目录下,然后执行命令:git init,此命令会创建一个名为.git的子目录,含有git仓库中必须的所有文件。
2、从别的服务器克隆一个已存在的git仓库,命令如下: git clone https://xxx.git。
三、文件忽略
有些文件无需纳入Git的管理中,也不希望它们总出现在未跟踪文件列表里。此时需要创建一个名为 .gitignore 的文件,列出要忽略的文件的模式。文件 .gitignore 的格式规范如下:
1、所有空行或者以 # 开头的行都会被 Git 忽略。
2、可以使用标准的glob模式匹配,它会递归地应用在整个工作区中。
3、匹配模式可以以(/)开头防止递归。
4、匹配模式可以以(/)结尾指定目录。
5、要忽略指定模式以外的文件或目录,可以在模式前加上叹号(!)取反。
所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。星号(*)匹配零个或多个任意字符;[abc] 匹配任何一个列在方括号中的字符 (这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);问号(?)只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符, 表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字)。使用两个星号()表示匹配任意中间目录,比如 a//z 可以匹配 a/z 、 a/b/z 或 a/b/c/z 等。示例如下:
# 忽略所有的 .a 文件
*.a
# 但跟踪所有的lib.a,即便在前面忽略了.a 文件
!lib.a
# 只忽略当前目录下的 TODO 文件,而不忽略 subdir/TODO
/TODO
# 忽略任何目录下名为 build 的文件夹
build/
# 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt
doc/*.txt
# 忽略 doc/ 目录及其所有子目录下的 .pdf 文件
doc/**/*.pdf四、Git命令
1、配置
git init :创建git存储库。
git config --global user.name=xxx:设置用户名。
git config --global user.email=xxx.@xxx.com:设置邮箱。
git config --local user.name=xxx:设置当前某个git存储库的配置。
git config user.name=xxx:等同于git config --local user.name=xxx。
git config --global core.editor vim :设置文本编辑器,此处设置为vim。
git config --global merge.tool vimdiff:解决合并冲突时使用的差异分析工具,比如vimdiff。
git config --list:查看配置2、初始化/克隆仓库
git init //在当前目录创建新的git仓库,该命令执行完后会在当前目录生成一个.git目录
git init directory //使用指定目录创建git仓库
git remote add origin <https://xxx.git> //添加远程仓库
git push -u origin master //本地仓库推送到远程
git clone url:克隆一个远程存储库到本地。
git clone url directoryName:克隆一个远程存储库到本地的directoryName中。
git clone -b branchname <repo> //克隆远程指定的分支TIP
注:如果是本地创建仓库,传到远程,要先从远程建立一个(同名的)新仓库,再上传,否则提示仓库不存在。最好的就是远程创建好,直接本地clone。
3、git操作命令
#添加
git add [file1] [file2]://添加指定文件的副本到暂存区。
git add [dir] [dir]://添加指定目录到暂存区,包括所有子目录
git add . // 添加当前目录的所有文件到暂存区 ==
#提交
git commit -m "备注": //将暂存区中的内容存储到对象数据库中,也是一个副本。
git commit --amend -m "需改备注": //修改最后一次提交的说明,创建新提交ID,其他内容不变,只更改备注,提交历史中之前的那次提交ID不见了。
git commit --amend [file1] [file2]://重做上一次commit,并包括指定文件的新变化
git commit [file1] [file2]... -m '备注' //提交暂存区的指定文件到仓库
git commit -a -m '备注'://跳过使用暂存区域的方式,自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤。-a选项使本次提交包含了所有修改过的文件。
#远程remote:为了便于管理,Git要求每个远程主机都必须指定一个主机名。git remote命令就用于管理主机名
git remote:查询本地存储库对应的远程存储库别名。默认是origin。
git remote -v(--verbose):查询本地存储库对应的远程存储库详细信息。
git remote show <主机名> //查看该主机的详细信息
git remote add <主机名> <网址>:添加远程主机,及将远程网址设置为一个简单的别名也就是主机名,clone时候自动是origin.
git remote add <shortname> <url>:添加一个新的远程Git仓库,同时指定一个方便使用的简写, 这时可以在命令行中使用<shortname>来代替整个URL。
git remote add origin <url>:添加远程主机,及将远程网址设置为一个简单的别名也就是主机名,clone时候自动是origin.。
git remote rm <主机名>、git remote remove <主机名> //删除远程主机,删除远程地址在本机上的别名,不会删除远程代码库
git remote rename <原主机名> <新主机名> //远程主机改名
#远程fetch
git fetch:获取远程存储库中所有新提交和分支,并跟新本地存储库的远程跟踪分支,但是对本地分支丝毫没有任何影响。
git fetch -p:获取远程存储库中所有新提交和分支,并跟新到本地存储库的远程跟踪分支,且远程存储库删除的分支,远程跟踪分支也一起删除。
#远程pull
git pull:将远程存储库的新提交和分支更新到远程跟踪分支并且合并到对应的本地本地分支上。等同于git fetch+git merge /origin/branchName。如果当前分支只有一个追踪分支,连远程主机名都可以省略,当前分支自动与唯一一个追踪分支进行合并。
git pull <远程主机名> <远程分支名>:<本地分支名> //取回远程主机某个分支的更新,再与本地的指定分支合并。通常会从最初克隆的服务器上抓取数据并自动尝试合并到当前所在的分支。
git pull origin next:master //取回origin主机的next分支,与本地的master分支合并
git pull origin next //如果远程分支是与当前分支合并,则冒号后面的部分可以省略。这等同于先做git fetch,再做git merge
git fetch origin、git merge origin/next
git pull --rebase <远程主机名> <远程分支名>:<本地分支名>//如果合并需要采用rebase模式,可以使用–rebase选项。
git pull origin//如果当前分支与远程分支存在追踪关系,git pull就可以省略远程分支名;本地的当前分支自动与对应的origin主机”追踪分支”(remote-tracking branch)进行合并。
#merge
git merge online //合并本地指定分支online到当前分支
git merge origin/master:将远程跟踪分支的变更合并到本地分支。
#远程push
git push:将本地的变更推送到远程存储库对应的分支上。如果当前分支只有一个追踪分支,那么主机名都可以省略,如果当前分支与多个主机存在追踪关系,则可以使用-u选项指定一个默认主机,这样后面就可以不加任何参数。
git push origin:等同于git push。
git push --set-upstream origin branchName:将本地当前新分支推送到远程存储库上对应的branchName分支上。
git push -u origin branchName:同 git push --set-upstream origin branchName。
git push <远程主机名> <本地分支名>:<远程分支名> //将本地分支的更新,推送到远程主机。
git push <remote> <branch> //如果省略远程分支名,则表示将本地分支推送与之存在"追踪关系"的远程分支(通常两者同名),如果该远程分支不存在,则会被新建
git push origin master //将本地的master分支推送到origin主机的master分支。如果后者不存在,则会被新建
git push origin :master//删除origin主机的master分支。如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支,等同于:
git push origin --delete master
git push origin//当前分支推送到origin主机的对应分支。如果当前分支与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略
git push origin --tags //git push不会推送标签(tag),除非使用–tags选项
#branch分支
git branch //列出本地的分支列表
git branch -a:查看存储库中所有分支列表,包括远程跟踪分支。
git branch -r //列出所有远程分支
git branch -v:显示分支详细信息。
git branch -vv :显示分支最最详细信息,包括远程跟踪分支等。
git branch --track branchname remotebranchname://新建一个分支,与指定的远程分支建立追踪关系
git branch --set-upstream-to branchname remotebranchname://建立追踪关系,指定本地分支branchname追踪远程分支remotebranchname。
git branch branchName:新建分支。
git switch branchName:切换到指定分支。
git switch -c branchName:创建并切换到新分支。
git branch -d branchName:删除本地某个分支。
git branch -d origin branchName:删除远程某个分支。
git branch -D branchName:强制删除未合并的分支。
git branch -m oladBranchName newBranchName:重命名分支。不管当前在哪个分支(推荐)。
git branch -m newBranchName:将当前分支重命名(不推荐)
git merge branchName:将某个分支合并到当前所在分支。
#tag标签
git tag :列出所有的标签,可带上可选的 -l 选项 --list
git tag -l "v1.8.5*" :列出只对v1.8.5系列感兴趣的标签
git tag -a v1.0 :创建标签 -a 选项意为"创建一个带注解的标签"。不用 -a 选项也可以执行的,但它不会记录这标签是啥时候打的,谁打的,也不会让你添加个标签的注解。推荐一直创建带注解的标签。
git tag -a v1.4 -m "my version 1.4" :-m 选项指定了一条将会存储在标签中的信息。如果没有为附注标签指定一条信息Git会启动编辑器要求你输入信息。
git tag -a v1.2 9fceb02 :在某个提交上打标签,要在末尾指定指定提交的校验和。
git show :看到标签信息和与之对应的提交信息
git push origin <tagname> :将标签传到远程服务器上,git push 命令并不会传送标签到远程仓库服务器上。在创建完标签后你必须显式地推送标签到共享服务器上。
git push origin v1.5 :将本地v1.5标签推送到远程
git push origin --tags :如果想要一次性推送很多标签,也可以使用带有 --tags 选项的 git push命令。这将会把所有不在远程仓库服务器上的标签全部传送到那里。
git tag -d <tagname> :删除本地tag,命令并不会从任何远程仓库中移除这个标签
git push origin --delete <tagname> :删除远程tag
#撤销
git restore fileName:将暂存区中的内容移回工作目录。(git add的反向操作)。
git restore --staged fileName:将对象数据库中的内容覆盖替换暂存区中内容。(git commmit的反向操作)。
git reset --soft commitID: 将提交重置到commitID的这次提交上,此时发生的变更会从对象数据库移回暂存区,再从暂存区将变更复制到工作目录。也就是说只有对象数据库回退到给定的提交上,工作区和暂存区会保留变更,方便再次提交回来。
git reset --mixed commitID:将数据库对象和暂存区重置到commitID的这次提交上,只有工作目录保留发生的变更。
git reset commitID:等同于git reset --mixed commitID。--mixed可以省略。
git reset --hard commitID:硬重置,对象数据库库、暂存区和工作目录中全部重置到commitID,commitID之后的那些提交全部抹去,跟没提交过似的。
git revert commitID:撤销commitID的这次提交。
#删除&重命名:
git rm fileName:删除工作目录和暂存区的文件。
git rm -r director:递归删除某个目录及其目录中所有文件。
git mv oldFileName newFileName:重命名已跟踪的文件,工作目录和暂存区同时更变。
#差异对比:
git diff:比较工作目录和暂存区的差异。
git diff --staged(--cached) :比较对象数据库和暂存区的差异。
git diff branchName1 branchName2:比较两个分支的差异。
git diff commitID1 commitID2:比较两个提交的差异。
#搜索:
git blame fileName:查看fileName最新一次提交中所做的所有变更。
git blame commitID fileName:查看某次提交中fileName中所做的所有变更。
git blame commitID fileName -s:只展示提交id和行号。
git branch:列出本地存储库所有分支。
git status //查询当前状态
git log:列出当前分支所有提交,最新的在最上面
git log --reverse ://逆向显示
git log --oneline --all --graph:单行显示缩略提交,显示出所有分支,并显示为一个图。
git diff //查看尚未暂存的文件更新了哪些部分