Skip to main content

6 posts tagged with "git"

View All Tags

git协作工作流

· One min read

master分支:

用于线上发布,正式环境。只做merge develop,hotfix操作

develop分支:

用于测试环境。只做merge本地分支,cherry pick hotfix操作。

本地分支:

用于本地开发。保持和develop分支同步。

git checkout local-branch
git pull origin develop
git rebase develop

配合commitlint保持提交信息的规范。

使用git rebase -i保持commit的简洁。

git worktree的使用

· 2 min read

需求场景

之前在开发sass版后台管理系统时,有超管后台,渠道后台以及普通客户后台。3套代码大部分内容相同,但会根据需求有各自变化的部分,当时是在git仓库中建了3个分支。通过切换分支完成对应开发,在开发过程中,有个问题就是node_modules依赖不一致的问题,每次切换分支node_modules就要重新安装,非常之麻烦。后面想到一个临时的解决方法。将3个分支的代码克隆到3个不同的文件夹。每个文件夹切换到对应的分支,这样就能保持开发各自的分支互不影响。不过这种方式有一个缺点,假如A,B,C3个分支对应A,B,C三个目录。如果不小心在C目录切换到A分支上,就会出现问题。没有一个校验的过程,需要人工去避免这个误操作。为了解决这个问题,git worktree就有了用武之地。

解决方案

git worktree add ../A -b vA
git push --set-upstream origin vA

通过git worktree的操作,如果在C目录切换到A分支,git会提示错误,无法切换,这样就避免了误操作。

参考文档

https://zhuanlan.zhihu.com/p/41006726

.gitignore文件不生效?

· One min read

需求场景

.config.local文件被推送到git仓库上,这时候在.gitigore文件里再加上.config.local就会不生效。

解决方案

git rm -r --cached .
git add .
git commit -m 'update .gitignore'
git push -u origin master

git常用场景操作指南

· 2 min read

场景一:fork别人的代码,添加功能的同时想要同步作者的更新。

添加upstream的git地址

git remote add upstream url

同步更新

git fetch upstream
git merge upstream/master

场景二:fork别人的代码,想要为他添加新功能Pull request

# 基于远程master分支创建新的分支,开发完成后提交pull request
git checkout -b feature-1 upstream/master

场景三:删除本地以及远程分支

git branch -d dev
git push origin -d dev

场景四:撤销commit(版本回退)

#例如从状态D回到状态B
git reset --hard B
git reset --soft D
git push

场景五: 合并多次commit

git rebase -i commitId
vim状态下第一个保持pick,下面的改为s(squash)
vim状态下在不需要的commit信息加#注释
git push origin branchName -f

场景六:多分支并行开发

git worktree add ../A -b vA
git push --set-upstream origin vA

场景七:清除全部git记录(慎用,主要用来清理之前的不规范提交)

//新建没有提交记录的分支
git checkout --orphan latest_temp_branch
git add -A
git commit -m "Initial commit"
// 删除原来分支
git branch -d master
// 将当前分支重命名为master
git branch -m master
// 强制同步修改至远程仓库
git push -f origin master
// 关联本地 master 到远程 master
git branch --set-upstream-to=origin/master

场景八:upate .gitignore

git rm -r --cached .
git add .
git commit -m 'chore: update .gitignore'
git push -u origin master

git本地多帐号管理(You do not have permission to pull the repository)

· 2 min read

需求场景

一般开发人员会有2个以上的git账户,一个公司账户A,一个个人账户B。这就涉及一个问题,如果本机使用的A账户,当克隆B账户的项目时,可能会出现You do not have permission to pull the repository的提示。这是由于本机记住了A的帐号密码,每次操作都使用A的账户密码。所以操作B时会提示没有权限。产生这样的错误一般是采用https方式clone才会出现,所以本地多帐号可以通过ssh方式解决。通过配置多个ssh密钥可以解决这个问题,配置ssh是最安全的方式,不过缺点就是配置麻烦。如果希望通过https克隆而两个帐号又不冲突要怎么办呢?

解决方案

  1. 清空global和system的credential.helper
  2. 对每一个本地仓库,设置一下url和local的credential.helper

步骤一:清空本地全局credential.helper

git config --list | grep credential命令可以查看本地帐号密码存储的位置。mac显示的是credential.helper=osxkeychain,也就是存在本机的钥匙串中,打开钥匙串,搜索git,删除帐号密码。
删除本地的全局帐号密码后,这时候克隆B项目就不会提示错误了,提示需要输入帐号密码

步骤二:针对每个本地仓库设置credential.helper

git版本回退

· One min read

需求场景

在使用git过程中,往往需要回到某个commit,并且抛弃之后的修改。
这个时候往往会采用以下错误方式回退。

git reset --hard commitid
git push -f

-f这个参数是非常不友好的,会导致其他小伙伴无法push

解决方案

假设我们需要从D回到B状态
A --- B --- C --- D(HEAD)

git reset --hard B
git reset --soft D
git push

最终的结果
A --- B --- C --- D --- B'(HEAD)