git

git 分支管理

  • master 分支保持全部特性。

  • 每个开发者拉取自己的特性分支feture。

  • hotfix分支修复紧急问题。

  • release分支发布线上,并针对版本打tag。

  • pre-release 预发和测试。

git提交规范

feat - 新功能 feature

fix - 修复 bug

docs - 文档注释

style - 代码格式(不影响代码运行的变动)

refactor - 重构、优化(既不增加新功能,也不是修复bug)

perf - 性能优化

test - 增加测试

chore - 构建过程或辅助工具的变动

revert - 回退

build - 打包

git 命令使用

提交修改

1
2
3
git add -A 

git add filepath

使用git在本地新建一个分支后,需要做远程分支关联

  • git branch --set-upstream-to=origin/small(remoteName) small (localName)

跟踪分支,如果本地分支想和远程的某个分支变成跟踪分支,即push 和 pull 自动同步

  • git branch --track newsmall(localName) origin/newsmall(remoteName)

git commit 想撤回

1
2
3
git log (展示所有commit,退出查看日志:q) 

git reset commit_id(commit 的id号,前八位就行)

git add 想撤回

1
2
3
git reset HEAD fileName 

git reset HEAD (撤销全部add)

git add 想diff比较

1
2
3
git diff --staged 

git diff --cached filepath

回退

1
2
3
4
5
git reset --hard commitID, 把整个 git 回退到这个 commitID 里

git reset --soft commitID

仅仅把所做的 commit 丢掉,而改动都保留在本地——通常用来修改,再重新 commit 一遍。

好奇其他分支

1
git diff branchName filepath

git commit 想diff

1
git diff commitId filepath

分支

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
创建分支:git branch myself

切换分支:git checkout myself

查看远程分支:git branch -r

查看全部分支:git branch -a

查看本地分支:git branch

删除分支: git branch -D branchName

删除远程分支:git push --delete origin oldName

本地分支重命名:git branch -m oldName newName

上传新命名的本地分支:git push origin newName

把修改后的本地分支与远程分支关联:git branch --set-upstream-to origin/newName

将某个分支的修改带到另一个分支

1
2
3
4
5
6
7
8
9
git stash
git stash save “修改的信息"

切换到另一个分支git checkout anotherBranch

git stash pop
或者
git stash list
git stash apply stash@{0}

拉取代码

1
2
3
4
5
6
7
git pull --rebase

git pull 的默认行为是 git fetch + git merge

git pull --rebase 则是git fetch + git rebase 执行过程中会将本地当前分支里的每个提交(commit)取消掉

git fetch 从远程获取最新版本到本地,不会自动合并分支

git pull –rebase冲突

1
2
3
4
5
git rebase --abort 会放弃合并,回到rebase操作之前的状态

git rebase --skip 丢弃冲突的commits(慎用!!)

git rebase --continue 合并冲突,提示开发者,一步一步解决

ignore 规则

1
2
3
4
5
6
7
8
9
10
11
/node/two/node_modules
*.sublime*
*.zip
*.jshintrc
# 忽略了node_modules文件
# *.zip 过滤所有.zip文件
# /fileName/do.txt 过滤某个具体文件
# 前面加!表示只提交该内容
# !*.zip只提交zip文件
# doc/*.txt 会忽略 doc/child.txt 但不包括 doc/ddd/descendant.txt
# build/ 忽略 build/ 目录下的所有文件

多git管理

  • 在生成第二个第n个帐号密钥时,公匙,私匙要生成新的名字,不能还是id_rsa.pub, id_rsa

  • 在.ssh目录下创建config文件(没有拓展名)

1
2
3
4
5
6
7
8
9
10
11
12
Host gitlab.com
HostName 121.40.212.132
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa
Host github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_p
Host gitlab.sss.cn
User liuyongshun2@126.com
Hostname gitlab.sss.cn
IdentityFile ~/.ssh/sq_id_rsa

业务场景

1.合并太多的commit

  • git rebase -i HEAD~3 对前四个补丁就行修改,就会进入以下界面

1
2
3
4
5
6
7
8
9
10
11
12
13
p,pick:保留该commit,不做更改

r,reword:保留该commit,但我需要修改该commit的注释

e,edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)

s,squash:将该commit和前一个commit合并

f,fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息

x,exec:执行shell命令

d,drop:我要丢弃该commit

fixup:

跟 squash 作用一样,但是会丢弃当前 commit 信息,使用上一个的;

squash:

则是可以让你重新写,需要修改时,把上面四个补丁最前面的 pick 改成对应操作(如 reword,fixup),然后保存退出即可。

  • 将commit合并,修改内容(vim语法),修改完后按esc进入vim的命令模式,输入:wq保存
1
2
3
pick c4a113d 1 error
s 62ca257 2 error
s baf5621 3 error

上面s的意思是把第二次、第三次提交都合并到第一次提交上

  • 保存后弹出如下内容,vim的dd命令是删除整行,删掉多余的commit描述,只留自己想要的即可(或者重新编辑)

  • 最终整理后合并commit后的效果,修改完后按esc进入vim的命令模式,输入:wq保存

  • 最后强制push上去,git push --force

自我救赎

git rebase --abort

2.分支feature_dev,开发者A,提交了无用代码,n天后才通知B,此时B已经开发并提交了很多代码

  • 新建分支,作为备份分支

  • git revert commitID 重做开发者A的几个提交去掉对应的代码

  • 合并重组后的代码

git revert

使用 git revert 可以撤销指定的提交, 要撤销一串提交可以用 <commit1>..<commit2> 语法。 注意这是一个前开后闭区间,即不包括 commit1,但包括 commit2。

git revert --no-commit f7742cd..551c408

如果我们想撤销之前的某一版本,但是又想保留该目标版本后面的版本,可以用这种方法

git revert commitId

git reset

如果想恢复到之前某个提交的版本,且那个版本之后提交的版本都不需要,可以使用该方法

git reset --hard commitId

其他思路1

有提交:1、2、3、4、5、6、7、8、9、10, 想保留1+2+10

  • 可以先执行 git checkout -b newbranch commitid2来把1+2单拎出来。

  • 然后执行然后git cherry-pick commitId10 将commit10拉过来。

其他思路2

有提交:1、2、3、4、5、6、7、8、9、10,想踢出4,6,可以用上面的revert重写。

其他思路3

如果想剔除的和想保留的都很多,可以先用git rebase -i HEAD~n 合并提交在如上操作。

返回
顶部