1. 初始化
1.1 初始化git目录
git init
1.2 设置字符编码
在git中默认编码会导致日志信息中文乱码,所以一般还会进行编码设置。
# 下面4个参数在 cmd 和 git bash 环境下都可以执行,由于是全局参数,所以执行一次即可
git config --global core.quotepath false
git config --global gui.encoding utf-8
git config --global i18n.commit.encoding utf-8
git config --global i18n.logoutputencoding utf-8
# LESSCHARSET 参数则命令不同,详见如下:
# git bash 环境下
export LESSCHARSET=utf-8
# cmd 环境下:
set LESSCHARSET=utf-8
注:其中上面的LESSCHARSET
设置只对当前的命令窗口有效,所以要想全局有效,最好还是设置成为系统环境变量。
2. 创建git忽略文件(.gitignore)
创建git版本控制的忽略文件,配置哪些文件或文件夹不需要被git进行跟踪管理
touch .gitignore
.gitignore
文件每一行一个规则,可以使用通配符。
# 忽略所有class文件
*.class
# 忽略该文件夹下的所有文件
out/
# ......
3. 向暂存区(stage)添加文件
# 方式一、添加指定文件,可以有多个文件,用空格隔开
git add <file> <file2> <file3> ...
# 方式二、添加目录所有需要跟踪的文件
git add .
注:后续中的<files>
则表名可以有多个文件,中间用空格隔开,如:<file> <file2> <file3> ...
4. 将暂存区文件提交到仓库
git commit -m "<提交的日志信息>..."
5. 查看状态命令(status)
查看git跟踪的当前状态。执行后会列出当前git跟踪的文件有哪些变化,一般有一下几种状态
git status
5.1 未添加到暂存区的文件
Untracked fiels
表示该文件是新的未被git跟踪管理的文件
Changes not staged for commit
表示该文件是有修改的老文件
deleted
表示该文件之前有被跟踪但是现在被删除了
注:还没有添加到怎存取的文件,在查看状态时,文件的文件名显示为红色
5.2 已添加到暂存区但还未提交到仓库
new file
表示该文件是新的被跟踪的文件
modified
表示该文件是有修改的老文件
deleted
表示该文件之前有被跟踪但是现在被删除了
注:还没有添加到怎存取的文件,在查看状态时,文件的文件名显示为绿色
6. 撤销和恢复
6.1 撤销工作区的修改
当文件修改后且没有添加到暂存区时,此时想要撤销工作区的修改,可以使用checkout
或restore
命令
# 方式一
git checkout <files>或.
# 方式二(新版)
git restore <files>或.
6.2 撤销暂存区的修改
当文件修改并已经添加到暂存区但没有commit时,此时想要撤销暂存区的修改,可以使用reset
或restore
命令,执行后,暂存区的指定文件将会被撤销修改(即:从暂存区删除),但是工作区的文件不会发生变化,相当于撤销了git add
的命令,使文件处于待添加到暂存区的状态()
# 方式一
git reset <files>或.
# 方式二(新版)
git restore --staged <files>或.
6.3 reset从仓库来恢复版本
从仓库来恢复,可以分为3个模式,soft
,mixed
,hard
,其中如果没有指定该参数,则默认为mixed
# 总体语法
git reset --soft或mixed或hard 仓库版本(可以写id也可以写head~*等等)
6.3.1 soft(用的较少)
仅仅只是撤销已提交的版本库,不会修改暂存区和工作区(就像撤销commit一样,查看status
时,显示的绿色,处于待提交状态)。如果需要将指定的版本继续恢复工作区的修改,请分别执行6.2
和6.1
中的命令即可
# 将仓库指定版本放入暂存区(staged),但是工作区并没有变化
git reset --soft 版本id或head~*
6.3.2 mixed(用的较少)
仅仅只是撤销已提交的版本库和暂存区,不会修改工作区(就像先撤销commit
,然后再撤销add
一样,查看status
时,显示的红色,处于待添加到暂存区状态),此时工作区与暂存区就会存在差异,可以进行对比查看。如果需要将指定的版本继续恢复工作区的修改,请执行6.1
中的命令即可
# 将仓库指定版本放入暂存区(staged),但是工作区并没有变化
git reset --mixed 版本id或head~*
6.3.3 hard(常用)
彻底将工作区、暂存区和版本库记录恢复到指定的版本库。查看status
显示工作目录为干净状态,就像强制恢复到某个版本一样。
# 将仓库指定版本直接更新到工作区
git reset --hard 版本id或head~*
6.4 checkout从仓库恢复指定文件
当需要从版本仓库中恢复指定的文件到工作区时(不需要恢复整个版本),则可以使用checkout
命令
git checkout 版本id或head~* <files>或.
7. 分支(branch)
7.1 创建分支
# 方式一、创建分支后,不会切换到新建的分支,仍然停留在原始分支
git branch <分支名称>
# 方式二、创建分支后,同时会切换到新创建的分支
git checkout -b <分支名称>
# 方式三(新版)、创建分支后,同时会切换到新创建的分支
git switch -c <分支名称>
7.2 切换分支
# 方式一
git checkout <分支名称>
# 方式二(新版)
git switch <分支名称>
7.3 合并分支
一般在合并前,先切换到上级分支或主线分支(如:master),因为一般是将支线分支合并到主线分支
git checkout master
7.3.1 无冲突合并(快速合并)
# 无冲突合并分支
git merge <分支名称>
当合并分支没有冲突时,则会执行快速合并,此时只需要移动HEAD
指针即可,合并完成后会有Fast-forward
提示,表示当前合并为快速合并
7.3.2 有冲突合并
# 有冲突合并分支
git merge <分支名称>
# 当提示 CONFLICT.....<file>时,表示有文件冲突
<手动处理有冲突的文件>此步骤省略...
# 手动处理冲突文件后,再重新提交
git add .
git commit -m "<提交日志...>"
当合并分支有冲突时,会提示有冲突的文件CONFLICT (content): Merge conflict in <file>
,此时需要手动处理有冲突的文件的修改,在手动处理完有冲突的文件后,最后在重新添加到暂存区和提交到仓库。
在手动处理有冲突的文件时,会看到Git用<<<<<<<
,=======
,>>>>>>>
标记出不同分支的内容。
如:在master分支上开启新的分支dev后,然后在master和dev2个分支上都对同一个文件进行了修改,因此在合并时,才会导致合并冲突,因为git不知道该保留哪个分支的修改,所以需要人工手动处理。
7.4 删除分支
git branch -d <分支名称>
8. 远程仓库
8.1 远程仓库克隆
将远程仓库的整个项目克隆到本地。同一个目录只能克隆一次。
# 克隆远程仓库
git clone <url>
8.2 远程仓库别名
给远程仓库的url添加一个别名,这样用别名来代替URL,操作起来更方便。
# 添加远程仓库url并指定别名,其中<分支名>可以省略,默认为master
git remote add <别名> <分支名> <url>
# 查看已经保存的远程仓库别名
git remote -v
8.3 pull
从远程仓库拉取到本地
将远程仓库的项目拉取到本地。
git pull <远程主机名> <远程分支>:<本地分支>
其中本地分支
可以省略,例如:
# 将远程仓库的master分支拉取到本地,本地分支省略,则为当前分支
git pull origin master
# 将远程仓库的master分支拉取到本地与本地的dev分支进行合并
git pull origin master:dev
# 将远程仓库的master分支强制拉取到本地并进行合并
git pull --rebase origin master
8.4 push
从本地提交到远程仓库
将本地仓库提交到远程仓库。
git push <远程主机名> <本地分支名> <远程分支名>
其中远程分支可以省略。例如:
# 将本地分支提交到与远程同名的分支,若远程分支不存在,则会新建
git push origin master
# 如果当前分支与多个主机存在追踪关系,则可以使用 -u 参数指定一个默认主机,这样后面就可以不加任何参数使用git push
git push -u origin master
# 当遇到这种情况就是不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机,这时需要 -all 选项
git push --all origin
# git push的时候需要本地先git pull更新到跟服务器版本一致,如果本地版本库比远程服务器上的低,那么一般会提示你git pull更新,如果一定要提交,那么可以使用这个命令。
git push --force origin
一般情况,当从提交本地仓库到远程仓库时,先会进行git pull origin master
一下,同步本地与远程仓库的版本,之后再进行git push
。但是,如果远程仓库版本比本地仓库版本更新时,会提示error: failed to push some refs to
错误,此时需要执行如下命令:
# 选择一:要么继续拉取,完成拉取的操作,之后就可以push了
git rebase --continue
# 选择二:取消拉取,放弃拉取的操作
git rebase --abort
9.常见问题
9.1 文件未修改但是git仍然提示有变动
待续
9.2 git本地仓库文件损坏(意外断电或蓝屏等等)
使用fsck
命令来本地指定仓库的一致性检查,执行后,会列出哪些git文件检查不通过(即:文件损坏了),然后自己进入.git
文件夹中,将对应的损坏文件手动删除掉;
# 先使用fsck命令来检查git本地仓库
git fsck --full
然后执行fetch
命令从远程仓库拉取新的版本;
# 从远程仓库拉取所有分支
git fetch --all
最后切换的指定的分支即可,然后就可以正常的pull
和push
了。
# 强制切换分支
git reset --hard origin/master
# 重新拉取
git pull
9.3 强制覆盖本地仓库
依次分别执行以下命令:
# 1.从远程仓库拉取所有分支
git fetch --all
# 2.强制切换分支到指定分支
git reset --hard origin/master
# 3.重新拉取(此时已经是最新的了,这里的拉取只是为了验证是否拉取正常)
git pull