一、基础知识
-
文件的三种状态
-
已修改
在工作目录修改Git文件(工作区)
-
已暂存
对已修改的文件执行暂存操作,将文件存入暂存区
-
已提交
将暂存的文件执行提交操作,将文件存入本地版本库
-
-
总分支
- git根据.git文件来识别版本库
二、基础知识
创建目录文件夹 mkdir xx
进入目录 cd xx
查看git所在目录 which git
-
创建仓库 git init
当初始化一个仓库的时候,会自动创建一个默认branch(主分支,master)
由于在git中,所有的操作都是在某个分支下进行的
查看当前目录下的内容(看不到隐藏目录) ls
查看当前目录下的隐藏目录(蓝色是目录/白色是文件) ls -al
git config --global user.name "xx"设置用户名,多次设置会覆盖上一次的设置
git config --global user.email “you@example.com”,设置通信邮箱
-
配置文件
git config 直接输 获得所有命令用法:比如:git config user.name(获得用户名)
-
/etc/gitconfig(几乎不会使用)
情况:一台主机多个用户同时使用一个账号,争对于操作系统
命令:git config --system
-
~/.gitconfig(常用)
情况:单个用户创建多个仓库使用同一个账号,争对于单个用户而言
命令:git config --global
-
.git/config(常用)
情况:不同项目不同账号,即使同一个用户,争对于特定项目(仓库)
命令:git config --local
以上三种都设置的话,根据优先级倒序递减(4 > 3 > 2)
git add 将已修改的文件纳入到暂存区中
git add . 将工作区的新文件/已修改的文件全部纳入到暂存区中
-
git commit 将暂存区中的文件纳入到版本库中
- 由于Git是对提交文件有强制日志信息的输入,因此单单只有当前这语句,会出现以下界面让开发者进行输入说明信息,用法与编写文本文件是一样的
若不输入信息,则会被终止提交操作,即该文件无法提交到版本库中
提交之后(已提交状态):
-
普遍用法:git commit -m '说明文字'
其中会出现对该文件的修改的记录
git commit --amend -m "说明文字" 将上一次的提交说明文字进行修正,覆盖上一次的提交信息
git rm 删除版本库中特定的文件
git help 获取git的帮助信息
git help config/git config --help/mon git-config(此为linux下的查看文档)
-
git log 查看提交日志文件
图中红色部分序列号,是摘要值(commit id),根据文本通过sha1算法所计算出来的摘要值
如果log有很多,可以有以下的快捷键来进行查看空格 往下翻看
q退出当前日志查看
ctrl + f 往下翻看/ctrl + d
git log -n 查看最近的n条日志信息
git log --pretty=oneline将日志信息以摘要值+ 说明文字以行来显示
git log --pretty=format:"%h-%an,%ar-%s" 将日志信息以一定的格式来进行显示,其中h代表摘要值,an代表用户名,ar代表提交时间,s代表说明文字,其他的查看文档进行查阅
git log --graph 以图形化的方式查看log信息
git log --abbrev-commit 将commit id以缩写的形式显示
以上的显示方式可以进行组合
git diff 文件在不同状态下的差别,比如:暂存区与版本库中文件的差别
git pull 从远程版本库中的文件拉取到本地
git push 将本地版本库中的内容推送到远程
rm -rf /*将操作系统中的文件全部删除,特别小心
rm -rf .gt将当前目录下的.gt文件以及.gt文件下的文件全部删除(逐级删除)(需将隐藏目录进行显示之后才能删除即先进行ls -a操作)(同样适用于删除当前目录下的其他文件)(永久删除)(也可以删除文件夹)
cd .. 回到上层目录
touch xx.txt 创建文件
ctrl + c抛弃当前行 开启新的一行进行输入
ctrl+a 将光标移动到输入行的最开始的位置
ctrl+e 将光标移动到输入行的最末尾的位置
vim xx.txt 对当前文件进行修改,刚敲入时是命令模式,点击【i】切换为插入模式,输入完之后保存按【esc】进入命令模式,输入【:wq】其中【w】为将输入内容写入当前文件,【q】表示退出,【enter】
若没有此文件,就会进行创建该文件-
cat xx.txt查看文件内容
git status 查看当前的工作区所处的状态
git reset HEAD xx.txt 将文件从暂存区(stage,index)移除到工作区
git checkout -- xx.txt 相对于暂存区的最后一次提交将已修改的文件丢掉其修改操作,(由于只要放到stage中就会被git管理,而里面的内容就会成为定夺的,而该命令是针对于还没有提交,只是在修改之后临时返回的一种操作)
-
git checkout commit_id 切换到commit_id提交点,在该提交点上可进行相应的修改(以游离状态),修改之后必须提交(commit)之后,git会保留当前提交的log,并在之后用于可创建新的分支时使用,并可以将该新创建的分支(带有修改后的log信息)进行合并保留,示意图如下:
例子:查看当前master下的提交信息
可以看到切换到提交点39f3f8f之后,git提示当前处于游离状态并且HEAD指针指向39f3f8f提交点,可以在当前提交点进行任意的操作并且提交,git会对你本次的提交进行保存,以便于在创建新分支时进行添加使用
在39f3f8f提交点下修改test5.txt文件之后提交,可以看到HEAD指向了后一个提交点,同时目前所处的提交点也切换为当前所指
切换到master下出现warning信息,提示如果没有保留修改,则会遗留掉之前的修改,而如果要保留修改就要采用新建一个分支保留修改信息
创建新分支保留修改之后发现即从提交点39f3f8f新建的分支
因此如果直接删除,git会提示你没有merge,否则需要git branch -D branch_name的形式进行删除 git rm --cached xx.txt 将已暂存的文件回退到已修改状态,即将文件在暂存区中删除(删除暂存区中的文件)该删除之后的记录也是在暂存区中存放的,唯一不同于git rm的是,该删除不删除工作区中的文件,而git rm会将工作区中的文件一并删除
-
git rm (git删除)删除本地库中的文件(同时当前目录下该文件也不存在),将被删除的文件记录纳入暂存区中(该文件而已),若想恢复被删除的文件,需要两个动作:
git reset HEAD xx.txt,将待删除的文件从暂存区恢复到工作区,但此时文本内容还没有恢复(同时文件也没有恢复,找不到该文件)
git checkout -- xx.txt 将工作区中的修改丢掉,恢复原来的文本内容以及撤销对该文件的删除操作(直接写这一步骤而没有上一步,是不行的,原因是:该操作争对于放在工作区中的文件,但是如果该文件没有恢复到工作区,是无法执行的)/git restore xx.txt文件也可一样的意义操作
当执行完删除命令,并将该事件的执行提交git commit -m 'xx'之后,该文件就不能再通过此方式恢复,系统认为该文件是通过思考之后确定需要删除的文件即不后悔的文件
rm xx.txt 通过操作系统命令来删除,将文件xx.txt删除,而此时被删除的文件没有纳入暂存区中,当需提交git commit -m "xx" 当前删除操作的时候,由于不存在于暂存区中,因此此操作无法提交,需要先git add 到暂存区。而对于该文件的恢复操作与git rm xx.txt是一样的
pwd 获取当前所处的目录
shift + a将光标移到文字最后,并将命令模式转换为插入模式(争对修改某一个文件)
git restore xx.txt将文件的修改回溯到原来的状态(已删除的文件无法恢复到原来的状态)(需要先将删除的文件git reset HEAD xx.txt/git restore --staged xx.txt)
echo '文本' > xx.txt 将文本内容覆盖xx文件中 (重定向,默认输入到终端,但是可以改为输入到文件中也是可得)(没有xx.txt就会新创建一个文件)
git ls-files 获取已暂存 + 已提交状态的文件
-
git mv old.txt new.txt 将old文件名改为new的文件名,由于mv是move即移动的含义,将文件移动到当前文件夹中,也即将原来的文件进行覆盖,完成重命名操作
可以看到当前文件被重命名,并且由于文件被修改了,被存放在了暂存区(changes to be committed)
将暂存区中的文件恢复到工作区
可以看到文件出现了一个原来的test1.txt文件成为了被删除文件,并且出现了一个重命名的新的文件,原因:git mv xx.txt操作是删除原来的文件,创建一个新的并且和原来的文件内容一样的文件,所以恢复的时候,恢复的是删除的状态
继续恢复工作区操作,可以看到恢复成功之后多出来了一个新命名的文件,且内容和原来的文件一样,如果要保持一个文件,需要在恢复过来之后将新建的文件删除git rm test.txt
git mv和git rm一样,其操作都是交由git来管理,且恢复文件新增加的文件也在暂存区中,也交由git管理 -
mv 操作系统重命名命令 其操作不会交由git管理
执行mv之后可以看到删除了原来的文件test2.txt且新文件test3.txt没有纳入暂存区,也即没有被追踪,如果将新文件加入到暂存区,为修改状态
只有将源文件以及新文件都加入暂存区被git管理,其才能与git mv一样识别出其的状态
之后的恢复操作和git mv一样,且都会新增一个文
-
争对于git add .会将工作区中的新文件/修改文件/删除文件 全部都纳入到暂存区中,由于并不是所有的文件都需要纳入到暂存区中,因此解决的方法为:
新增.gitignore(忽略文件)隐藏文件
在.gitignore文件中添加不需要纳入暂存区中的文件
并将.gitignore文件提交到版本库中
此后有不需要提交到暂存区的都可以添加到.gitignore文件中,由于每次的修改都是对.gitignore文件的修改,因此每次都要重新add -> commit
空文件不会被纳入到暂存区中
-
在.gitignore文件中可以使用通配符,来更方便的指明要忽略的文件(其中在该文件中写上#xxx #之后的内容都会被注释掉 )
- /TODO 即忽略项目根目录下的文件/文件夹,若写成/TDDO/即忽略TDDO文件夹下的全部文件(其中空文件夹不会被git识别)
- build/ 即在根目录下存在的文件夹,会忽略该文件夹下的内容
- doc/xx.txt doc/*.txt 忽略指定的目录下的文件或者以txt结尾的文件
- doc/**/xx.txt忽略doc目录下的文件下的文件下的xx.txt文件
mkdir xx && cd xx 创建目录xx并进入目录xx
git commit -am "说明文字" 添加当前目录下所有已修改的文件并提交到暂存区并提交到本地版本库中