一、git --version
查看git安装版本
二、git config
作用:配置 Git 的相关参数。
Git 一共有3个配置文件:
(1)仓库级的配置文件:在仓库的 .git/.gitconfig,该配置文件只对所在的仓库有效。
(2)全局配置文件:Mac 系统在 ~/.gitconfig,Windows 系统在 C:\Users\<用户名>\.gitconfig。
(3)系统级的配置文件:在 Git 的安装目录下(Mac 系统下安装目录在 /usr/local/git)的 etc 文件夹中的 gitconfig。
# 查看配置信息 # --local:仓库级,--global:全局级,--system:系统级 $ git config <--local | --global | --system> -l # 查看当前生效的配置信息 $ git config -l # 编辑配置文件 # --local:仓库级,--global:全局级,--system:系统级 $ git config <--local | --global | --system> -e # 添加配置项 # --local:仓库级,--global:全局级,--system:系统级 $ git config <--local | --global | --system> --add <name> <value> # 获取配置项 $ git config <--local | --global | --system> --get <name> # 删除配置项 $ git config <--local | --global | --system> --unset <name> # 配置提交记录中的用户信息 $ git config --global user.name <用户名> $ git config --global user.email <邮箱地址> # 更改Git缓存区的大小 # 如果提交的内容较大,默认缓存较小,提交会失败 # 缓存大小单位:B,例如:524288000(500MB) $ git config --global http.postBuffer <缓存大小> # 调用 git status/git diff 命令时以高亮或彩色方式显示改动状态 $ git config --global color.ui true # 配置可以缓存密码,默认缓存时间15分钟 $ git config --global credential.helper cache # 配置密码的缓存时间 # 缓存时间单位:秒 $ git config --global credential.helper 'cache --timeout=<缓存时间>' # 配置长期存储密码 $ git config --global credential.helper store三、git init
作用:初始化项目所在目录,初始化后会在当前目录下出现一个名为 .git 的目录。
# 初始化本地仓库,在当前目录下生成 .git 文件夹 $ git init四、git status
作用:初始化项目所在目录,初始化后会在当前目录下出现一个名为 .git 的目录。
# 查看本地仓库的状态 $ git status # 以简短模式查看本地仓库的状态 # 会显示两列,第一列是文件的状态,第二列是对应的文件 # 文件状态:A 新增,M 修改,D 删除,?? 未添加到Git中 $ git status -s五、git add
作用:把要提交的文件的信息添加到暂存区中。当使用 git commit 时,将依据暂存区中的内容来进行文件的提交。
# 把指定的文件添加到暂存区中 $ git add <文件路径> # 添加所有修改、已删除的文件到暂存区中 $ git add -u [<文件路径>] $ git add --update [<文件路径>] # 添加所有修改、已删除、新增的文件到暂存区中,省略 <文件路径> 即为当前目录 $ git add -A [<文件路径>] $ git add --all [<文件路径>] # 查看所有修改、已删除但没有提交的文件,进入一个子命令系统 $ git add -i [<文件路径>] $ git add --interactive [<文件路径>]六、git commit
作用:将暂存区中的文件提交到本地仓库中。
# 把暂存区中的文件提交到本地仓库,调用文本编辑器输入该次提交的描述信息 $ git commit # 把暂存区中的文件提交到本地仓库中并添加描述信息 $ git commit -m "<提交的描述信息>" # 把所有修改、已删除的文件提交到本地仓库中 # 不包括未被版本库跟踪的文件,等同于先调用了 "git add -u" $ git commit -a -m "<提交的描述信息>" # 修改上次提交的描述信息 $ git commit --amend示例:
七、git mv
作用:重命名文件或者文件夹。
# 重命名指定的文件或者文件夹 $ git mv <源文件/文件夹> <目标文件/文件夹>示例:把文件1名字修改成2
八、git log
作用:显示提交的记录。
# 默认打印当前分支所有的提交记录 $ git log # 打印从第一次提交到指定的提交的记录 $ git log <commit ID> # 打印指定数量的最新提交的记录 $ git log -<指定的数量> #显示ASCII图形表示的分支合并历史 $ git log --graph # 打印所有分支的提交记录 $ git log --all # 一个日志打印一行 $ git log --oneline九、git branch
作用:操作 Git 的分支命令。
# 列出本地的所有分支,当前所在分支以 "*" 标出 $ git branch # 列出本地的所有分支并显示最后一次提交,当前所在分支以 "*" 标出 $ git branch -v # 创建新分支,新的分支基于上一次提交建立 $ git branch <分支名> # 修改分支名称 # 如果不指定原分支名称则为当前所在分支 $ git branch -m [<原分支名称>] <新的分支名称> # 强制修改分支名称 $ git branch -M [<原分支名称>] <新的分支名称> # 删除指定的本地分支 $ git branch -d <分支名称> # 强制删除指定的本地分支 $ git branch -D <分支名称>十、git push
#删除远程分支 Chapater6 $ git push origin --delete Chapater6十一、git cat-file
commit、tree和blob三个对象之间的关系:blob是具体的文件,tree是文件夹,commit是每次提交的版本快照。
作用:提供仓库中对象实体的类型、大小和内容的信息
# 显示对象的类型 $ git cat-file -t 哈希值 # 显示对象的内容 $ git cat-file -p 哈希值 # 显示对象的大小 $ git cat-file -s 哈希值示例:
十二、git diff
作用:比较版本之间的差异。
# 比较当前文件和暂存区中文件的差异,显示没有暂存起来的更改 $ git diff # 比较某个文件1、2等等和暂存区中文件的差异,显示没有暂存起来的更改 $ git diff -- 文件名1 文件名2等等 # 比较暂存区中的文件和上次提交时的差异 $ git diff --cached $ git diff --staged # 比较当前文件和上次提交时的差异 $ git diff HEAD # 查看从指定的版本之后改动的内容 $ git diff <commit ID> # 比较两个分支之间的差异 $ git diff <分支名称> <分支名称> # 查看两个分支分开后各自的改动内容??? $ git diff <分支名称>...<分支名称> # 查看当前分支和往前第n次提交时的差异 $ git diff HEAD HEAD~2十三、git rebase
作用:变基。
切记:只允许对本地仓库未推送远程的commit变基,避免对其他人造成影响。
$ git rebase -i commit的版本号 $ git rebase --continue示例:
修改老旧commit的message,需要对其父亲commit进行变基,如下:
十四、git reset
作用:还原提交记录。
# 重置暂存区,但文件不受影响 # 相当于将用 "git add" 命令更新到暂存区的内容撤出暂存区,可以指定文件 # 没有指定 commit ID 则默认为当前 HEAD $ git reset [<文件路径>] $ git reset --mixed [<文件路径>] # 将 HEAD 的指向改变,撤销到指定的提交记录,工作区文件未恢复 $ git reset <commit ID> $ git reset --mixed <commit ID> # 将 HEAD 的指向改变,撤销到指定的提交记录,工作区文件未修改 # 相当于调用 "git reset --mixed" 命令后又做了一次 "git add" $ git reset --soft <commit ID> # 将 HEAD 的指向改变,撤销到指定的提交记录,工作区文件也修改了 $ git reset --hard <commit ID>示例:让暂存区恢复成和HEAD的一样
十五、git checkout
作用:检出命令,用于创建、切换分支等。
# 切换到已存在的指定分支 $ git checkout <分支名称> # 创建并切换到指定的分支,保留所有的提交记录 # 等同于 "git branch" 和 "git checkout" 两个命令合并 $ git checkout -b <分支名称> # 创建并切换到指定的分支,删除所有的提交记录??? $ git checkout --orphan <分支名称> # 替换掉本地的改动,新增的文件和已经添加到暂存区的内容不受影响 $ git checkout -- <文件路径>十六、git rm
作用:删除文件或者文件夹。
# 移除跟踪指定的文件,并从本地仓库的文件夹中删除 $ git rm <文件路径> # 移除跟踪指定的文件夹,并从本地仓库的文件夹中删除 $ git rm -r <文件夹路径> # 移除跟踪指定的文件,在本地仓库的文件夹中保留该文件??? $ git rm --cached示例:删除readme文件
十七、git stash
作用:
$ git stash $ git stash list $ git stash apply $ git stash pop十八、git remote
作用:操作远程库。
# 列出已经存在的远程仓库 $ git remote # 列出远程仓库的详细信息,在别名后面列出URL地址 $ git remote -v $ git remote --verbose # 添加远程仓库 $ git remote add <远程仓库的别名> <远程仓库的URL地址> # 修改远程仓库的别名 $ git remote rename <原远程仓库的别名> <新的别名> # 删除指定名称的远程仓库 $ git remote remove <远程仓库的别名> # 修改远程仓库的 URL 地址 $ git remote set-url <远程仓库的别名> <新的远程仓库URL地址>十九、git push
作用:把本地仓库的提交推送到远程仓库。
# 把本地仓库的当前分支推送到远程仓库的相应分支 $ git push <远程仓库的别名> # 把本地仓库的分支推送到远程仓库的指定分支 $ git push <远程仓库的别名> <本地分支名>:<远程分支名> # 删除指定的远程仓库的分支 $ git push <远程仓库的别名> :<远程分支名> $ git push <远程仓库的别名> --delete <远程分支名>二十、git merge
作用:合并分支。
# 把指定的分支合并到当前所在的分支下 $ git merge <分支名称>二十一、git clone
作用:从远程仓库克隆一个版本库到本地。
# 默认在当前目录下创建和版本库名相同的文件夹并下载版本到该文件夹下 $ git clone <远程仓库的网址> # 指定本地仓库的目录 $ git clone <远程仓库的网址> <本地目录> # -b 指定要克隆的分支,默认是master分支 $ git clone <远程仓库的网址> -b <分支名称> <本地目录>二十二、git cherry-pick
作用:把已经提交的记录合并到当前分支。
# 把已经提交的记录合并到当前分支 $ git cherry-pick <commit ID>
协同工作:
(1)不同人修改了不同文件如何处理?
示例:用户1修改了application.properties但还未提交远程,用户2修改了DemoApplication并提交远程成功。
此时用户1的操作如下:
通过报错可以看到本地仓库和远程仓库不是fast-forwards,所以我们要先fetch远程的变动下来
远程仓库和本地仓库版本号不同,所以进行merge(由于改动的文件不同,所以merge没有冲突,很顺利)
最后再推送远程仓库
(2)不同人修改了同文件的不同区域如何处理?
示例:用户1修改了DemoApplication下方区域但还未提交远程,用户2修改了DemoApplication上方区域并提交远程成功。
此时用户1的操作如下:
通过报错可以看到本地仓库和远程仓库不是fast-forwards,所以我们要先fetch远程的变动下来
远程仓库和本地仓库版本号不同,所以进行merge(由于改动相同文件的不同区域,所以merge没有冲突,很顺利)
最后再推送远程仓库
(3)不同人修改了同文件的同一区域如何处理?
示例:用户1修改了DemoApplication上方区域但还未提交远程,用户2修改了DemoApplication同一区域并提交远程成功。
此时用户1的操作如下:
通过报错可以看到本地仓库和远程仓库不是fast-forwards,所以我们要先fetch远程的变动下来
远程仓库和本地仓库版本号不同,所以进行merge(由于改动相同文件的相同区域,所以auto merge有冲突,需要人为判断修改代码)
修复冲突后,使用git add和git commit重新提交冲突文件到本地仓库
最后再推送远程仓库
(4)同时变更了文件名和文件内容如何处理?
示例:用户1修改了DemoApplication上方区域但还未提交远程,用户2把DemoApplication改名为DemoApplicationTest并提交远程成功。
此时用户1的操作如下:
通过报错可以看到本地仓库和远程仓库不是fast-forwards,所以我们直接pull。
远程仓库和本地仓库版本号不同,所以进行merge(由于只是改动相同文件的内容和名字,git有auto merge的能力)
最后再推送远程仓库
(5)把同一文件改成了不同的文件名如何处理?
示例:用户1把index.htm改名为index1.htm但还未提交远程,用户2把index.htm改名为index2.htm并提交远程成功。
此时用户1的操作如下:
通过状态看到有三个标红的文件需要我们处理:
先删除index.htm
再保留index1.htm
最后删除index2.htm
别忘了还要commit修复后的
辅助工具:
(1)gitk --all:图形化操作工具
.git重要目录结构:
(1)HEAD文件
(2)config文件
(3)refs引用
(4)objects对象
分离头指针:
定义:HEAD不止可以指向某个分支,也可以指向某个commit,后者称为分离头指针。
示例:
通常,我们工作在某一个分支上,比如 master 分支。这个时候 master 指针和 HEAD 指针是一起前进的,每做一次提交,这两个指针就会一起向前挪一步。但是在某种情况下(例如 checkout 了某个具体的 commit),master 指针 和 HEAD 指针这种「绑定」的状态就被打破了,变成了分离头指针状态。我那天遇到的情况是,master 和 HEAD 指针看上去指在同一个 commit 上,但其实已经处在分离头指针状态。当我在此时又做了一次新的提交时,HEAD 指针跑到 master 指针前面去了。如果我直接检出 master 分支,HEAD 指针就会回退一格到 master 指针的位置,而最新的那次提交就变成了孤立的提交,没有任何分支能追踪到它,刚才的活白干了。