【译】git的8个面试知识点

102 阅读5分钟

学习链接

1. 什么是版本控制系统?

image.png

版本控制系统 (version control system - VCS) 是一种程序,用于记录对文件或数据集的任何更改,以便在必要时可以将其还原到以前的版本。这可以保证团队中的每个人都工作在最新版本中。

2. 集中式版本控制系统和分布式版本控制系统的区别

image.png

集中式版本控制系统

  • 所有文件版本都存储在中央服务器上
  • 开发者没有完整的本地系统文件备份
  • 如果项目的中央服务器出现故障,就会丢失所有的项目数据。

分布式版本控制系统

  • 开发者可以在本地备份所有的代码版本
  • 提高了离线工作的能力,取消了本地单独备份的需求
  • 即使服务器出故障了,也没影响

3. git push 和 git pull的作用

image.png

git push可以把本地仓库的内容,发送到远程仓库,在执行了push之后,就会把本地仓库的改变(保证与远程同步),并把这些改变的内容分享给远程工作的成员们

image.png

git pull可以把改变的内容从远程仓库拉下来(获取),然后把那些改变的内容合并到本地分支(保证与远程同步),git pull是两种命令的结合,先是执行了git fetch(获取),然后执行git merge(合并)

4. git各个命令的作用

  • git config - 设置用户名和电子邮箱
  • git init - 初始化一个本地git 仓库
  • git add - 添加一个或多个文件 到暂存区
  • git diff - 查看文件有哪些改变的内容
  • git commit - 提交改变的内容到 head,而不是远程仓库
  • git reset - 撤销 Git 仓库的本地更改
  • git status - 显示工作仓库和暂存区的状态
  • git merge - 合并分支到当前分支
  • git push - 上传本地代码到远程仓库
  • git pull - 获取远程仓库的内容

git commit补充阅读

  • haicoder.net/git/git-com…
  • git commit 命令主要是将暂存区里的改动提交到本地的版本库。每次使用 git commit 命令我们都会在本地版本库生成一个 40 位的哈希值,这个哈希值也叫 commit-id。

  • commit-id 在版本回退的时候是非常有用的,它相当于一个快照,可以在未来的任何时候通过与 git reset 的组合命令回到这里。

git status补充阅读

5. git pullgit fetch的区别

内容来源

image.png

图中可以看到,git pull,直接获取+合并,git fetch获取之后,还有检查的步骤(是否合并)

image.png

commitID

  • git pull,本地仓库和远程仓库的commitId一样(一起 修改了)
  • git fetch,本地仓库和远程仓库的commitId不一样(需要合并)

相同

  • 都是更新代码

不同

  • git pull是从远程仓库获取最新版本,然后再与本地合并,git pull = git fetch + git merge
  • git fetch是从远程仓库获取最新版本,自己决定是否合并,更安全。

6. 什么是git 冲突,如何解决?

内容来源

冲突

  • 本地分支和远程分支的不同就会发生冲突

解决方式两种

  • master分支 - 有权限的话
  • 本地分支

当前是master分支

  • 获取远程master分支
  • 获取dev分支(有冲突的)
  • 解决冲突(应用那个分支内容)
  • 提交代码,这时候已经把远程master分支修改了,本地分支(有冲突的)也自动合并了!

当前是dev分支(无master权限)

  • 获取远程dev分支
  • 获取master分支
  • 解决冲突
  • 提交代码
  • 在gitlab等,应用合并请求。(多了一个这个步骤)

7. 什么是git stash

内容来源

git stash

  • 保存暂存区和工作区的改动,保存在一个栈上
  • 保存内容
    • 添加到暂存区的修改(staged changes)
    • git跟踪的,但未添加到暂存区的修改(unstaged changes)
  • 未保存内容
    • 工作区的新文件(untracked files)
    • 被忽略的文件(ignored files)
  • 保存所有文件
    • 如果想要上述的文件都被缓存,可以使用-u或者--include-untracked可以工作目录新的文件,使用-a或者--all命令可以当前目录下的所有修改

应用场景

  • 开发到一半,不想提交,需要获取远程仓库代码,可能会发生冲突,可以用stash,隐藏改动代码
  • 开发到一半,需要修改别的分支的时候,可以用stash,把当前分支的内容保存起来,再切换到别的分支!

8. git merge 和 git rebase的区别

image.png

可以看到,在master上,执行merge操作,会在master上,创建一个新的提交记录(commit - merge记录)。他会污染(taint)feature分支的提交历史

image.png

在feature上执行rebase(变基),它会保留主分支的所有提交,把自己分支的内容做为新的提交来重写项目历史,这时feature分支和master分支都是最新的了!

总结一下 git mergegit rebase

  • 同 - 都是代码合并操作
  • 异 - 合并记录不同,git merge保留两个分支内容,但是历史纪录相对复杂git rebase会合并两个分支,历史纪录更加清晰

总结

  • git pushgit pull,上传和获取
  • git pullgit fetch,都是获取代码,流程不同git pull = git fetch + git merge
  • git 冲突,主要是获取两个有冲突的分支,然后修改,提交
  • git stash主要应用场景 - 1.需要获取远程仓库内容,2.需要修改其他分支内容
  • git mergegit rebase都是合并代码,合并方式不同,git merge多一个合并提交记录git rebase直接把当前分支所有记录都提交了,合并了两个分支

你不要失望 荡气回肠是为了,最美的平凡