Git常用操作和命令
本地库操作
查看git命令帮助文档
- 该命令执行后会弹出浏览器,在浏览器中显示帮助文档,由于机器性能原因,该命令执行后会稍有延时的打开文档,需要等待
- 在浏览器中显示的html页面是本地的静态页面
#init是查看init命令的帮助文档
git help init
创建或初始化本地库
- 如果这个路径已有本地库,则恢复至初始状态
- 该命令会在该路径生成一个隐藏的git文件夹,不要删除该文件夹下的文件,也不要随意更改
#创建、初始化该路径
git init
#在该路径下创建demo文件夹,并将其创建为本地库。若该文件夹存在,则将其初始化
git init demo
删除本地库
- 删除本地库只需要删除该本地库中的隐藏git文件夹即可
如果项目文件也不要保留,则直接删除项目目录即可
设置签名
- 目的是为了区分不同开发人员的身份,需要设置用户名和邮箱,签名有项目级别的签名和系统用户级别的签名,两者必须设置一个。
- 项目级别签名设置的结果会配置进.git/config文件中,系统用户级别的配置结果会配置进系统用户根目录下的.gitconfig文件中
- 这里设置的用户名和邮箱与GitHub帐号无关,设置的邮箱也不会给邮箱发送邮件,仅仅是为了辨别身份
#项目级别:仅在本地库范围有效,优先级高
git config user.name jerry
git config user.email jerry@qq.com
#系统用户级别(操作系统登录的用户):在当前操作系统的所有本地库有效
git config --global user.name jerry
git config --global user.email jerry@qq.com
查看项目状态
- 如果有新添加或修改的文件,使用该命令,这些文件会高亮显示
- 该命令还显示了暂存区和本地库的状态
git status
添加文件至暂存区
- 暂存区记录即将提交的文件,不要将不准备提交的文件添加至暂存区
- 只有将文件提交到暂存区后,才能提交到本地库,且提交到本地库的文件是暂存区文件,并非工作区文件
#添加所有变更文件及子目录下的文件至暂存区
git add .
#添加单个变更文件至暂存区
git add demo.txt
#添加子目录下的变更文件至暂存区
git add com/app.txt
从暂存区撤销文件
git rm --cached demo.txt
提交暂存区至本地库
- 如果是文件修改,可以不用
git add
而直接使用该命令提交,但如果是新文件,就必须先git add
,然后使用该命令 - 将文件提交至本地库时可以为本次的提交设置备注信息,这个操作不是必须的
#将暂存区的某个文件提交至本地库。使用该命令成功后,会进入vim编辑页面,这个页面中可添加备注消息。操作vim与linux操作vim的方式一致
git commit demo.txt
#可以使用 -m 参数,直接添加备注消息
git commit -m "git demo" demo.txt
#将暂存区的所有文件提交至本地库
git commit -m "commit all"
查看项目操作日志
#显示完整的日志信息
git log
#以一行形式显示日志信息
git log --pretty=oneline
#以一行形式显示日志信息,且简化索引
git log --oneline
#显示完整的日志信息,且显示指针与步长
git reflog
回滚项目版本
- 回滚项目版本是指将工作区、暂存区的文件恢复到某个版本的状态
- reset命令常用参数:
--soft
:仅改变本地库版本,不会改变工作区和暂存区版本--mixed
:仅改变本地库和暂存区版本,不会改变工作区版本--hard
:本地库、暂存区和工作区版本都改变 - 这里演示的HEAD是master分支的指针
#根据版本索引移动版本,可前进可后退,使用后,log依然包含所有版本
git reset --hard 7c213d1
#使用散列值移动版本,可前进可后退,使用后,log依然包含所有版本
git reset --hard HEAD@{1}
#使用^移动版本,只能后退不能前进,HEAD后有几个^就移动几步,使用后,log只显示目前版本和之前版本
git reset --hard HEAD^
#使用~移动版本,只能后退不能前进,~后是数字几就移动几步,使用后,log只显示目前版本和之前版本
git reset --hard HEAD~1
比较文件差异
- 默认是与暂存区的版本对比
- 可以与本地库的历史版本对比
- 命令带文件名是对比单个文件的差异,不带文件名是对比当前工作区所有文件差异
#将当前工作区的demo.text与暂存区demo.text对比差异
git diff demo.text
#将当前工作区的demo.text与上一个历史版本比较差异
git diff HEAD^ demo.text
#将当前工作区的所有文件与暂存区对比差异
git diff
#将当前工作区的所有文件与最新历史版本比较差异
git diff HEAD
分支操作
查看当前项目所有分支
git branch -v
创建分支
#创建一个名为new_branch的分支
git branch new_branch
切换分支
#切换到new_branch分支工作
git checkout new_branch
删除分支
#删除不是当前所在分支的分支
git branch -d new_branch
恢复分支
#通过散列值恢复分支
git branch new_branch HEAD@{1}
#通过^恢复分支
git branch new_branch HEAD^
#其他恢复方式与回滚项目版本中方式一致
合并分支
- 合并分支前需要将分支切换到要合并到的分支处。
- 例:要将new_branch这个分支合并到master分支,就需要先通过
git checkout
切换到master分支再进行操作
#将new_branch这个分支合并到当前分支
git merge new_branch
合并分支冲突解决
- 冲突出现的原因:两个分支中存在同版本对同一个文件同一处的修改
- 冲突出现时git的表现:命令行显示(分支名|MERGING),表示处于合并状态,已产生冲突。查看冲突文件,git会为冲突部分添加标注
- 解决冲突,首先要手动修改冲突文件内容,选择哪里保留哪里舍弃,再进行以下操作:
#将冲突状态标记为已解决
git add demo.text
#退出合并状态,也可通过 -m 参数添加注释消息,切记不能带文件名,本次操作是退出合并状态而不是将文件提交到本地库
git commit
远程库操作
为远程库地址建立别名
#test是别名,https://github.com/rawlins2397/test.git是远程仓库地址
git remote add test https://github.com/rawlins2397/test.git
查看建立的所有别名
git remote -v
重命名别名
#将已有别名test重命名为test1
git remote rename test test1
删除别名
#删除已有别名test
git remote remove test
推送本地库至远程库
- 该命令执行时会要求输入远程库的账号和密码来验证身份
- 该命令涉及文件上传操作,由于网络原因,需要等待上传完毕
- 如果通过别名推送,则克隆者将别名也会克隆
#需要指定远程库地址和要推送的分支
git push https://github.com/rawlins2397/test.git master
#远程库地址可是使用别名代替,这里的test是别名
git push test master
克隆远程库至本地库
- 克隆操作会将完整的远程库克隆到本地,完整是指克隆操作会进行SHA-1哈希加密算法校验以保证项目不会在网络传输过程中出现数据丢失
- 本地目录不需要
git init
初始化为本地库,克隆成功会自动初始化 - 若推送者通过别名推送本地库,则克隆时将配置的别名也会创建
git clone https://github.com/rawlins2397/test.git
拉取远程库至本地库
- 拉取远程库与克隆的不同是,拉取表示本地已有该项目的本地库,只是拉取最新版本的文件来合并
- 拉取有两种方式:直接使用
git pull
和分步使用git fetch
和git merge
git pull
命令是git fetch
和git merge
的结合
#该操作将远程库的分支拉取到本地库的一个分支,并没有进行合并,test是远程库别名,master是要拉取的远程库的分支,这个分支拉取成功后可通过test/master来使用
git fetch test master
#将fetch拉取的分支合并到当前分支
git merge test/master
#通过pull可以直接将别名为test的远程库master分支拉取并合并到本地当前分支
git pull test master
同版本推送冲突解决
- 在多成员开发过程中,对于同版本同文件的修改,优先推送的人员会推送成功,后推送的人员推送时会提示先拉取再推送,这就是同版本推送冲突的表现
解决同版本推送冲突,先将远程库中最新版本拉取到本地,由于拉取的分支和本地分支合并时会产生冲突,可参照合并分支冲突解决来解决冲突
SSH公钥生成
- SSH公钥可以实现本地库与远程库的免密安全传输
- 一个操作系统的一个账户只有一个SSH公钥,因此通过SSH与远程库绑定也只适用于用户通常只操作一个操作系统账户和一个远程库账户的情况
#切换到用户根目录,查看是否存在something 和 something.pub 来命名的一对文件,这个 something 通常就是 id_dsa 或 id_rsa,如果有,打开.pub文件,其内容就是SSH公钥
cd ~/.ssh
ls
#若不存在,则需要创建一个SSH公钥
ssh-keygen -t rsa -C "rawlins2397@example.com"
#ssh-keygen的参数为:-t 指定密钥类型,默认是 rsa ,可以省略。-C 设置注释文字,通常为邮,注意C必须为大写。-f 指定SSH存储的文件名。
#运行命令后,若没有使用-f参数,则会提示输入文件名,可回车使用默认值。还会要求输入两次密码,这个密码是用于使用SSH公钥的密码,而非登录远程库帐号的密码,若不需要,直接回车忽略
#.pub文件,其内容就是SSH公钥
推送至远程库时忽略文件
- 项目中通常会有代码编辑器产生的配置文件,这些配置文件与项目本身无关,因此在将项目推送至远程库时,需要设置忽略推送这些文件
- 代码编辑器产生的配置文件如果不忽略推送,将危害项目开发,因为这些配置文件是与代码编辑器的版本相关的,不能保证一个项目只能使用同一版本的编辑器,所以不忽略将会产生不必要的合并冲突
- 前往https://github.com/github/gitignore可查看相关语言项目的忽略文件
- 编写文件,这个文件的内容参考上述网址,还可自定义要忽略的文件和类型,并在~/.gitconfig 文件中(如果只需要一个本地库来设置忽略,则在本地库的.git/config中配置)引入上述文件
[core]
excludesfile = C:/Users/rawlins/Java.gitignore