学习链接
1. 什么是版本控制系统?
版本控制系统 (version control system - VCS) 是一种程序,用于记录对文件或数据集的任何更改,以便在必要时可以将其还原到以前的版本。这可以保证团队中的每个人都工作在最新版本中。
2. 集中式版本控制系统和分布式版本控制系统的区别
集中式版本控制系统
- 所有文件版本都存储在中央服务器上
- 开发者没有完整的本地系统文件备份
- 如果项目的中央服务器出现故障,就会丢失所有的项目数据。
分布式版本控制系统
- 开发者可以在本地备份所有的代码版本
- 提高了离线工作的能力,取消了本地单独备份的需求
- 即使服务器出故障了,也没影响
3. git push 和 git pull的作用
git push可以把本地仓库的内容,发送到远程仓库,在执行了push之后,就会把本地仓库的改变(保证与远程同步),并把这些改变的内容分享给远程工作的成员们
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 pull 和git fetch的区别
内容来源
图中可以看到,git pull,直接获取+合并,git fetch获取之后,还有检查的步骤(是否合并)
commitID
git pull,本地仓库和远程仓库的commitId一样(一起 修改了)git fetch,本地仓库和远程仓库的commitId不一样(需要合并)
相同
- 都是更新代码
不同
git pull是从远程仓库获取最新版本,然后再与本地合并,git pull=git fetch+git mergegit 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的区别
可以看到,在master上,执行merge操作,会在master上,创建一个新的提交记录(commit - merge记录)。他会污染(taint)feature分支的提交历史
在feature上,执行rebase(变基),它会保留主分支的所有提交,把自己分支的内容做为新的提交来重写项目历史,这时feature分支和master分支都是最新的了!
总结一下 git merge 和 git rebase
- 同 - 都是代码合并操作
- 异 - 合并记录不同,
git merge保留两个分支内容,但是历史纪录相对复杂,git rebase会合并两个分支,历史纪录更加清晰
总结
git push和git pull,上传和获取git pull和git fetch,都是获取代码,流程不同,git pull = git fetch + git merge- git 冲突,主要是获取两个有冲突的分支,然后修改,提交
git stash,主要应用场景 - 1.需要获取远程仓库内容,2.需要修改其他分支内容git merge和git rebase,都是合并代码,合并方式不同,git merge会多一个合并提交记录,git rebase直接把当前分支所有记录都提交了,合并了两个分支
你不要失望 荡气回肠是为了,最美的平凡