一、每日工作流程
1.1中心化合作流
我们把版本存在私人服务器或者git这样的云端
工作伙伴通过克隆得到自己的文件版本
JOHN通过push将自己的commit传到云端, 然后amy 用pull 将John的commit放到自己的local 仓库, 如果john的commit和amy 自己的有冲突,解决完后将change push到中心仓库。
一般都是采用中心化合作流
1.1.1 创建项目,添加同事
Github网页上settings à manage access à invite collaborator
增加贡献的同事,同事会收到邮件。
(E: 创建Github仓库)
这一步不管是1.1还是1.2都有
1.1.2 克隆仓库
Git clone + ssh 复制的链接 + 自定义仓库名
Cd MarsProject 仓库名
Git log --oneline --all --graph 查看所有版本
Orgin/master 和 origin/head指针 orign指的是远程仓库
(远程仓库orign分支是一种链接,我们不能switch到origin, origin/head远程仓库的head)
Git remote显示所有远程仓库
Git remote -v可以显示我们有fetch和pull两种对链接的操作方法
1.1.3 git pull
Fetch获取云端仓库的内容,因为本地和云端是不同步的, 但我们一般不这么用。
Git pull = git fetch + git merge origin/master
Git pull默认是三方合并, 如果想要线性合并
Git pull --rebase
直接在github网页上的修改也需要git pull
1.1.4 git push
Git switch -C -feature/change-password
Git push -u origin 新分支名称
git push origin <本地分支名>:<远程分支名> (同名可以只写一遍)
删除远程分支
Git push -d origin feature/change-password
Git branch -vv查看远程分支
删除本地分支
Git branch -d feature/change-password
git flow
只有feature合并到developer分支时, 使用-no-ff参数,其他的合并都不使用–no-ff, 非快速合并
1.2集成式工作流
在open source project,我们有很多贡献者,只有维护者能push到仓库。
其他贡献者用fork来复制仓库,然后clone这个仓库,保存到本地。
本地有commit之后push到fork的仓库,maintainer从我们的fork 仓库pull文件。
他觉得可以,才会merge我们的文件到正式的仓库中。
一般用于开源项目,这里先不整理。
commit程序员自己控制,一天多次,仓库的master原则上每天一次push。版本分支不定期push。
1.2.1 创建项目,添加同事
Github网页上settings à manage access à invite collaborator
增加贡献的同事,同事会收到邮件。
(E: 创建Github仓库)
这一步不管是1.1还是1.2都有
二、常规分支debug流程
由研发经理通知相关工程师release版本x.x
git fetch
git checkout -b release/x.x origin/release/x.x(将远程git仓库里的指定分支origin/release/x.x拉取到本地的 release/x.x 分支)
git pull origin release/x.x (更新该分支 git pull <远程库名> <远程分支名>:<本地分支名>)
修改测试中发现的BUG
git push origin release/vx.x(修改完后提交分支)
循环4-5
三、常用git命令
E:创建快照
一天提交5-10次,修复bug和错别字
跟同事的语法保持一致
Git commit -am+message保存和commit一起
Rm删除文件
因为移动和删除文件一般都会在vscode工具中进行,所以这里就不整理了。
四、gitignore
如果你已经commit到仓库了, gitignore就没办法忽略它了
五、git命令大全
- 视觉化diff工具
Git config --global -e
-
恢复到更早版本
-
vscode git插件
4.取消缓存 git restore - - stage file2.js 回到未被跟踪状态,add之前
从暂存区和工作文件夹删除了不该删除的文件,应该怎样恢复?
Git restore - - source=HEAD~1 file1.js
- 筛选历史
按照姓名,日期,文件中包含的字符来筛选, 甚至可以筛选出某一文件变化的版本
格式化log 记录, 可以打印彩色的作者,版本号
6.查看具体commit
Git show HEAD~2
Git diff HEAD~2 HEAD - -name-only
- 转换分支
Git checkout master
- 恢复删除文件
恢复commit过的删除文件
六、bisect
用二分法找到有Bug的版本
七、blame工具
根据文件贡献度查找程序员
八、分支
1.查看当前分支 git branch
Git status
-
git switch bugfix转入分支
-
更换分支名字 git branch -m bugfix bugfix/signup-form
Git log - - oneline - -all查看所有分支
3.删除分支
Git branch -d 分支 未合并分支会有提示
Git branch -D 强制删除,不管有无合并
- 比较分支
Git diff master ..bugfix/signup-form
Git diff - -name-status bugfix/signup-form
- stashing
本地有改动未提交,不可以换分支
这个时候就需要stashing, 就是把它保存在安全的地方, 把它存在git仓库的某个地方, 但这不会写入历史中。
git stash push –m “new stash”将改动储存
git stash push -am 储存所有改动文件
git stash list 查看储存的文件改动 stash@{0}: On master: My new stash
这样就能顺利切换到分支
返回主线 取回stash中的文件
Git stash show stash@{0} 查看储存的文件
Git stash show 1
最后用Git stash apply 1取回文件
Git stash drop 1 取出文件一后,删除stash中的文件
git stash clear清空文件
九、合并
9.1快进合并
Master上面没有新的commit, git指针直接移动到bugfix分支上。合并后删除bugfix指针即可
Git switch -C bugfix/login-form
Git commit -am
Git switch master
9.2三路合并
开始分支之前的最后一个snapshot
开启分支之后两个分支上的最后一次提交
这三个版本合成一个
Git merge - -no-ff bugfix/login-form 非快速合并,三路合并
Git log - -oneline - -all - -graph 显示出三路合并
尽量避免使用快进合并的原因:
即使是线性的, 当我们使用三路合并, 如果要取消feature, 只要取消最后一个合并commit即可
快进合并当要舍弃feature的时候, 会更加复杂
git config ff no 会禁止在当前仓库中使用快进合并
9.3 查看合并分支
Git branch - - merge
Git branch -d bugfix/login-form 删除已合并分支
Git branch - -no-merge查看未合并分支
9.4合并冲突
9.4.1 常见冲突
同一个文件在两个分支,被改成了两个版本
这时候需要手动合并,我们在合并的中途进去
Git merge bugfix/change-password
Conflict 会出现具体的文件
Git status
Code change-password.txt用vscode打开文件
四个选项:
1.accept current change 就是选择主线中的改变
2.accept incoming change 就是选择支线中的改变
3.accept both changes 两条线的改变都保留
- 删除主线和支线的标签,手动将两个change合并,但是记住尽量避免写入新的代码,不要写入除了这两个分支内的其他任何代码
保存关闭vscode
Git add password.txt
Git status
变成无冲突
Git commit 完成合并
可视化合并工具
9.4.2. 中止合并
git merge – -abort 就能回到合并前
9.4.3 撤销错误合并
如果是移除本地的commit,改写历史是可以的
如果是移除远程与别人共享的commit,是不行的
我们要提交一个新的commit 取消在最新commit中的所有更改
如何删除合并的commit?适合三路合并
将head和master指针返回到合并之前的commit版本
这个合并commit会因为没有指针指向它而被git自动删除
Git reset –soft HEAD~1 soft选项只影响最后一次commit,不影响stage和我们的文件夹
Mixed mixed选项会将新的commit放入staging和commit
Hard hard选项三个地方都会变成上一个commit的文件, 完全返回到合并之前
三方合并的commit并没有被删除
可以用git reset –hard 三路合并commit的版本号,来恢复合并
如何逆转commit?revert
他举得例子都是三路合并,
因为是master merge feature
所以用master作为返回的parent
Git revert -m 1 HEAD
返回最后一次提交到master上面
9.4.4 squash merge
b1和b2合并到master
但里面有一些版本是包含修复Bug的, 我们不想在主线中包含这些东西
比如只是修复Bug, 我们不需要修复Bug的过程, 只要修复Bug后的最终版本
所以我们将b1和b2合并, 然后直接把这个合并的版本放到主线上
然后删除b1b2, 留下一条单线,master主线
或者是一些小的功能, 马上就能写好的
Git merge – squash bugfix/photo-upload
使用squash merge要记得删除这个支线, 因为它没有跟主线合并, 是独立的分支, 之后再查看的话,可能会误以为忘记合并
Git branch -D bugfix/photo-upload
9.4.5 rebasing
rebase将基础commit改为master上的最新commit, 然后用快进合并到达f2
但是rebasing会修改历史, 所以只能在本地使用
就是主线上有更改,但不想要三路合并
git是不能修改f1的parent commit的, 所以它只是复制了f1和f2到master最新commit的前面,然后将feature指针指向复制品f2,这样没有指针的原f1和f2最终会被销毁
git switch feature/shopping-cart
git rebase master
正常情况下rebase会有很多conflicts
Git switch master
Git merge feature/shopping-cart
变成快速合并
rebase有冲突的时候,打开合并工具
Git rebase –continue 解决冲突后,进入下一个commit
它就是对比每个commit和新分支之间的差别
如果新的commit还有冲突,重复打开工具和continue,一个个解决
--skip跳过当前的commit
--abort 退出rebase
9.4.6 cherry picking
主线和支线没有要合并, 但是又想要在主线上使用支线中的某个版本功能,这时候就要使用cherry picking。
git cherry pick 支线具体版本号
会进入cherry picking状态
有新功能里的文件出现在文件夹中
使用git commit 主线就自动获取这个新功能了, 并且并没有和支线合并
cherry pick是从分支获取一个commit
pick file是单独获取一个文件
在新分支创建新文件并提交
在主线使用restore 从支线中 将文件恢复到我们工作的文件夹中
Git switch -C feature/send-email
Echo river > toc.txt
Git commit -am
Git switch master
Git restore –source= feature/send-email –toc.txt
9.4.7 分支命名
用feature/命名,在vscode中是按照这个分成文件夹的,方便查看
vs中使用分支