Git问题合集

168 阅读9分钟

一、每日工作流程

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

 

blog.csdn.net/weixin_4667…

git flow

只有feature合并到developer分支时, 使用-no-ff参数,其他的合并都不使用–no-ff, 非快速合并

 

 

 

 

 

 

1.2集成式工作流

在open source project,我们有很多贡献者,只有维护者能push到仓库。

其他贡献者用fork来复制仓库,然后clone这个仓库,保存到本地。

本地有commit之后push到fork的仓库,maintainer从我们的fork 仓库pull文件。

他觉得可以,才会merge我们的文件到正式的仓库中。

一般用于开源项目,这里先不整理。

 

blog.csdn.net/weixin_4424…

 

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

www.jianshu.com/p/aa71e91ca…

blog.csdn.net/wangdawei_/…

blog.csdn.net/Fan0920/art…

 

三、常用git命令

image.png

 

E:创建快照

一天提交5-10次,修复bug和错别字

跟同事的语法保持一致

Git commit -am+message保存和commit一起

Rm删除文件

因为移动和删除文件一般都会在vscode工具中进行,所以这里就不整理了。

四、gitignore

blog.csdn.net/weixin_4399…

 

image.png

如果你已经commit到仓库了, gitignore就没办法忽略它了

 

五、git命令大全

  1. 视觉化diff工具

Git config --global -e

  1. 恢复到更早版本

  2. vscode git插件

image.png

4.取消缓存 git restore - - stage file2.js 回到未被跟踪状态,add之前

从暂存区和工作文件夹删除了不该删除的文件,应该怎样恢复?

Git restore - - source=HEAD~1 file1.js

  1. 筛选历史

按照姓名,日期,文件中包含的字符来筛选, 甚至可以筛选出某一文件变化的版本

格式化log 记录, 可以打印彩色的作者,版本号

6.查看具体commit

Git show HEAD~2

Git diff HEAD~2 HEAD  - -name-only

  1. 转换分支

Git checkout master

  1. 恢复删除文件

恢复commit过的删除文件

 

六、bisect

用二分法找到有Bug的版本

七、blame工具

根据文件贡献度查找程序员

八、分支

1.查看当前分支 git branch

Git status

  1. git switch bugfix转入分支

  2. 更换分支名字 git branch -m bugfix bugfix/signup-form

Git log - - oneline - -all查看所有分支

3.删除分支

Git branch -d 分支 未合并分支会有提示

Git branch -D 强制删除,不管有无合并

  1. 比较分支

Git diff master ..bugfix/signup-form

Git diff - -name-status bugfix/signup-form

  1. 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 两条线的改变都保留

  1. 删除主线和支线的标签,手动将两个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中使用分支