git

163 阅读3分钟

git remote

添加远程版本库:

git remote add [shortname] [url]
git remote -v 
git remote rm name  # 删除远程仓库
git remote rename old_name new_name  # 修改仓库名

git submodule

git submodule add <仓库地址> <本地路径>
添加成功后,在父仓库根目录增加了.gitmodule文件。
git submodule init
git submodule update

★ git rebase

image.png

git checkout feature
git rebase master

//这两条命令等价于git rebase master feature
解释一下:就是说,你要先切到feature分支上,然后再把前面master合到feature上

image.png

解释:当在feature分支上执行git rebase master时,git会从master和featuer的共同祖先B开始提取feature分支上的修改,也就是C和D两个提交,先提取到。然后将feature分支指向master分支的最新提交上,也就是M。最后把提取的C和D接到M后面,但这个过程是删除原来的C和D,生成新的C’和D’,他们的提交内容一样,但commit id不同。feature自然最后也是指向D。

再捋一下流程:

  • 先切换到自己分支

  • git rebase 其他分支名字

  • 如果有冲突,解决冲突

  • 然后一定要commit 【git commit】

  • 然后再git rebase --continue


★ --continue\ --abort\ --abort

git rebase --continue

执行完$git pull --rebase 之后,本地如果产生冲突,手动解决冲突之后,用"git add"命令去更新这些内容的索引(index),然后只要执行:

$ git rebase --continue 就可以线性的连接本地分支与远程分支,无误之后就回退出,回到主分支上。
注意:一般情况下,修改后检查没问题,使用rebase continue来合并冲突。

git rebase --abort

执行之后,本地内容会回到提交之间的状态,也就是回到以前提交但没有pull是的状态,简单来说就是撤销rebase

git rebase --skip

git rebase --skip 引起冲突的commits会被丢弃,对于本文应用的例子来说开发者A对c.sh文件的commit无效,开发者A自己修改的部分全部无效,因此,在使用skip时请慎重。

执行:$ vim c.sh

查看本地c.sh文件提交内容,展示如下图所示,执行语句之后开发者A的修改无效。
在这里插入图片描述


★ rebase 和 merge的区别

git rebase 与 git merge 解决了相同的问题。都是将一个分支的提交合并到另一分支上,那它们有哪些不同喃

merge

git merge 的优势是它保留了分支的结构历史提交目录,但同时这也导致了提交历史会被大量的 merge 污染

rebase

rebase 合并往往又被称为 「变基」

它是将把所有的提交压缩成一个 patch 。然后把 patch 添加到目标分支里。rebase 与 merge 不同的是,rebase 通过为原始分支中的每个提交创建全新的 commits 来重写项目历史记录

git rebase 的优势是可以获得更清晰的项目历史。首先,它消除了 git merge 所需的不必要的合并提交;其次,正如你在上图中所看到的,rebase 会产生完美线性的项目历史记录,你可以在 feature分支上没有任何分叉的情况下一直追寻到项目的初始提交。

但是, rebase 会丢失合并提交的上下文, 使我们无法看到真实的更改是何时合并到目标分支上的


★ 总结

特点

rebase 结果之后可以看到完美的线性历史提交记录,而merge只是再当前分支多了一个merge的commit

缺点:

merge的提交记录会被大量的merge污染

rebase会丢失合并提交的上下文, 使我们无法看到真实的更改是何时合并到目标分支上的,,好像是之前的一些commit会丢掉,就剩最后一个,反正有点问题

总结

这种东西主要还是得看个人习惯,我感觉只要用的习惯,能做到合作开发就没有问题