简单配置

设置工作人员的名字和email

git config --global user.name "your_name"
git config --global user.email"your_email@domain.com"

config的三个作用域, 默认是local

  • local只对某个仓库有效
git config --local
  • global只对当前用户所有仓库有效
git config --global
  • system对系统所有登陆的用户有效
git config --system
  • 显示config的配置, 加--list
git config --list --local
git config --list --global
git config --list --system

已有项目纳入Git管理

# 已有项目纳入Git管理
# cd 项目代码所在目录
git init
# 新建的项目直接用Git管理
# cd 某个文件夹
git init your_project
cd your_project

如何提交文件

  • 在工作目录中修改或者新建的文件,需要先提交到暂存区
  • 将文件添加进暂存区,add可以添加多个文件及文件夹,.代表所有的
git add file_name or dir_name
  • 添加进git版本库里面,-m是描述信息
git commit -m"describe"
  • 查看当前git状态(文件是否被版本控制等等)
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完整的日志,默认是看当前分支的历史
git log
  • 查看git简洁的日志
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链接,点进去可以筛选