作用范围 | 命令 | 配置文件位置 | 优先级 |
---|---|---|---|
系统级别 | system | git安装目录/etc/gitconfig | 最低 |
当前用户 | global | ~/.gitconfig (计算机当前用户目录) | 次之 |
当前仓库(默认) | local | 本地仓库/.git/config 文件 | 最高 |
git config [--local|--global|--system] --add section.key value #语法
git config –-add cat.name tom #在local级别添加配置配置
git config --global user.name "用户名" #修改用户名配置
git config --global user.email "邮箱" #修改用户邮箱配置
git config --global color.ui true #让Git显示颜色,会让命令输出看起来更醒目
备注:不指定作用范围的默认使用local范围
git config --local -l #查看仓库级别配置
git config --global -l #查看用户级别配置
git config --system -l #查看系统级别配置
git config -l #查看所有的配置信息,依次是系统级别、用户级别、仓库级别,不同级别配置可以重复,以优先级高的为准
git config user.name #查询指定配置项,没指定配置界别的默认查询local级别
git config --global user.name #查询指定级别的某项具体配置
git config [--local|--global|--system] --unset section.key
备注:可以直接打开文件进行增删改查操作
这条命令的目的是为了让本地机器ssh登录远程机器上的GitHub账户无需输入密码
ssh-keygen -t rsa -b 4096 -C "邮箱" #生成秘钥,该命令执行后敲三次回车
ssh-keygen
:SSH 为 Secure Shell 的缩写,SSH
-t rsa
:-t是type的缩写,-t即指定密钥的类型,密钥的类型有两种,一种是RSA(默认),一种是DSA:
-b 4096
:b是bit的缩写,-b 指定密钥长度。密钥,最小要求768位,默认是2048位。该参数指定RSA密钥长度为4096位。
DSA密钥必须恰好是1024位(FIPS 186-2 标准的要求)。
-C "邮箱"
:-C表示要提供一个新注释(comment),用于识别这个密钥,所以不一定非要填邮箱,可以是任何内容。
在C:\Users\issuser.ssh目录下生成公钥和私钥文件。
删除用户目录下该目录即可C:\Users\issuser.ssh
管理方式 | 缓存位置 | 备注 |
---|---|---|
默认 | 不缓存 | 每一次连接都会询问你的用户名和密码 |
cache | 内存 | 凭证存放在内存中一段时间,缓存相关文件保存在当前用户根目录的 git-credential-cache 中, 默认保存15分钟,可以通过选项指定缓存的时间 --timeout |
store | 硬盘 | 用明文的形式存放在磁盘中,–file
|
mananger | 若安装Git时安装了GitGUI,自动会在system级别中设置credential.helper为manager。 并且不配置所处级别(system、global或者local)如何,一旦设置了manager,都优先使用该方式 |
git config --global credential.helper store #指定凭证保存在硬盘文件上
git config --global credential.helper cache --timeout=300 #指定凭证保存在内存中5分钟,默认保存15分钟
如果是更换git账号,先将windows下c盘对应用户下的C:\Users\issuser\ .git-credentials文件删除,然后重新生成凭证即可
git credential-manager uninstall #删除凭证
控制面板\用户帐户和家庭安全\凭据管理器
git config --list | grep credential #查看凭证配置方式
① 创建本地仓库
git init #在目录下执行会将该目录指定为git仓库,文件中生成.git隐藏文件夹
② 克隆远程仓库
git clone 远程url #从远程仓库克隆仓库
git add 文件名 #添加指定文件
git add *.java #添加所有java文件
git add -A 或 git add . #添加所有改动
git commit -m "提交描述" #将缓存区的内容提交到本地仓库
git status #根据提示内容查看是否有没被添加的改动或没被提交的改动
git diff 文件名 #工作区——>缓存区
git diff HEAD -- file #工作区——>版本库
git diff --cache #缓存区——>版本库
git log #查看提交记录,信息比较多显的混乱
git log --oneline #查看主要内容,精简
git log --pretty=oneline #效果同上
git reset --hard HEAD^ #回退到上一个版本,HEAD表示当前版本,一个^表示一个版本
git reset --hard HEAD~100 #回退到往上100个版本
git reset --hard commit_id #回退到指定版本,commit_id为提交记录id
git checkout -- readme.txt #分两种情况如下:
#没有添加到暂存区时,会回到和版本库一模一样的状态
#已经添加到暂存区后,又作了修改,撤销修改就回到添加到暂存区后的状态。
git reset HEAD 文件名 #可以把暂存区的修改撤销掉unstage,重新放回工作区,在执行上边checkout命令将工作区改动撤回
git reflog #用来记录你执行的每一次命令,reflog回流的意思
手动删除文件后存在两种情况,确定删除、误删除需要恢复
git rm readme.txt #确实要删除该文件时执行
git checkout -- test.txt #误删除恢复,文件中改动无法恢复
分类 | 分类描述 | 备注 |
---|---|---|
master | 最终发布版本 | 整个项目中有且只有一个 |
develop | 开发分支 | 原则上项目中有且只有一个 |
feature | 功能分支 | 用于开发一个新的功能 |
release | 预发布版本 | 介于develop和master之间的一个版本,主要用于测试 |
hotfix | 修复补丁 | 用于修复master上的bug,直接作用于master |
#第一种写法:
git checkout -b dev #git checkout命令加上-b参数表示创建并切换,相当于以下两条命令
||
git branch dev #创建分支
git checkout dev #切换分支
#第二种写法:
git switch -c dev #创建并切换到新的dev分支
git switch master #切换到已有的master分支
克隆远程仓库并创建本地dev分支与远程仓库origin的dev分支关联
git clone 远程仓库url #默认克隆远程仓库master分支
git checkout -b dev origin/dev #克隆后在本地创建dev分支并关联远程仓库origin的dev分支,本地和远程分支的名称最好一致
git branch #列出所有分支,当前分支前面会标一个*号
git checkout 分支名
git switch 分支名
git merge dev #dev分支的工作成果合并到当前分支上
git branch -d dev
git merge dev #正常合并时会使用该模式,直接将master指针指向分支。
git log --graph --pretty=oneline --abbrev-commit #查看日志记录看不出来曾经做过分支合并
git merge --no-ff -m "描述信息" dev #--no-ff参数,表示禁用Fast forward
git log --graph --pretty=oneline --abbrev-commit #可以用普通模式合并,合并后分支历史上可以看出分支信息,能看出来曾经做过合并
①尝试合并分支
git merge dev #将dev分支尝试合并到当前分支
②存在冲突时查看冲突文件
git status
③打开冲突文件查看冲突位置并手动解决
<<<<<<< HEAD
分支1冲突内容
=======
分支2冲突内容
>>>>>>> feature1
④手动解决冲突后再提交
git add readme.txt
git commit -m "解决冲突"
⑤查看分支合并情况
git log --graph --pretty=oneline --abbrev-commit
当前分支进行的开发还没提交需要紧急修复生产bug时可以使用stash功能,把当前工作现场“储藏”起来,等bug修复完成恢复现场后继续工作。
① 隐藏工作区
git stash #隐藏工作区
git status #此时查看工作区,就是干净的(除非有没有被Git管理的文件)
②查看隐藏工作区
git stash list
③恢复隐藏工作区
#第一种方式:
git stash apply #恢复,但是恢复后,stash内容并不删除
git stash drop #删除stash
#第二种方式:
git stash pop #恢复的同时把stash内容也删了
④删除隐藏的工作区(参考③)
git stash drop #删除stash
每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。
在bug分支将bug修复后合并到master分支,将bug分支删除,此时其他分支上该bug依然存在;比如要在dev分支上修复,我们只需要把修复bug的提交所做的修改“复制”到dev分支(只复制bug改动),Git专门提供了一个cherry-pick命令,让我们能复制一个特定的提交到当前分支,命令如下:
git branch #查看当前分支
switch branch dev #切换到dev分支
git cherry-pick 4c805e2 #合并bug提交的改动并提交,4c805e2为提交记录id
每添加一个新功能,最好新建一个feature分支,在上面开发,完成后合并,最后删除该feature分支。
①创建一个分支用来开发新功能
git checkout -b feature_01 #创建分支feature_01
②开发功能完成后提交到本地仓库 add/commit,合并到其他分支,然后删除改功能分支
③废弃该分支
git branch -d feature-vulcan #git会提示是否确定要删除,确定用-D参数再执行一次命令
git branch -D feature-vulcan #强制删除
ssh git@gitee.com 测试通不通
#注意:
#1、设置自己的全局或本地用户名和邮箱(本地只在当前目录仓库有用)
#2、使用自己的用户名和邮箱重新生成ssh公钥并配置到gitee等远程仓库
#3、确保当前网络具有访问权限(22端口是否被禁)
① 添加关联
git remote add origin 远程仓库url #remote 远程,add 添加,origin 远程库的名字,origin是Git默认的叫法,也可以改成别的
克隆远程仓库并创建本地dev分支与远程仓库origin的dev分支关联
git clone 远程仓库url #默认克隆远程仓库master分支
git checkout -b dev origin/dev #克隆后在本地创建dev分支并关联远程仓库origin的dev分支,本地和远程分支的名称最好一致
设置当前本地分支的默认远程分支
git branch --set-upstream-to <branch-name> origin/<branch-name>。 #--set-upstream-to 简写为 -u
git branch --set-upstream-to dev origin/dev
② 删除关联
git remote rm origin #删除当前本地仓库与远程仓库origin的关联
③ 查询关联
git remote #远程库的信息,只显示远程仓库名字
git remote -v #显示了可以抓取和推送的origin的地址。如果没有推送权限,就看不到push的地址。
将远程仓库内容更新到本地
git pull #远程库内容更新到本地,相当于下边两个命令组合
git fetch #从远程分支拉取代码,可以得到远程分支上最新的代码
git merge #合并
下边两个命令区别主要是在远程与本地仓库的合并上面
分支直接更新合并时log历史线会有分叉,rebase操作可以把本地未push的分叉提交历史整理成直线
优点:使我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
缺点:本地的分叉提交已经被修改过了。
git pull #git fetch + git merge
git pull --rebase #git fetch + git rebase
git rebase
git log --graph --pretty=oneline --abbrev-commit #查看提交历史
举例:
假设从远端master拉取分支test ,test的代码开发完要提交,假设远端的master的代码此时已经有变动,假如本地代码与远程仓库代码有冲突,在本地解决冲突后如下图:
#分支合并前
D---E test
/
A---B---C---F--- master
#git merge 合并后log记录如下
D--------E
/ \
A---B---C---F----G--- test, master
#git rebase 合并后log记录如下
A---B---D---E---C'---F'--- test, master
① 第一次推送
推送前先关联远程仓库然后将最新远程仓库内容更新到本地库,否则会报错
git push -u origin master #第一次推送使用-u 把本地的master分支内容推送到远程master分支,还会把本地和远程分支关联起来
git branch --set-upstream-to dev origin/dev #关联 --set-upstream-to 简写为 -u
② 关联后推送
git push origin master #将本地仓库内容推送到远程仓库
③ 第一次向远程仓库推送内容报错
报错提示如下:
$ git push origin master
To url
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to url
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
原因:远程仓库有内容或文建本地仓库没有更新,要先将远程仓库内容拉取下来再推送,解决如下:
git pull --rebase origin master #先执行
git push -u origin master #再执行
① 首先,可以试图用git push origin <branch-name>
推送自己的修改;
② 如果推送失败,则因为远程分支比你的本地代码更新,需要先用git pull
试图合并;
③ 如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,执行如下命令
git branch --set-upstream-to <branch-name> origin/<branch-name>。
git branch --set-upstream-to dev origin/dev
④如果合并有冲突,则解决冲突,并在本地提交;没有冲突或者解决掉冲突后,再推送就能成功!
git push origin dev
git config --global alias.st status #告诉Git使用st就表示status,git status 与 git st执行效果一样
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit" #指定log输出格式
git log --pretty=format:"%h"
git log --pretty=format:'%h %at | %s%d [%an]' --graph --date=short
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit" #指定log输出格式
.gitignore
配置文件 | 作用域 | 备注 |
---|---|---|
本地仓库目录/.gitignore | 当前仓库 | 管理当前本地仓库的文件的Git提交行为。 |
.git/info/exclude | 当前仓库 | 临时指定该项目的行为,这种方式指定的忽略文件的根目录是项目根目录。 |
命令指定 | 全局 | 在不同的项目开发者之间是不共享的,是属于Git应用级别的行为。git config --global core.excludesfile ~/.gitignore |
.gitignore
① 创建.gitignore
文件
在当前目录生成文件.gitignore,并在其中添加要忽略的文件或目录,每行表示一个忽略规则。
② 让Git识别该配置文件
git config core.excludesfiles .gitignore #默认本地仓库
git config --global core.excludesfile ~/.gitignore #配置全局
③ .gitignore不生效解决办法
.gitignore
只能忽略那些原来没有被跟踪的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore
是无效的。解决方法就是先把本地缓存删除(改变成未track状态),然后再提交
git rm -r --cached
git add
git commit -m "描述"
④ 再次推送后远程仓库将不显示要忽略的文件
git push origin master
- 从命令行中读取可用的忽略规则
- 当前目录定义的规则
- 父级目录定义的规则,依次地推
- $GIT_DIR/info/exclude 文件中定义的规则
- core.excludesfile中定义的全局规则
符号 | 作用 | 转义 |
---|---|---|
空格 | 不匹配任意文件,可作为分隔符 | 可用反斜杠转义 |
# 开头 | #开头的文件标识注释 | 可用反斜杠转义 |
! 开头 | 排除,用来指定规则的例外情况 | 可用反斜杠转义 |
/ 开头 | 只匹配文件夹以及在该文件夹路径下的内容,但是不匹配该文件 | |
结尾 / | 匹配项目根目录,如果一个模式不包含斜杠,则它匹配相对于当前 .gitignore 文件路径的内容,如果该模式不在 .gitignore 文件中,则相对于项目根目录 | |
** | 匹配多级目录,可在开始,中间,结束 | |
? | 匹配单个字符 | |
[ ] | 匹配单个字符列表 |
bin/ #忽略当前路径下的bin文件夹,该文件夹下的所有内容都会被忽略,不忽略 bin 文件
/bin #忽略根目录下的bin文件
/*.c #忽略 cat.c,不忽略 build/cat.c
debug/*.obj #忽略 debug/io.obj,不忽略 debug/common/io.obj 和 tools/debug/io.obj
**/foo #忽略/foo, a/foo, a/b/foo等
a/**/b #忽略a/b, a/x/b, a/x/y/b等
!/bin/run.sh #不忽略 bin 目录下的 run.sh 文件
*.log #忽略所有 .log 文件
config.php #忽略当前路径的 config.php 文件
%H: commit hash
%h: 缩短的commit hash
%T: tree hash
%t: 缩短的 tree hash
%P: parent hashes
%p: 缩短的 parent hashes
%an: 作者名字
%aN: mailmap的作者名字 (.mailmap对应,详情参照git-shortlog(1)或者git-blame(1))
%ae: 作者邮箱
%aE: 作者邮箱 (.mailmap对应,详情参照git-shortlog(1)或者git-blame(1))
%ad: 日期 (--date= 制定的格式)
%aD: 日期, RFC2822格式
%ar: 日期, 相对格式(1 day ago)
%at: 日期, UNIX timestamp
%ai: 日期, ISO 8601 格式
%cn: 提交者名字
%cN: 提交者名字 (.mailmap对应,详情参照git-shortlog(1)或者git-blame(1))
%ce: 提交者 email
%cE: 提交者 email (.mailmap对应,详情参照git-shortlog(1)或者git-blame(1))
%cd: 提交日期 (--date= 制定的格式)
%cD: 提交日期, RFC2822格式
%cr: 提交日期, 相对格式(1 day ago)
%ct: 提交日期, UNIX timestamp
%ci: 提交日期, ISO 8601 格式
%d: ref名称
%e: encoding
%s: commit信息标题
%f: sanitized subject line, suitable for a filename
%b: commit信息内容
%N: commit notes
%gD: reflog selector, e.g., refs/stash@{1}
%gd: shortened reflog selector, e.g., stash@{1}
%gs: reflog subject
%Cred: 切换到红色
%Cgreen: 切换到绿色
%Cblue: 切换到蓝色
%Creset: 重设颜色
%C(...): 制定颜色, as described in color.branch.* config option
%m: left, right or boundary mark
%n: 换行
%%: a raw %
%x00: print a byte from a hex code
%w([[,[,]]]): switch line wrapping, like the -w option of git-shortlog(1)
%d: ref名称
%e: encoding
%s: commit信息标题
%f: sanitized subject line, suitable for a filename
%b: commit信息内容
%N: commit notes
%gD: reflog selector, e.g., refs/stash@{1}
%gd: shortened reflog selector, e.g., stash@{1}
%gs: reflog subject
%Cred: 切换到红色
%Cgreen: 切换到绿色
%Cblue: 切换到蓝色
%Creset: 重设颜色
%C(...): 制定颜色, as described in color.branch.* config option
%m: left, right or boundary mark
%n: 换行
%%: a raw %
%x00: print a byte from a hex code
%w([[,[,]]]): switch line wrapping, like the -w option of git-shortlog(1)