学习教程

猴子都能懂的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过滤

  1. git branch | grep "feature-01" //可以搜索出feature-01开头的分支
  2. git tag | grep "feature-01" //可以搜索出feature-01开头的标签

创建分支

  1. // 从远程创建分支,在本地创建一个和远程相关联的同样的分支
  2. git checkout -b integration/release-2105 origin/integration/release-2105
  3. // 创建出一个新的分支,作为自己开发
  4. git checkout -b feature/release-2105-shen
  5. // 推送自己的开发分支到远程
  6. // git push -u origin [localBranchName]:[remoteBranchName]
  7. git push -u origin feature/release-2105-shen:feature/release-2105-shen
  8. // 或者简写
  9. git push origin [branchName]
  10. // 查看关联分支
  11. git branch -vv

只显示当前分支

  1. git rev-parse --abbrev-ref HEAD

删除分支

  1. git branch -d local_branch_name // 删除本地分支
  2. // 如果本地分支和远程分支相关连,本地分支没有完成合并原创分支的提交,-d无法删除
  3. git branch -D local_branch_name // -D表示强制删除,--delete --force,无论合并状态如何都会强制删除
  4. //删除远程分支 git push 仓库名 -d 分支名
  5. git push origin -d branch_name

定义别名alias

  1. $ git config --global alias.st status
  2. $ git config --global alias.co checkout
  3. $ git config --global alias.ci commit
  4. $ git config --global alias.br branch
  5. // 包含参数时用 ''包裹
  6. $ git config --global alias.cb 'checkout -b'
  7. $ git config --global alias.po 'push --set-upstream origin'
  8. $ git config --global alias.unstage 'reset HEAD'
  9. $ git config --global alias.last 'log -1'
  10. $ git config --global alias.brnow "rev-parse --abbrev-ref HEAD"
  11. $ git config --global alias.alog "log --oneline --graph --all"
  12. $ 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标签的使用

  1. // 列出所有标签
  2. $ git tag -l

打tag

git tag分为两种类型:轻量tag和附注tag。轻量tag是指向提交对象的引用,附注Tag则是仓库中的一个独立对象。建议使用附注Tag。

  1. // 创建轻量Tag
  2. $ git tag v0.1.2-light
  3. // 创建附注Tag
  4. $ git tag -a v0.1.2 -m 0.1.2版本”
  5. 创建轻量Tag不需要传递参数,直接指定Tag名称即可。

创建附注Tag时,参数a即annotated(注释)的缩写,指定Tag类型,后附Tag名。参数m指定Tag说明,说明信息会保存在Tag对象中。

切换tag

git checkout [tagname]

通过指定的tag切出分支

git checkout -b

tag推送到服务器

  1. $ git push origin v0.1.2 # 将v0.1.2 Tag提交到git服务器
  2. $ git push origin –-tags # 将本地所有Tag一次性提交到git服务器

删除tag

$ git tag -d [tagName]

git log

显示commit的记录

image.png

git reflog:显示所有分支的提交记录

image.png

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
image.png

issue3使用rebase命令后在merge

修改issue3分支的内容,使用git rebase master,有冲突先处理冲突,
然后将修改的内容添加到缓冲区,git add .
继续执行git rebase —continue.将issue3的内容和master进行同步,然后切换到master分支
git checkout master,再次进行merge
git merge issue3
image.png

rebase可以合并多次提交记录(commit)

压缩x个commit,只保留一个commit

  1. git rebase -i HEAD~x

执行过git rebase -i HEAD~3,会进入vi信息确认页面
Snipaste_2021-09-10_23-03-49.jpg
接下来修改pick为s,只保留一个重要的pick。
Snipaste_2021-09-10_23-05-05.jpg
修改完成保存退出。操作完成
Snipaste_2021-09-10_23-06-46.jpg

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分支。
image.png

提取多次commit到指定分支

git使用 - 图9

git reset和git revert的区别

  • reset不会产生回退记录,修改的内容不会保存,是不可逆的操作
  • revert会产生回退记录,但是多数会产生冲突,需要手动处理冲突。比较安全的操作方式

更多详细操作:https://juejin.cn/post/6844904170470785038

revert操作,提交回滚记录,回有commit记录

提交回滚,可以用于远程,会多一次commit记录

  1. // 回退某一次或多次提交,属于单独操作回退某次提交,不会对其他操作有影响
  2. git revert bd1b80cb 0f2f7e4a
  3. // 回退从a到b的某些操作,属于前开后闭。保留a且回退掉b。该命令回退掉中间的所有操作
  4. git revert --no-commit f73g2cd..559ic408

—no-commit修饰的添加,可以把多次回退的提交一次进行修改,如果不添加该命令,那么中间有几次commit就需要处理几次revert的重复操作。

使用reset(soft和hard)会退代码或commit提交

git reset多用于本地,不可用于远程仓库,因为会直接重置到某次提交

  1. //重置到e423se的提交,--soft保留修改的代码内容
  2. git reset --soft e423se
  3. //重置到f8d934的提交,hard会把修改的所有内容都给清除掉
  4. git reset --hard f8d934
  1. // 可以撤销上次commit,该commit还没有执行push,--soft会保留更改的代码,--hard会取消掉代码
  2. git reset --soft HEAD^

git push -f,强制推送提交记录,
可以把已经推送到远程的commit给清除掉,注意⚠️只能应用到自己独立分支上。
使用reset会退已经提交的代码

  1. git reset HEAD^  #回退所有内容到上一个版本     
  2. git reset HEAD^  a.py #回退a.py这个文件的版本到上一个版本     
  3. git reset soft  HEAD~3 #向前回退到第3个版本      
  4. git reset hard  origin/master #将本地的状态回退到和远程的一样
  5. git reset 057d  #回退到某个版本

restore,取消修改

  • git restore [file] 取消工作区修改的文件
  • git restore —staged [file] 取消暂存区修改的文件,还原到工作区。

在本地修改了一些文件,后来发现这些修改会出现错误,可以撤销这些修改。

  1. // 将工作区修改的文件取消修改,此时并未执行add命令
  2. git restore .

如果执行了add命令,将修改添加到了暂存区。那么就需要—staged

  1. // 将暂存区修改的文件取消修改,此时并未执行commit命令.可以将暂存区文件还原到工作区。
  2. git restore --staged .

restore 命令,默认是带着 —worktree 参数,即默认是取消工作区文件。

squash合并多次commit为一个commit

使用git merge —squash [branch]
实际开发过程中,会存在多次commit,这些commit是为了完成同一个任务,那么就可以把这些多次的commit合并为一个。

首先:从master创建version1和version2分支。

version2分支进行三次commit提交

image.png
把version2分支直接合并到master会造成master分支的提交信息杂乱。可以先将多次commit合并。

切换到version1分支

git checkout version1

执行squash命令

git merge —squash version2
image.png
这样就可以把多次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