学习教程
猴子都能懂的git:https://backlog.com/git-tutorial/cn/intro/intro1_1.html
动画图解git:https://blog.csdn.net/ch834301/article/details/106678465
在线学git:https://learngitbranching.js.org/?locale=zh_CN
GitHub生成ssh公钥
ssh-keygen -t rsa -b 4096 -C “email@qq.com”
常用命令
- git rebase
- git merge
- git reset
- git revert
- git cherry-pick
- git fetch
- git pull
- git reflog
- git restore
branch分支操作
对branch或tag过滤
git branch | grep "feature-01" //可以搜索出feature-01开头的分支
git tag | grep "feature-01" //可以搜索出feature-01开头的标签
创建分支
// 从远程创建分支,在本地创建一个和远程相关联的同样的分支
git checkout -b integration/release-2105 origin/integration/release-2105
// 创建出一个新的分支,作为自己开发
git checkout -b feature/release-2105-shen
// 推送自己的开发分支到远程
// git push -u origin [localBranchName]:[remoteBranchName]
git push -u origin feature/release-2105-shen:feature/release-2105-shen
// 或者简写
git push origin [branchName]
// 查看关联分支
git branch -vv
只显示当前分支
git rev-parse --abbrev-ref HEAD
删除分支
git branch -d local_branch_name // 删除本地分支
// 如果本地分支和远程分支相关连,本地分支没有完成合并原创分支的提交,-d无法删除
git branch -D local_branch_name // -D表示强制删除,--delete --force,无论合并状态如何都会强制删除
//删除远程分支 git push 仓库名 -d 分支名
git push origin -d branch_name
定义别名alias
$ git config --global alias.st status
$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.br branch
// 包含参数时用 ''包裹
$ git config --global alias.cb 'checkout -b'
$ git config --global alias.po 'push --set-upstream origin'
$ git config --global alias.unstage 'reset HEAD'
$ git config --global alias.last 'log -1'
$ git config --global alias.brnow "rev-parse --abbrev-ref HEAD"
$ git config --global alias.alog "log --oneline --graph --all"
$ git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
查看已经配置的别名:git config —global —list
可以在目录/Users/shuai下查看.gitconfig文件,就是git的所有配置
tag标签的使用
// 列出所有标签
$ git tag -l
打tag
git tag分为两种类型:轻量tag和附注tag。轻量tag是指向提交对象的引用,附注Tag则是仓库中的一个独立对象。建议使用附注Tag。
// 创建轻量Tag
$ git tag v0.1.2-light
// 创建附注Tag
$ git tag -a v0.1.2 -m “0.1.2版本”
创建轻量Tag不需要传递参数,直接指定Tag名称即可。
创建附注Tag时,参数a即annotated(注释)的缩写,指定Tag类型,后附Tag名。参数m指定Tag说明,说明信息会保存在Tag对象中。
切换tag
通过指定的tag切出分支
tag推送到服务器
$ git push origin v0.1.2 # 将v0.1.2 Tag提交到git服务器
$ git push origin –-tags # 将本地所有Tag一次性提交到git服务器
删除tag
git log
显示commit的记录
git reflog:显示所有分支的提交记录
merge和rebase的区别
用rebase可以使提交的历史记录显得更简洁
从master创建出issue2和issue3分支
git checkout -b issue2
git checkout -b issue3
对issue2使用merge命令
修改issue2分支内容后,然后切换到master分支。
git checkout master
执行merge合并issue2操作
git merge issue2
issue3使用rebase命令后在merge
修改issue3分支的内容,使用git rebase master,有冲突先处理冲突,
然后将修改的内容添加到缓冲区,git add .
继续执行git rebase —continue.将issue3的内容和master进行同步,然后切换到master分支
git checkout master,再次进行merge
git merge issue3
rebase可以合并多次提交记录(commit)
压缩x个commit,只保留一个commit
git rebase -i HEAD~x
执行过git rebase -i HEAD~3,会进入vi信息确认页面
接下来修改pick为s,只保留一个重要的pick。
修改完成保存退出。操作完成
stash保存临时修改内容
git stash save [name-111]:将改变的内容暂存
git stash list:显示暂存的列表
git stash apply [name-xy]:应用缓存的文件
git stash pop [name-xy]: 应该赞成的文件并将暂存记录删除
git stash drop [name-xy]: 删除暂存的文件
git stash clear :删除所有暂存文件
pull 和fetch/merge
git pull 相当于git fetch 和git merge
cherry-pick
提取一次提交到指定分支
在日常开发中,有时需要将某一次提交的内容合并到指定分支,可以使用cherry-pick命令,在source-tree软件中对应的是遴选操作。
现在有master和version1分支,version1分支提交了多次,现在只需要合并version1分支第一个提交内容到master分支。
提取多次commit到指定分支
git reset和git revert的区别
- reset不会产生回退记录,修改的内容不会保存,是不可逆的操作
- revert会产生回退记录,但是多数会产生冲突,需要手动处理冲突。比较安全的操作方式
更多详细操作:https://juejin.cn/post/6844904170470785038
revert操作,提交回滚记录,回有commit记录
提交回滚,可以用于远程,会多一次commit记录
// 回退某一次或多次提交,属于单独操作回退某次提交,不会对其他操作有影响
git revert bd1b80cb 0f2f7e4a
// 回退从a到b的某些操作,属于前开后闭。保留a且回退掉b。该命令回退掉中间的所有操作
git revert --no-commit f73g2cd..559ic408
—no-commit修饰的添加,可以把多次回退的提交一次进行修改,如果不添加该命令,那么中间有几次commit就需要处理几次revert的重复操作。
使用reset(soft和hard)会退代码或commit提交
git reset多用于本地,不可用于远程仓库,因为会直接重置到某次提交
//重置到e423se的提交,--soft保留修改的代码内容
git reset --soft e423se
//重置到f8d934的提交,hard会把修改的所有内容都给清除掉
git reset --hard f8d934
// 可以撤销上次commit,该commit还没有执行push,--soft会保留更改的代码,--hard会取消掉代码
git reset --soft HEAD^
git push -f,强制推送提交记录,
可以把已经推送到远程的commit给清除掉,注意⚠️只能应用到自己独立分支上。
使用reset会退已经提交的代码
git reset HEAD^ #回退所有内容到上一个版本
git reset HEAD^ a.py #回退a.py这个文件的版本到上一个版本
git reset –soft HEAD~3 #向前回退到第3个版本
git reset –hard origin/master #将本地的状态回退到和远程的一样
git reset 057d #回退到某个版本
restore,取消修改
- git restore [file] 取消工作区修改的文件
- git restore —staged [file] 取消暂存区修改的文件,还原到工作区。
在本地修改了一些文件,后来发现这些修改会出现错误,可以撤销这些修改。
// 将工作区修改的文件取消修改,此时并未执行add命令
git restore .
如果执行了add命令,将修改添加到了暂存区。那么就需要—staged
// 将暂存区修改的文件取消修改,此时并未执行commit命令.可以将暂存区文件还原到工作区。
git restore --staged .
restore 命令,默认是带着 —worktree 参数,即默认是取消工作区文件。
squash合并多次commit为一个commit
使用git merge —squash [branch]
实际开发过程中,会存在多次commit,这些commit是为了完成同一个任务,那么就可以把这些多次的commit合并为一个。
首先:从master创建version1和version2分支。
version2分支进行三次commit提交
把version2分支直接合并到master会造成master分支的提交信息杂乱。可以先将多次commit合并。
切换到version1分支
执行squash命令
git merge —squash version2
这样就可以把多次commit的内容全部更新到version1分支。然后在分支version1下执行一次commit,
git commit -m”version2 all commit”。
完成了合并多次commit为一次commit操作。
常见报错处理
报”unable to update local ref”错误
使用git pull拉取代码的时候,无法拉取最新代码,报”unable to update local ref”错误。
除了重新clone一份代码外,还可以使用如下解决方案:
1、切换到之前clone代码目录下,执行命令git gc —prune=now
2、再执行命令git remote prune origin
3、再次使用git pull
git push报错
fatal: unable to access ‘https://github.com/shenshuai89/vue-front.git/‘: Failed to connect to github.com port 443: Timed out
git config —global —unset http.proxy
git config —global —unset https.proxy