技术大佬灵魂七问:如何知道自己搞明白了git ?
- 1、为什么要先commit再push?能省这一步吗?
- 2、push 带不带 -f 有什么具体的区别?
- 3、Tag 又是什么?跟分支和提交什么关系?
- 4、经常看到的 origin 是什么?
- 5、不改动文件内容的情况下,新建100个分支对仓库容量有多大影响?
- 6、git pull的时候哪些情况下会自动生成提交,这些提交又有哪些特征?
- 7、pull、fetch、merge 之间的区别和联系?
1、为什么要先commit再push?能省这一步吗?
先 commit 再 pull 再 push 的规范,是为了应对多人合并开发的场景。
1. `commit` 把提交内容放到本地的暂存区,是为了告诉 git 这次提交改了哪些东西,不然 git 不知道改了,也就无从判断比较;
2. `pull`是为了本地 commit 和 远程commit 的对比记录,git 是按照文件的行数操作进行对比的,如果同时操作了某文件的同一行那么就会产生冲突,git 也会把这个冲突给标记出来,
这个时候就需要先把和你冲突的那个人拉过来问问保留谁的代码,然后在 `git add && git commit && git pull` 这三连,
再次 pull 一次是为了防止再你们协商的时候另一个人给又提交了一版东西,如果真发生了那流程重复一遍,通常没有冲突的时候就直接给你合并了,不会把你的代码给覆盖掉;
3. 出现代码覆盖或者丢失的情况:比如A B两人的代码pull 时候的版本都是1,A在本地提交了2,3并且推送到远程了,B 进行修改的时候没有`commit` 操作,
他先自己写了东西,然后 `git pull` 这个时候 B 本地版本已经到3了,B 在本地版本3的时候改了 A 写过的代码,再进行了`git commit && git push` 那么在远程版本中就是4,
而且 A 的代码被覆盖了,所以说所有人都要先 commit 再 pull,不然真的会覆盖代码的.
2、push 带不带 -f 有什么具体的区别?
带-f 会忽略前面多人协作开发中,设立commit、pull 再push的前提,所以不推荐使用, 这是很危险的行为,但是在单人独立负责模块,无人协作的时候,可以很方便。
3、Tag 又是什么?跟分支和提交什么关系?
Git 可以给仓库历史中的某一个提交打上标签,以示重要。如果你达到一个重要的阶段, 并希望永远记住那个特别的提交快照,可以使用 git tag 给它打上标签。
比如说,我们想为我们的 runoob 项目发布一个"1.0"版本。
我们可以用 git tag -a v1.0 命令给最新一次提交打上(HEAD)"v1.0"的标签。
通常在软件发布的时候会打一个tag,用于标注这次发布的相关信息, 这样做的好处是,将来如果这个版本出现了问题,可以通过tag迅速定位到当前版本,进行错误复。
参考 git tag使用
4、经常看到的 origin 是什么?
简单来说,origin 指向的就是你本地的代码库托管在Github上的版本。相当于本地仓库在远程的映射。
5、不改动文件内容的情况下,新建100个分支对仓库容量有多大影响?
没什么影响,只是增加了一个指针指向新的branch.
6、哪些情况下会自动生成提交,这些提交又有哪些特征?
在git pull的时候,如果本地分支不一致,会自动提交commit, 并生成一条“Merge branch ‘master’ of …”的commit.这也是对git操作不熟悉常见的新手印记(手动狗头)
7、pull、fetch、merge 之间的区别和联系?
git merge FETCH_HEAD // 将目标分支最新的commit记录合并到当前分支
git fetch //这将更新git remote 中所有的远程repo 所包含分支的最新commit-id, 将其记录到.git/FETCH_HEAD文件中
git pull操作其实是git fetch 与 git merge 两个命令的集合。
git pull 等效于先执行 git fetch origin 当前分支名, 再执行 git merge FETCH_HEAD.