一、重要概念
二、常用命令
git -h
git xx -h
-n 仅测试 不做实际操作
-f 强制操作
-r 文件目录递归
git init //初始化,生成.git文件
git add . //将当前目录以及子目录下被修改、新建/删除的文件添加到暂存区
git add -u . //将修改、删除的文件加入暂存区 不包括删除的文件
git add -i . //查看暂存区已被add未提交的文件状态 且可以操作
git add -n --ignore-missing . //测试是否被忽略文件忽略
git commit [file...] -m"提交信息" //提交文件 file可以不通过add直接提交
git commit --amend //修改上一次comment 会进入编辑界面
git commit --amend -m"" //覆盖上一次comment
git commit -am"" //相当于git add . -u / git commit -m""
git rm <file> //删除一个文件 包括暂存区和工作区
git rm -r <dir> //删除 dir 下的所有文件
git rm --cached <file> //删除暂存区的文件 保留工作区文件
git reset [HEAD] 回退历史代码
--soft //回退到指定index 但是不重置暂存区 已经commit的回退到add完的状态
--mixed //默认 回退到指定index并重置暂存区代码 已经commit的回退到add前的状态
--hard //回退到指定index 重置暂存区、工作区
git restore --staged <file> //将暂存区内容恢复到工作区 不撤销修改
git restore <file> //将暂存区内容恢复到工作区 撤销修改
git status -s //精简的方式显示文件状态
git status -uno //只列出所有已经被git管理的且被修改但没提交的文件
git status -sb //精简的方式显示文件状态 并打印当前分支
git diff <file> //比较当前文件和暂存区文件差异
git diff <id1><id2> //比较两次提交之间的差异
git diff <branch1> <branch2> //在两个分支之间比较
git diff --cached //暂存区和本地仓库的对比
git diff //工作区和暂存区的对比
git diff HEAD //工作区和本地仓库的对比
git branch //列出本地分支
git branch -r //列出远端分支
git branch -a //列出所有分支
git branch -d //删除已merge过的分支 (试了也可以直接删除?)
git branch -D [-r] //强制删除分支 (需要切到其他分支才能删除需要删除的分支)
git branch --show-current //展示当前分支名
git branch <branch1> //基于当前分支创建新分支
git branch -m <old_branch> <new_branch> //分支改名
git branch --set-upstream-to origin/<new_branch>//本地分支与远程分支关联
git checkout -- <file> //从索引中恢复文件
git checkout <branch1> //切换分支
git checkout -b <branch1> //创建并切换到新的分支
git checkout -b <branch1> origin/<remotebranch> //将远端分支拉到本地
git checkout <branch1> <file> //从branch1中取出file文件
git merge <branch> //将branch合并到当前分支
git merge --no-ff <branch> //总会生成一个合并commit
git merge -Xignore-space-change <branch> //完全忽略 空白修改
git log //查看提交历史
git log -p //查看提交历史 会列出改动内容
git log -n //查看最近n次提交记录
git log --stat //查看提交记录的简略统计
git log --graph //展示提交历史的分支结构
git log -S "xxx" //列出字符串xxx加到项目中的commit -G支持正则
git log -- <file> //只查看某个文件的commit
git log --after="20122-7-1" --before="2022-7-4" //按时间段查询commit after和before可以单独使用
git log --abbrev-commit //以简短的形式打印commit id
git log --grep="xxx" //查找包含commit内容的记录
git log <tag> //查询tag之后的提交记录 不包括tag
git log <commit> //查询commit之前的记录,包含commit
git log <commit1> <commit2> //两个commit之间的记录,包括commit1和commit2
git log commit1..commit2 //同上,但是不包括commit1
git log --oneline //只展示commit id和内容
git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --all
git reflog //查看所有更改过的commit 然后使用reset --hard 恢复
git reflog show <branch> //展示某个分支的commit
git tag -l [正则]//列出所有简短的tag名称
git tag -a <tag> -m "xxx" //添加标签和备注
git show <tag> //打印tag的详细信息
git tag <tag> //添加tag
git tag -a <tag> <commit id> //给特定commit添加tag
git tag -d <tag> //删除tag
git push origin <tag> //上传tag
git push origin --delete <tag> //删除远端tag
git rebase //把本地未push的分叉提交历史整理成直线 尽量避免使用
//添加暂存区和已跟踪未添加的修改 -u 添加未跟踪的修改 -a 添加所有文件
git stash [save 'message'] //暂存工作区修改
git stash list //查看所有的stash
git stash show [-p] [stash@{n}]//查看修改 默认对比第一个
git stash pop //删除第一个修改 并将修改应用到工作区
git stash apply //将修改应用到工作区 但不修改
git stash drop <stash@{n}>//删除第n个暂存
git stash clear
git stash branch <branch1> <stash@{n}>//将stash创建为分支 并删除此stash
git fetch //将远程库的数据下载到本地库 工作区不更新
git fetch origin //拉取origin下所有分支
git fetch <branch> origin/<remotebranch>
git cherry-pick commit1 //将一个提交合并到当前分支
git cherry-pick (commit1...commitn] //将多个提交合并到当前分支 不包括commit1
git push origin <branch> //将本地分支推送到远端分支 分支名相同
git push origin <branch>:<remotebranch> [-f]//将本地分支推送到远端分支
git push origin --delete <branch> //删除远端分支
.gitmodules文件内容
[submodule "lib/spacetime"]
path = lib/spacetime
url = https://github.com/spencermountain/spacetime.git
git submodule add url //添加子模块
git submodule //查看所有子模块
git submodule update --init --recursive //拉取远端子模块
git submodule init //初始化子模块
git submodule update //更新项目内子模块到最新版本
git submodule update --remote //更新子模块为远程项目的最新版本
git submodule foreach 'git pull origin master' //子模块统一执行git命令
删除子模块: .gitmodules->.git/config->.git->git commit->git push
hooks
可以将git更改后 执行脚本文件
https://zhuanlan.zhihu.com/p/521707440
三、疑难问题记录
3.1 本地开发代码已提交,提交后发现这次提交的代码有问题,或者漏提交了一些文件,此时,希望达到以下目的:
①修改有问题的代码。
②补足漏提交的文件(一般是新增的文件没有git add .)
③把以上2点相关的代码,和前一次提交的代码合并成1个提交。
④给合并后的这个提交添加新的注释。
快搜解决办法:
--》修改问题代码
--》git add . (把漏提交的文件假如暂存区)
--》执行git commit --amend -m "这里填写提交的注释"
3.2 新建并关联远端
echo "# -" >> README.md
git init
git add README.md
git commit -m "first commit"
git branch -M master
git remote add origin https://github.com/with-dream/-.git
git push -u origin master
四、异常
4.1 error: failed to push some refs to
https://blog.csdn.net/github_50517091/article/details/115628500
五、版本控制及git flow
master
主分支 , 产品的功能全部实现后 , 最终在master分支对外发布
该分支为只读唯一分支 , 只能从其他分支(release/hotfix)合并 , 不能在此分支修改
另外所有在master分支的推送应该打标签做记录,方便追溯
例如release合并到master , 或hotfix合并到master
develop
主开发分支 , 基于master分支克隆
包含所有要发布到下一个release的代码
该分支为只读唯一分支 , 只能从其他分支合并
feature功能分支完成 , 合并到develop(不推送)
develop拉取release分支 , 提测
release/hotfix 分支上线完毕 , 合并到develop并推送
feature
功能开发分支 , 基于develop分支克隆 , 主要用于新需求新功能的开发
功能开发完毕后合到develop分支(未正式上线之前不推送到远程中央仓库!!!)
feature分支可同时存在多个 , 用于团队中多个功能同时开发 , 属于临时分支 , 功能完成后可选删除
release
测试分支 , 基于feature分支合并到develop之后 , 从develop分支克隆
主要用于提交给测试人员进行功能测试 , 测试过程中发现的BUG在本分支进行修复 , 修复完成上线后合并到develop/master分支并推送(完成功能) , 打Tag
属于临时分支 , 功能上线后可选删除
hotfix
补丁分支 , 基于master分支克隆 , 主要用于对线上的版本进行BUG修复
修复完毕后合并到develop/master分支并推送 , 打Tag
属于临时分支 , 补丁修复上线后可选删除
所有hotfix分支的修改会进入到下一个release
主要工作流程
1 . 初始化项目为gitflow , 默认创建master分支 , 然后从master拉取第一个develop分支
2 . 从develop拉取feature分支进行编码开发(多个开发人员拉取多个feature同时进行并行开发 , 互不影响)
3 . feature分支完成后 , 合并到develop(不推送 , feature功能完成还未提测 , 推送后会影响其他功能分支的开发)
合并feature到develop , 可以选择删除当前feature , 也可以不删除 . 但当前feature就不可更改了 , 必须从release分支继续编码修改
4 . 从develop拉取release分支进行提测 , 提测过程中在release分支上修改BUG
5 . release分支上线后 , 合并release分支到develop/master并推送
合并之后 , 可选删除当前release分支 , 若不删除 , 则当前release不可修改 . 线上有问题也必须从master拉取hotfix分支进行修改
6 . 上线之后若发现线上BUG , 从master拉取hotfix进行BUG修改
7 . hotfix通过测试上线后 , 合并hotfix分支到develop/master并推送
合并之后 , 可选删除当前hostfix , 若不删除 , 则当前hotfix不可修改 , 若补丁未修复 , 需要从master拉取新的hotfix继续修改
8 . 当进行一个feature时 , 若develop分支有变动 , 如其他开发人员完成功能并上线 , 则需要将完成的功能合并到自己分支上
即合并develop到当前feature分支
9 . 当进行一个release分支时 , 若develop分支有变动 , 如其他开发人员完成功能并上线 , 则需要将完成的功能合并到自己分支上
即合并develop到当前release分支 (!!! 因为当前release分支通过测试后会发布到线上 , 如果不合并最新的develop分支 , 就会发生丢代码的情况)
https://blog.csdn.net/xingbaozhen1210/article/details/81386269
gitflow命令行
brew install git-flow
git flow init
feature/develop/release
git flow feature [list]
git flow feature start
git flow feature finish
git flow feature publish
git flow feature track
git flow feature diff
git flow feature checkout
git flow feature rebase
git flow feature pull
git flow feature delete
git flow feature rename
参考:
git官网
https://www.cnblogs.com/Y-S-X/p/8372741.html
https://blog.csdn.net/abcnull/article/details/90288499
https://www.cnblogs.com/yelbosh/p/7471979.html
https://www.yiibai.com/git/git_status.html
https://www.cnblogs.com/sinicheveen/p/13956266.html