Git 使用
整理自 极客时间
git安装
官方地址:
https://git-scm.com/book/zh/v2
使用前配置
# 添加配置
git config [--local | --global | --system] user.name 'Your name'
git config [--local | --global | --system] user.email 'Your email'
# 查看配置
git config --list [--local | --global | --system]
# 清除设置
git config --unset --local user.name
git config --unset --global user.name
git config --unset --system user.name
# 注
local:区域为本仓库
global: 当前用户的所有仓库
system: 本系统的所有用户 基本不用
构建仓库
# 新建项目
git init 项目名称
# 查看日志
git log
# 查看状态
git status
文件提交
# 添加全部文件
git add -all
# 添加文件进入git暂存区
git add 文件名
# 添加暂存区的全部文件(被跟踪的文件)
git add -u
# 提交并设置备注
git commit -m 'add a file' # windows中 ' 替换为 "
文件改名
# 从暂存区删除
git rm 文件名
# 更改名字
git mv oldname newname
# 清理暂存区
git reset --hard
查看版本
• git log --all 查看所有分支的历史
• git log --all --graph 查看图形化的 log 地址
• git log --oneline 查看单行的简洁历史。
• git log --oneline -n4 查看最近的四条简洁历史。
• git log --oneline --all -n4 --graph 查看所有分支最近 4 条单行的图形化历史。
• git help --web log 跳转到git log 的帮助文档网页
## 图形界面工具
安装gitk
gitk
git 目录
在 .git 文件中
• COMMIT_EDITMSG
• config 当前 git 的配置文件
• description (仓库的描述信息文件)
• HEAD (指向当前所在的分支),例如当前在 develop 分支,实际指向地址是 refs/heads/develop
• hooks [文件夹]
• index
• info [文件夹]
• logs [文件夹]
• objects [文件夹] (存放所有的 git 对象,对象哈希值前 2 位作为文件夹名称,后 38 位作为对象文件名, 可通过 git cat-file -p 命令,拼接文件夹名称+文件名查看)
• ORIG_HEAD
• refs [文件夹]
• heads (存放当前项目的所有分支)
• tags (存放的当前项目的所有标签,又叫做里程碑)
• cat 命令, 功能:用来显示文件。 例如 cat text.md 显示 text.md 文件的内容
• ls -al 命令, 表示列出当前目录下的所有文件(包括隐藏文件)
• git cat-file -t 命令 , 查看 git 对象的类型
• git cat-file -p 命令, 查看 git 对象的内容
• git cat-file -s 命令, 查看 git 对象的大小
git branch 分支名
# 切换分支
git checkout 分支名
commit tree blob 关系
# 查看文件
git cat-file -p 哈希值
分离头指针状态
开发没有基于一个分支的情况
可以进行测试开发
合适,可以保留内容
git branch 新分支名 hash值
不合适 切换分支 扔掉该内容
git checkout 分支名
head 与branch
head必须基于某个commit
# 根据版本号来比较差异
git diff hash1 hash2
# 比较head与其父commit的差异
git diff HEAD HEAD^1
# 查看分支
git branch -v
# 删除分支
git branch -d 分支hash
git branch -D 分支hash #强制删除的情况下
修改最新commit的备注
对最新一次提交做 commit 修改
git commit --amend
进入编辑模式 修改message
修改;老旧commit的message
git rebase -i prenthash(父commit的hash)
选择策略
多个commit整理为一个commit
git rebase -i prenthash(父commit的hash)
选择squash策略
把间隔的几个commit整理为1个commit
比较差异
# 暂存区与head的差异
git diff --cached
# 比较文件差异
git diff HEAD -- file # 工作区 <===> HEAD
git diff -- file # 工作区 <===> 缓存区
git diff --cached -- file # 缓存区 <===> HEAD
暂存区恢复成head一样
git reset 有三个参数
--soft 这个只是把 HEAD 指向的 commit 恢复到你指定的 commit,暂存区 工作区不变
--hard 这个是 把 HEAD,暂存区,工作区 都修改为 你指定的 commit 的时候的文件状态
--mixed 这个是不加时候的默认参数,把 HEAD,暂存区 修改为 你指定的 commit 的时候的文件状态,工作区保持不变
# 取消部分文件
git reset HEAD -- 文件名1 文件名2
消除最新的几个commit
git reset --hard 指定的commit的hash值
不同commit的指定文件的不同
git diff commit1-hash commit2-hash path-to-filename
或者
git diff commit-id1 commit-id2 path-to-filename
正确删除文件
git rm filename
开发中临时增加紧急任务需求
# 保存当前内容并使工作区清空
git stash
# 完成后
# 该命令恢复工作区,但不删除保存区的内容
git stash apply
# 该命令恢复工作区,并删除保存区的内容
git stash pop
# 查看保存区的内容
git stash list
忽略文件
.gitignore文件
git 备份到本地
# --bare 参数意思为克隆裸仓库,即只有.git文件的仓库
git clone --bare url
# 推送
git push url
GitHub
创建账户及设置公私秘钥
创建仓库
将本地仓库同步到github
git remote -v 查看远程版本库信息
git remote add github <url> 添加githup远程版本库
git fetch github 拉取远程版本库
git merge -h 查看合并帮助信息
git merge --allow-unrelated-histories githup/master 合并githup上的master分支(两分支不是父子关系,所以合并需要添加 --allow-unrelated-histories)
git push githup 推送同步到githup仓库
基于远端创建分支
# 查看全部分支
git branch -av
# 创建分支
git checkout -b 本地分支名 远端分支名
不同人修改不同文件
#首先拉取
git fetch github
# 合并分支
git merge github分支名
# 再push
git push github
不同人修改了相同文件的不同区域
# 每天开始工作前要做的:将远端的代码更新到本地
git pull
#首先拉取
git fetch github
# 合并分支
git merge github分支名
####
以上两步可以合并为git pull
####
# 再push
git push github
不同人修改了相同文件同一区域
需要手动更改 并提交远端
团队协作禁止使用的命令
# 强制push
git push -f
# 禁止向集成分支变更历史