git常用命令
配置
配置用户名和邮箱
git config --global user.name ***
git config --global user.email ***@qq.com
创建密钥
(生成的密钥默认存放在~/.ssh目录下)
ssh-keygen -t rsa -C "***@qq.com"
cd ~/.ssh/ # 进入.ssh 文件目录
cat ***.pub # 查看某个文件
初始化
- 初始化一个新的git仓库
git init
# 生成隐藏 .git 文件夹
.git
hooks # 钩子,一般自定义提交的规则,或者执行一些脚本
info
logs
refs
objects
config # git 的配置文件
HEAD # 当前分支指针
...
忽略文件
# 根目录创建 .gitignore
# 一般忽略的文件
dist
node_modules
克隆仓库
git clone ****
一条龙
git pull # 拉取代码
git satus # 检查状态
git diff # 查看不同
....开发需求
git satus
git diff
git add . # 添加暂存区
git commit -m '*****' # 提交到本地仓库
git push origin <branch name> # 提交到远程
branch
分支查看,分支创建,分支切换,分支删除,分支合并,取消合并,推送远程,远程删除,分支重命名
分支查看
git branch
# 本地所有分支
* developer // 当前分支
feat-switch
fix-switch
master
yanchaoda
git branch -a
# 本地和远程所有分支
* developer
feat-switch
fix-switch
master
yanchaoda
remotes/origin/F-XSHB # 远程分支
remotes/origin/F-jianguanyaoqiu
remotes/origin/F-upload
remotes/origin/HEAD -> origin/developer
remotes/origin/bug-master
git branch -r
# -r origin 远程分支
origin/F-XSHB
origin/F-jianguanyaoqiu
origin/F-upload
origin/HEAD -> origin/developer
git branch -v
# 本地所有分支 + commit id + 信息
* developer 4bfc131 merge #3482057 into developer from fix-switch
feat-switch 195c08a [ahead 1, behind 74] fix: 业务公司切换功能
fix-switch bf01475 [ahead 408] delete: build
master 031e197 merge #3475669 into master from
git branch -vv
# 本地所有分支 + commit id + 关联远程分支 + 信息
* developer 4bfc131 [origin/developer] merge #3482057 into developer from fix-switch
feat-switch 195c08a [origin/developer: ahead 1, behind 74] fix: 业务公司切换功能
fix-switch bf01475 [origin/master: ahead 408] delete: build
master 031e197 [origin/master] merge #3475669 into master from master_shouxinfuwufeilv
yanchaoda e41c0ab merge: vue.config.js
创建分支
git brnach a
# 基于当前分支新建分支
git checkout -b a
# 基于当前分支新建分支 + 并且切换到a分支
# checkout 切换
# -b branch
# a 分支名字
git checkout -b a master
# 基于master分支新建分支 + 并且切换到a分支
# master 基于某个分支
git checkout -b a origin/master
# -b branch 新建a 分支
# 基于master分支新建分支 + 并且切换到新a分支
# origin/master 基于远程master分支
git fetch origin master:temp
# 基于master分支新建分支 + 并且切换到新temp分支
# origin/master 基于远程master分支
分支切换
git switch a
# switch 切换
# a 分支名
git checkout a
# checkout 功能更强大,切换,撤销,
# a 分支名
分支删除
git branch -D a
# 删除本地分支
# 不能在a当前分支删除自己
git push origin --delete a
# 删除远程分支
--detele -D
删除命令
分支重命名
# 为当前分支改名
git branch -m newName
# 为指定分支改名
git branch -m oldName newName
# 如果有重名分支,强制改名
git branch -m oldName newName
# 先新建后删除
git checkout -b twitter-experiment feature132
git branch -d feature132
分支合并
git merge master
# master 分支合并到 当前分支
# 有冲突解决冲突 全局搜索 <<<<
git pull origin master:a
# 将远程master分支拉取下来和本地a分支合并
取消分支合并
git merge --abort
# abort 终端,许多请求都有abort
git fetch
git fetch
git fetch origin
# 更新
# 拉取所有的远程分支代码,与本地仓库更新
# 不会与本地分支代码合并
git fetch origin master:temp
# 拉取origin 仓库的 master 分支代码
# 并新建temp分支
# 但不切换分支
拉取远程分支代码
git pull
# 拉取所有的远程分支代码,与本地仓库更新
# 并自动合并
git pull origin master:a
# 拉取远程master和本地a分支进行合并
git pull origin master
# 本地分支master和拉取origin master一样,可以省略:
git pull = git fetch + git merge
文件合并
本地某分支的某些文件合并到当前分支
git checkout --patch dev a.js b.js /src/c.js
git checkout -p dev a.js b.js /src/c.js
# dev 分支的a.js b.js /src/c.js合并到当前分支
# --patch 补丁
apply this hunk to index and worktree [y,n,q,a,d,/,K,g,e,?]?
# y
y - 存储
n - 不存储这个hunk
q - 离开,不存储这个hunk和其他hunk
a - 存储这个hunk和这个文件后面的hunk
d - 不存储这个hunk和这个文件后面的hunk
g - 选择一个hunk
/ - 通过正则查找hunk
j - 不确定是否存储这个hunk,看下一个不确定的hunk
J - 不确定是否存储这个hunk,看下一个hunk
k - 不确定是否存储这个hunk,看上一个不确定的hunk
K -不确定是否存储这个hunk,看上一个hunk
s - 把当前的hunk分成更小的hunks
e - 手动编辑当前的hunk
? - 输出帮助信息
暂存区操作
添加暂存区
git add a.js b.js src
# a.js b.js src目录 添加到暂存区
git add .
git add *
# 将所有的修改添加到暂存区
查看暂存区的提交
git ls-files
# PS D:\yanchaoda\wlyd\test-git> git ls-files
# a.js
# 查看暂存区的提交
查看工作区的修改
git status
git status -s
# 查看工作区的文件
# -s 略微有点区别
状态码解析
A: 你本地新增的文件(服务器上没有).
C: 文件的一个新拷贝.
D: 你本地删除的文件(服务器上还在).
M: 文件的内容或者mode被修改了.
R: 文件名被修改了。
T: 文件的类型被修改了。
U: 文件没有被合并(你需要完成合并才能进行提交)。
X: 未知状态(很可能是遇到git的bug了,你可以向git提交bug report)
?:未被git进行管理,可以使用git add file1把file1添加进git能被git所进行管理
撤销暂存区
未添加到暂存区文件修改撤销
添加到暂存区撤销 git add
添加到本地仓库撤销 git commit
未添加到暂存区文件修改撤销
git checkout -- a.js b.js
# 撤销a.js b.js文件的当前修改
git checkout .
git checkout -- .
git checkout -- <file name>
# 撤销所有的修改,但不能撤销新建的文件
添加到暂存区撤销
git add 添加到暂存区的撤销
git add a.js
# 添加到暂存区
git reset HEAD -- a.js
git reset HEAD -- .
# 撤销a.js
# -- . 撤销所有的add
添加到本地仓库撤销
git commit添加到本地仓库撤销
git add .
git commit -m 'add: 添加文件'
git reset --soft 5029f0cc08cf
git reset --soft HEAD^
git reset HEAD^
# 回退到某个版本,
# 同时保留修改
# 同时commit 的提交也被撤回了
# HEAD^ 当前版本
# --soft 不删除工作空间的改动代码 ,撤销commit,不撤销git add file
# 默认不撤销修改
git reset --hard HEAD commit-id
# 撤销到commit id版本,相当于回退代码,不建议使用,比较危险,
# 同时不会保留修改的文件
# --hard 删除工作空间的改动代码,撤销commit且撤销add
--soft 不删除工作空间的改动代码
--hard 删除工作空间的改动代码
文件对比
查看比较被git管理的文件在 工作区、暂存区和版本库之间的差异,
就需要用到 git diff 命令。
下面讨论以下四个情景下文件的差异的比较:
* 工作区和暂存区
* 工作区和版本库
* 暂存区和版本库
* 不同版本之间
* 不同分支对比
【查看差异的方式主要是 git diff 命令不同的参数】
工作区和暂存区
git diff
# 工作区和暂存区之间,所有的文件差异
git diff -- a.js b.js
git diff a.js b.js
# 选定文件对比
工作区和版本库
git diff HEAD
git diff commit-id
# HEAD 当前版本对比
# commit-id 具体某个版本id
git diff HEAD a.js b.js
git diff commit-id a.js b.js
# 某个版本的文件对比
暂存区和版本库
git diff --cached
git diff --cached a.js b.js
# 暂存区与工作区对比
git diff --cached commit-id
git diff --cached commit-id a.js b.js
git diff --cached commit-id -- a.js b.js
# 暂存区与版本id文件对比
不同版本之间
git diff commit-id1 commit-id2
# 查看两个版本之间的差异
git diff commid-id1 commid-id2 -- 文件名1 文件名2
# 查看两个版本之间的指定文件之间的差异
git diff commid-id1 commid-id2 --stat :
# 查看两个版本之间的改动的文件列表
git diff commid-id1 commid-id2 <文件目录 src>
# 查看两个版本之间的文件夹 src 的差异
不同分支对比
git diff master dev
git diff master dev a.js
# git diff branch1 branch2 file_name file_name
# 不同分支对比
git diff master dev --stat
# 查看两个分支之间的改动的文件列表
--stat 文件列表
展示提交的日志log
* 所有的提交日志
* 过滤展示某个人的提交记录
git log
git log --reverse
# 展示提交所有日志
# --reverse 倒叙查看日志
--reverse 倒叙查看日志
过滤展示某个人的提交记录
git log --author="author"
git log --author="yanchaoda"
git log --author="yanchaoda" --stat
# 过滤yanchaoda提交的记录
# --stat 文件列表
remote
git remote update origin --prune
# 强制更新本地仓库和远程仓库状态,分支信息
# 如果有报错就git init 重新关联 分支
git tag
- 标签,commit id 的别名,commit id的引用
git tag 标签名
git tag 标签名 commitId
git tag v1.0.1
git tag v1.0.1 asd4f3jal46djfla122
git tag -a 标签名称 -m 附注信息 :直接给当前的提交版本创建一个 【附注标签】
git tag -a 标签名称 提交版本号 -m 附注信息 :给指定的提交版本创建一个【附注标签】
git tag -a v1.2.2 -m '协议开发'
git tag -a v1.2.2-release -m '协议开发'
说明:
-a : 理解为 annotated 的首字符,表示 附注标签
-m : 指定附注信息
# 查看标签列表
git tag
git tag -l
git tag --list
git ls-remote --tags origin # 远程所有分支
说明:
-l
--list 列表
# 查看标签提交信息
git show tagName
git show v1.2.0
git show v1.2.0-release
git log --oneline --graph
git tag -d 标签名
git tag -d v1.2.2
说明:
-d 删除标签
# 推送标签到远程
git push origin 标签名称
git push origin --tags
# 删除远程标签
git push origin :regs/tags/标签名称
git push origin --delete 标签名称
# 基于某个标签名开发,新建分支
git checkout -b branchName tagName
子模块 git submodule
# 添加子模块
git submodule add <repository-url>
# 初始化子模块
git submodule init
# 更新子模块
git submodule update
子仓库 git subtree
# 在主项目中添加子项目
git subtree add --prefix=commonTools http://git.ninebot.cn:8888/tingtingtina/commontoolscopy.git master --squash
- `--squash` 参数表示不拉取历史信息,而只生成一条 commit 信息。
- `=` 后面的 commonTools 是子项目 clone 后在本地的目录名,可以是多级,比如 lib/xxx
- `master` 指的是子项目的分支名
# 推送到子项目仓库
git subtree push --prefix=commonTools http://git.ninebot.cn:8888/tingtingtina/commontoolscopy.git master
# 子项目仓库更新
git subtree pull --prefix=commonTools http://git.ninebot.cn:8888/tingtingtina/commontoolscopy.git master --squash
# 简化更新
git remote add utils http://git.ninebot.cn:8888/tingtingtina/commontoolscopy.git
git subtree push --prefix=commonTools utils master
### 移除子项目(切换子项目分支)
git rm <subtree>
git commit
git subtree add --prefix=<subtree> <repository_url> <subtree_branch>
工作流
# 创建补丁
git format-patch -1 <commit-id>
# 应用补丁
git apply <patch-file>
# 拣选提交
git cherry-pick <commit-id>
提交信息规范
# 功能开发
feat: add new feature
# 修复bug
fix: resolve siisue #RDKJ-8834
# 文档更新
doc: update readme.md