简单配置
git config --global user.name "your_name"
git config --global user.email"your_email@domain.com"
- config的三个作用域, 默认是local
- local只对某个仓库有效
git config --local
git config --global
git config --system
git config --list --local
git config --list --global
git config --list --system
#cd 项目代码所在目录
git init
#cd 某个文件夹
git init your_project
cd your_project
如何提交文件
- 在工作目录中修改或者新建的文件,需要先提交到暂存区
- 将文件添加进暂存区,add可以添加多个文件及文件夹,.代表所有的
git add file_name or dir_name
git commit -m"describe"
git status
- 将所有已经被版本控制的文件,进行更新提交,不用在写上那些文件名,加上-u即可
git add -u
变更被版本控制的文件信息
git rm file_name
git rm file_name --cached
git reset --hard
git mv old_file_name new_file_name
如何看Git版本的历史
git log
git log --oneline
- 查看最近的几个简洁的日志-n加数字--oneline组合使用
git log -n4 --oneline
git log --all
git log --all --graph
.git目录
# HEAD 正在工作的分支
# config 存放本地仓库的配置信息 user.name user.email...
# refs
## tags(里程碑or标签) 项目开发到一定程度的时候可以打个标记
## heads 分支
# objects 可以查看文件修改内容等等
commit/tree/blob三者之间的关系
# 查询commit下面的树,树下面的blob和tree
git log # 查询commit hash值
git cat-file -p # 根据commit hash值进行查询
git cat-file -p # 根据上面查询commit后展示的tree哈希值进行查询
git cat-file -p # 根据上面hash值blob查看内容或者tree继续套娃
暂存区的对象创建
# 添加文件版本控制
git add file_name
# 查看添加文件的暂存区对象
find .git/objects -type f
# 上面查询objects/后面的文件夹名+hash值,查看类型
git cat-file -t hash
# 上面查询objects/后面的文件夹名+hash值,查看内容
git cat-file -p hash
分离头指针(detached HEAD)
# 分离头指针 指的是工作在一个没有分支的状态下,假如你做了很多commit后没有指向任何分支,你切换到其他分支后,这个东西果断时间就会被清理掉,好处是你如果只想做尝试性的变更,如果效果不好,你可以不用管他,切换到新的分支就可以了,这是分离头指针的好处。
git log
git checkout # 上面查询的commit hash值
git status # 会提示我们没有指向任何分支,基于commit做的
git commit -am'xxxx' # 提交到暂存区,但是没有指向任何分支
git checkout master # 切换到其他分支去了,会提示有个commit还没有加到分支里面去,可能过段时间这个东西就会被丢弃掉,很危险
HEAD和Branch
# HEAD不仅仅可以指向分支还可以指向具体的某一个commit(分离头指针的状态)
# 创建一个新分支
git checkout -b 创建的分支名 基于那个分支
# HEAD不在指向分离头指针了,而是指向新分支了
清理掉不需要的分支
# 查看分支及hash值
git branch -av
# 删除分支-d删除不掉的情况下用-D
git branch -d 分支名
修改commit的message
# 修改最新的commit的message
git commit --amend
# 修改老旧的commit的message
git rebase -i commit的父亲hash
# 打开文件后将要更改的那一条 pick改成r 文件进行保存后会弹出文件,可以修改message消息即可
多个commit合并成1个commit
# 连续的commit合并成一个
git rebase -i 选择需要合并的最前面的一个commit hash
# 打开文件后将需要合并的 pick改成s 文件保存后会弹出文件,可以写一句话来描述为什么做这次变更
#间隔的几个commit合并成一个
git rebase -i # 选择一个需要合并最前面的一个commit hash
# 要把需要合并的commit hash放到一起 将pick改成s 删除掉之前的commit 增加一个句话,描述为什么做这次的变更
比较文件的差异
# 暂存区和HEAD之间的差异
git diff --cached
# 工作区和暂存区的文件差异
git diff
# 只对某个文件差异对比
git diff -- file_name 可以多个
将暂存区恢复成和HEAD一样
# 将暂存区所有的文件恢复成HEAD
git reset HEAD
将工作区恢复成暂存区一样
git checkout -- 需要恢复的file_name 可以多个
取消暂存区部分文件的修改
git reset HEAD -- file_name
消除最近几次提交
git reset --hard 需要恢复的commit_hash
看看不同提交的指定文件的差异
git diff branch1 branch2 -- file_name
git diff commit_hash1 commit_hash_2 -- file_name
删除文件的方法
git rm file_name
文件存放指令
#用于紧急情况下为了避免混乱,先将文件存入一个区域,处理完后恢复
git stash
# 将之前存放的内容腾出来,恢复到工作区,区域里面的东西还在
git stash apple
# 将之前存放的内容腾出来,恢复到工作区,区域里面的东西不在了
git stash pop
指定不需要Git管理的文件
# 新建一个.gitignore将不需要的文件或文件夹放进去
vim .gitignore
常用传输协议
# 哑协议
/path/to/repo.git
# 智能协议
file:///path/to/trpo.git
# 智能协议
http://git-server.com:port/path/to/repo.git
https://git-server.com:port/path/to/repo.git
# 智能协议
user@git-server.com:path/to/repo.git
# 哑协议传输进度不可见,传输速度比智能协议慢。
如何将Git仓库备份到本地
# 查看所有远程仓库
git remote -v
# 添加远程仓库
git remote add xxx file:///path/repo.git
# 显示某个仓库信息
git remote show [remote]
# 提交到某个仓库
git push xxx
# 删除远程仓库
git remote rm name
# 修改仓库名
git remote rename old_name new_name
配置公私钥
# 生成回车即可
ssh-keygen -t rsa -b 4096 -C "admin@jiangpenghui.cn"
# 将.ssh文件夹中的id_sra.pub github账户管理中的SSH and GPG keys 点击 New SSH key 将公钥复制进去
创建Github个人仓库
# 点击 New repository
# 设置 repository name 仓库名
# public公开 private私有
# 是否添加README github搜索关键字会从这里找
# 是否添加.gitignore忽略版本控制的软件
# 添加licenses版权信息
# 点击Creating repository即可创建完成
将本地仓库同步到Github
# 添加远程仓库到本地
git remote github add 仓库地址
# 查看仓库(fetch 远程拉到本地 push本地拉到远程)
git remote -v
# 将远程的拉去下并且远端和本地的分支合并
git pull
# 本地数据传递给远程
git push
# 将远程仓库拉到本地但是不做合并
git fetch github 分支名
# 将两个不相关的树合在一起
git merge --allow-unrelated-histories 远程的分支名
不同的人修改了不同文件处理
# 基于远程仓库的分支创建一个本地分支,本地分支会自动和远程分支合并
git checkout -b 本地分支路径名 远端分支路径名
# 修改文件后把文件添加到暂存区
git add -u
git commit -m"modify file"
# 推送到远程仓库
git push
# 第二个人 用相同方式创建分支
git checkout -b 本地分支路径名 远端分支路径名
# 修改文件把文件添加到暂存区
git add -u
git commit -m"modify file"
# 如果第一个人修改了文件,此时你没有先跟新下来就提交,会提示你使用fast-forwards
# 此时git pull或者git fetch github 分支名 然后在git merge 远程分支名
# 此时提交则不会有问题
git push github
多人修改了同文件不同区域处理
# 两个修改了同一文件但是不同区域
# 第一个人先将修改的文件,push到远程分支
# 第二个人将修改文件,push到远程分支时将会提示fast-forwards
# 第二个人可以使用git pull或者使用git fetch git merge两个指令
# 操作完成后会自动合并两边修改
# 第二个人git push即可
多人修改了同文件同区域处理
# 两个人修改了同一文件同一区域
# 第一个人先将修改的文件,push到远程分支
# 第二个人将修改文件,push到远程分支时提示fast-forwards
# 如果此时使用git pull将会报错,git在给你自动合并时内容冲突了
# 打开冲突文件,进行修改后,去掉HEAD 和 =====
# 使用git commit提交或者git merge --abort恢复没有合并前的状态
# 此时可以git push到远程分支
同时变更了文件名和文件内容处理
# 第一个人将文件名修改并且提交到远程分支
# 第二个人将文件进行修改并且提交时将会报错,提示fast-forwards
# 使用git pull将会自动处理完成,此时提交则不会有问题
多人修改了文件名处理
# 第一个人将文件名修改了并且提交到远程分支
# 第二个人将文件名进行修改并且提交时将会报错,提示fast-forwads
# git status会提示三个文件 原文件名 第一人修改的文件名 自己修改的文件名
# 使用git rm 原文件
# 使用git add 第一人或者第二人修改的文件(自己协商)
# 使用git rm 删除多余的那个文件
# 使用git commit提交到暂存区
# 使用git push提交到远程分支
为什么禁止向集成分支执行push -f操作?
#查看commit提交
git log --oneline
# 将当前分支指向很久以前的commit指针
git reset --hard 很久以前的commit_hash值
# 此时本地之前的commit提交已经被干掉了,远程分支还没有变
# 同步到远程分支,此时远程分支中被reset那些commit被干掉了与本地一样 -f参数是强制 很危险
git push -f origin 分支路径名
为什么禁止向集成分支执行变更历史操作?
# 第一个人将远程分支进行了rebase操作将指针指向了rebase后的地址
# 第二个人的提交将会报错fast-forwards
# 由于第一个人rebase后改变了指针,其他人还是基于老的地址进行提交
GitHub高级搜索
# 搜索后左侧底部有个Advanced search链接,点进去可以筛选