一、使用git前需要做的最小配置
1、设置user.name和user.email
git config --global user.name 'your_name'
git config --global user.email '[email protected]'
2、config
的三个作用域
git config --local # 只对某个仓库有效;缺省时,等于```local```
git config --global # 对当前用户所有仓库有效
git config --system # 对系统所有登录的用户有效
显示config
的配置,加--list
即可
git config --list --local
git config --list --global
git config --list --system
q
键退出查看页面
二、创建git仓库
有两种场景
1、把已有的项目加入到git管理
将本地已有项目上传到新建git仓库
2、新建的项目加入到git管理
cd 某个文件夹
git init you_project # 会在当前路径下创建和项目名称同名的文件夹
cd you_project # 该文件夹下会有个.git的隐藏文件夹,是git的核心文件,不能删
三、通过commit
来认识工作区和暂存区
# 工作区就是本地有.git文件的目录
git add index.html git-logo # 从工作区添加到暂存区
git commit -m "正常提交1" # 正式提交和说明;从暂存区提交到版本历史
三、提交过的文件改名
场景:readme改名成readme.md
方式一:
mv readme readme.md # 删除readme ,新增readme.md
git add readme.md # 把readme.md 添加到暂存区
git rm readme # 删除暂存区的readme
git status # 查看状态,此时git的打印区会显示readme改名成了eadme.md
- 清空暂存区的所有文件(很危险,建议不要用)
git reset --hard
方式二:
git mv readme readme.md # 直接暂存区改名
git status # 查看状态,此时git的打印区会显示readme改名成了eadme.md
git commit -m "readme 改名为 readme.md" # 从暂存区提交到版本历史
四、查看版本演变历史日志
git log
- 查看列表
git log --oneline
- 指定最近的4次commit
git log -n4 --oneline
- 查看所有分支的日志
git log -all
- 图形化查看日志
git log --all --graph
- 也可以用图形化界面来查看历史日志
gitk # 打开图形化界面
五、分支相关的命令
- 创建分支
$ git branch test
- 切换分支
git checkout iss53
- 创建并切换分支
git checkout -b test
- 查看现有分支以及关系
git branch -av
或
gitk -all
- 删除分支
git branch -d test
或:
git branch -D test
六、commit
相关的命令
- 正式提交和说明;从暂存区提交到版本历史
git commit -m "说明"
- 查看commit历史日志
git log -x
,x可指定次数 - 修改最近一次commit的message
git commit --amend
,会进入一个vi界面,可在里面对commit的message内容进行修改,操作方式和vi一样 - 修改历史commit的message
1.首先输入命令:git rebase -i 要修改的commit的父commit的hash id号
2.然后在reabse界面中,进行内容修改。由于现在要对4292430
开头的commit版本的message进行修改,所以相对的行中的pick
改成reword
,然后:wq!
保存退出
3.在步骤2后,会自动跳转到4292430
开头的commit版本的vi内容页面,此时修改界面的message内容,并:wq!
保存退出即可
-
把连续的多个commit整理成1个commit
1.首先查看历史commit:git log -条数
2.假设想要合并最近的4次的commit,那么则填写最旧一次的父级commit的id(也就是倒数第5次的):git rebase -i 倒数第5次的id
3.在界面中,把需要合并的版本前面的pick
改成s````;注意,要被合并到的版本内容无需改动。然后
:wq保存退出 4.步骤3后,会跳出个说明界面;在界面中,填写本次合并的原因,并
:wq```保存退出
-
把间隔不连续的多个commit整理成1个commit
示例:合并图中的2个commit
1.因为要合并的其中一个commit,属于最初的父级,所以id写它的即可:git rebase -i xxx
2.打开的文件内容中,只会有父级以外的内容(这里只有2条),所以需要手动加入最初父级的操作内容信息
3.把要合并的commit版本的内容复制,写到要被合并的commit版本的下面,然后把pick
改成s
,接着删除原本的内容(如果有多条也是如此操作),然后:wq
保存退出
4.步骤3后,会跳出个说明界面;在界面中,填写本次合并的原因,并:wq
保存退出
-
清除最近的几次commit提交(把HEAD、暂存区和工作区都恢复到指定commit版本的文件情况)
1.首先查看最近的几次提交git log
2.恢复内容到指定的commit版本(谨慎使用):git reset --hard commit版本的hash id
查看不同分支最新的commit的差异
1.所有文件差异:git diff 分支名1 分支名2
2.指定文件差异:git diff 分支名1 分支名2 -- 文件名1 文件名2 ...
PS.其实分支名就是个指针,会指向该分支的最新一次的commit提交查看不同commit提交的差异
1.所有文件差异:git diff commitId1 commitId2
2.指定文件差异:git diff commitId1 commitId2 -- 文件名1 文件名2 ...
七、暂存区相关的命令
-
比较暂存区和head所含文件的差异(head意思是最近一次commit版本提交;也就是当前分支的文件和最近的一次commit的文件作比较)
git diff - -cached
1.假设当前版本历史有个test.md文件
2.此时在本地对test.md文件进行了修改,并git add test.md
到暂存区
3.此时可以使用git diff - -cached
来查看存区和head所含文件的差异
-
比较工作区和暂存区所含文件的差异
git diff
默认就是工作区和暂存区所含文件的差异
1.现在在本地修改test.md
文件和创建一个空白test2.md
文件
2.然后git diff
查看工作区和暂存区所含文件的差异
3.结果是test2.md
文件并没有出现在差异结果中,因为它还没归git管理,并且还没添加内容(注意:git是按照文件内容来进行管理的,如果2个不同文件,内容一样,在git管理中,是一个blob文件)
git diff
1.默认情况,是查看工作区和暂存区所有包含文件的差异
2.指定查看某些文件在工作区和暂存区的差异:git diff -- 文件名1 文件名2 ...
3.如果需要查看head和暂存区的:git diff - -cached
八、文件恢复相关的命令reset
-
让暂存区恢复成和HEAD的一样
有时候会出现想要把git add
到暂存区的文件,恢复成和当前分支最新的commit版本(也就是HEAD)的一样:git reset HEAD -- 文件名1 文件名2 ...
(不写文件名则是全部文件)
-
让工作区恢复成和暂存区的一样
checkout
有时候会出现在本地进行文件修改后,不想要了,想要恢复成和git add
到暂存区的文件内容一样:git checkout -- 文件名1 文件名2 ...
(不写文件名则是全部w)
九、正确删除文件
- 方式1
1.首先工作去删除文件
2.然后暂存区删除文件:git rm 文件名
- 方式2(推荐)
git rm 文件名
十、
一部分文件在暂存区了,一部分还在工作区修改,此时有bug需要临时进行修复。此时可以把手头的工作放到一个区域,等bug修复完毕后,再把工作去回复到以前的状态。
1.先把手头的工作放到一个区域:git stash
2.查看stash:git stash list
3.查看status:git status
4-1.当修改完bug后,再回复回去:
git stash apply
(把stash的文件回复到工作区,但是stash中的东西不会进行删除)
4-2.第二种方式,就是使用
git stash pop
(把stash中的内容删除,并回复到工作区)
11、指定不需要git管理的文件
在.git
同级目录下,创建.gitingore
文件,不同语言的不一样,可参考:https://gitee.com/BattleCall/gitignore
git fetch
和git pull
的区别
git fetch
是将远程主机的最新内容拉到本地,用户在检查了以后决定是否合并到工作本机分支中。
而git pull
则是将远程主机的最新内容拉下来后直接合并,即:git pull = git fetch + git merge
,这样可能会产生冲突,需要手动解决。
12、同个分支中,不同人修改了不同的文件
1.克隆项目到本地:git fetch xxx
2.查看当前项目本地分支和远端分支:git branch -av
3.让本地分支和远端分支相关联(feature分支):git checkout -b 远端分支 本地分支
4.添加修改的文件:git add xxx
5.提交文件:git commit -m "aabbcc"
ps. 如果出现远端项目的文件或内容,比本地的多或者不一样(冲突),那么则需要合并:git merge 远端分支
13、同个分支中,不同人修改了同个文件的不同区域内容
后来者进行push
时,会报错
- 解决方法
1.先fetch:git fetch
2.查看分支情况:git branch -av
3.merge合并分支(共同管理的是feature分支):git merge
(如果弹出个merge页面,则代表成功了)
4.可以cat查看下那个文件内容,确定是否合并成功
5.再进行push:git push
14、同个分支中,不同人修改了同个文件的同个区域的内容
1.pull本地项目和push远程项目时,都会报这个文件的冲突错误
- 解决方法1:手动解决冲突
1.vim 进入冲突的文件,进行内容修改
2.查看当前状态:git status
3.如果我们做的变更ok的,那就直接:git commit -m "解决冲突"
4.push到远端:git push
15、A变更了文件名和B变更了文件的内容,同时commit,变更文件名的先push(成功),变更内容的后push(报错)
- 解决方法
1.git能够主动帮助我们解决这个问题:git pull
2.然后查看当前文件情况:ls -al
,此时文件名和里面的内容都已经同步到最新的(新的文件名和新的内容)
16、多人把同个文件的文件名修改成了不同的文件名
这种情况无法直接使用get pull
解决,它会把文件都拉下来,让我们手动解决这个情况
- 解决方法
1.查看下状态:git status
2.经过协商,最终名字是index1.htm
3.删除最初名字的文件:git rm index.htm
4.添加想要的文件名到暂存区:git add index1.htm1
5.删除不想要的名字的文件:git rm index2.htm
6.查看下状态:git status
7.提交:git commit -m "解决冲突,文件名使用index1.html"
8.同步到远端:git push