1、基本命令
- git add .
- git commit -m "first commit "
- git push 远程仓库 本地分支:远程分支
- git pull 远程仓库 远程分支:本地分支
- git checkout -b "name" origin/release 创建并切换分支(以远端origin为基准)
- git branch 列出本地所有分支
- git branch -r 列出远端所有分支
- git push origin --delete test 删除远程分支
- git branch -d test 删除本地分支
- git branch -D test 如果有未提交的文件,用它
- git 2.23.0 以后版本,可以使用 git switch 切换分支,git restore path 丢弃暂存区修改
- git remote update origin -p 同步本地分支与远程分支
2、进阶命令
- git show // 显示当前分支的提交历史
- git log // 显示所有分支的提交历史
- git commit --amend //该命令会触发vim编辑器,用于编辑提交信息(此命令只适合本地commit尚未提交到远端,否则会有冲突)
- git checkout -- filename // 取消工作区修改,即没有git add .过的文件
- git reset HEAD -- filename // 取消暂存区,即git add .过但没commit过的文件,注意‘--’前后有空格
- git reset HEAD~n // 撤销本地仓库当前HEAD之前n个版本的提交,暂存区会被干掉,工作区保留
- git reset --hard HEAD~n //撤销当前HEAD之前n个版本的提交,暂存区和工作区都会被干掉
- git merge branch-name //在当前分支合并branch-name分支
- git rebase master // 在当前分支rebase master分支
- git diff // 工作区和暂存区对比
- git diff --staged // 暂存区和HEAD对比
- git stash //切换分支前将工作区和暂存区(未git add 和 git add .的文件)放置临时存储区,否则会带到其他分支去
- git stash pop // 取出临时存储区
- git stash drop // 扔掉临时存储区
- git stash --keep-index // 存储没有git add过的文件,用于不想提交某个文件
- git cherry-pick commitID //在当前分支上提取别的分支的某次提交
- git reflog 查看HEAD指针位置,git reset HEAD@{number} 回到某次提交
- git tag -a "v2.8.0" -m "导入" 添加tag
- git push origin v2.8.0 推送tag
- git pull --rebase 避免多余的 commit 信息
- git merge --squash branch_name 重新提交,一般用于往主分支上合并代码,避免将功能分支的提交记录合并到主分支上,方便回退
- git bisect start HEAD ffnc // git 调试 git bisect bad/good/reset
- git shortlog -sn 查看各成员提交次数
- git log --author="" 查看哪个人的提交
- git grep "fe" 查看哪些文件包含 fe
- git subtree 相关
// 命名远端仓库为 common
git remote add -f common git@code.aliyun.com:happy-life/hl-common-frontend.git
// 添加公共模块 common 到 src/app/common 目录下,并使用 common 仓库的 prod 分支
git subtree add --prefix=src/app/common common prod --squash
// 从子仓库拉取更新
git subtree pull --prefix=src/app/common common prod --squash
// 推送更新到子仓库
git subtree push --prefix=src/app/common common prod
3、常见问题
- 切分支时当前分支的修改被带到另一个分支问题
有两种情况:1、当前分支新建了文件(原分支没有这个文件),在切分支之前必须commit掉才不会带到另一个分支;
2、当前分支修改了某个文件(原分支有这个文件),在切分支之前有两种选择:1、可以使用stash命令缓存起来,这样不会带到另一个分支,当再切回该分支时,再用stash pop命令恢复缓存的修改,这种方式使用的更多;2、commit掉 - rebase 和 merge 的区别
merge执行一个合并,或者说一个融合。我们希望在当前分支上往前走,所以我们需要融合合并其他分支的工作,从而放弃其他的分支。一般是在master分支上merge其他分支,出现冲突解决即可。
rebase存在的价值是:对一个分支做“变基”操作,这意味着改变这个branch的初始commit。它会在新的base上一个一个地运行这个分支上的所有commits.一般是在其他分支上rebase master分支,然后切回master分支,再做merge操作。 -
怎么解决冲突
首先搞清楚冲突的是哪个文件,其次搞清楚冲突的双方内容的位置,即哪个是本地的,哪个是远程的。见下图:
解决冲突
image.png
- git 配置 ssh
Git SSH Key 生成步骤
4、分支工作流
-
多人协作
多分支
注意:此图代表的是远端分支情况!每次提交代码前请git pull代码,因为可能别人修改过远端branch分支
- 个人工作流程
比如你要做个新功能,则基于 master 分支创建 feature 分支,然后在本地执行git checkout -b dev ,在dev分支上开发,当dev分支的功能完成后,切回本地 feature 分支,在 feature 分支上执行git merge dev操作,然后提测 feature 分支。测试通过后,在master 分支上进行合并操作 -
分支管理
分支管理
5、可视化工具 sourceTree
用SourceTree轻松Git项目图解
SourceTree 免登录跳过初始设置
SourceTree通过配置SSH来链接GitLab