3.8 解决冲突

git是以行记录变化的,如果两个分支同时改了同一行,git就拿不定主意了,需要程序员手动解决冲突。

主分支master上编辑文件 hello.txt.

 vim hello.txt

在第二行加了点东西。并提交。

image-20211022202138541
alt

切换到hot_fix,在同一文件第二行加点东西,提交。

image-20211022202701087
alt

现在将主分支的修改mergehot_fix.

24724@LAPTOP-OCSC7S98 MINGW64 /e/gitworkspace/gitviedo/wechat (hot_fix)
$ git branch -v
* hot_fix af35b02 conflict test on hot_fix
  master  112e833 confict test master

24724@LAPTOP-OCSC7S98 MINGW64 /e/gitworkspace/gitviedo/wechat (hot_fix)
$ git merge 112e833
Auto-merging hello.txt
CONFLICT (content): Merge conflict in hello.txt
Automatic merge failed; fix conflicts and then commit the result.

冲突产生了,我们修复下。

vim hello.txt

发现了没有,git把冲突的地方做了标记。我们决定最后的版本后,修改,并删除它的标记。就解决了冲突。

image-20211022203145428
alt

最后看看状态,根据提示进行收尾工作。注意下面的commit不要加文件名。

24724@LAPTOP-OCSC7S98 MINGW64 /e/gitworkspace/gitviedo/wechat (hot_fix|MERGING)
$ git status
On branch hot_fix
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add <file>..." to mark resolution)

        both modified:   hello.txt

no changes added to commit (use "git add" and/or "git commit -a")

24724@LAPTOP-OCSC7S98 MINGW64 /e/gitworkspace/gitviedo/wechat (hot_fix|MERGING)
$ git add .

24724@LAPTOP-OCSC7S98 MINGW64 /e/gitworkspace/gitviedo/wechat (hot_fix|MERGING)
$ git status
On branch hot_fix
All conflicts fixed but you are still merging.
  (use "git commit" to conclude merge)

Changes to be committed:

        modified:   hello.txt


24724@LAPTOP-OCSC7S98 MINGW64 /e/gitworkspace/gitviedo/wechat (hot_fix|MERGING)
$ git commit
[hot_fix b9b5928] Merge commit '112e833' into hot_fix
3.9 哈希算法

image-20211022204301097
alt

哈希算法是从明文到密文的加密算法。它具有以下特点。

  • 同一个明文,经同一个算法转换得到的密文一样。
  • 输入数据变化,输出的结果一定变化,并且通常变化很大,即使你的输入数据只是稍微变化。
  • 不可以逆推。
  • 同一哈希算法的输出密文长度一定

由于以上特性,哈希算法可以用于数据校验。git就是用哈希算法保证数据的完整性的。

3.10 版本控制原理

svn等集中式的版本控制工具通过增量方式进行版本变化的记录,当需要某一个版本时,就把该文件的初始文件以及所有增量拼合成一个文件。如下图。

image-20211022205901228
alt

git把数据看作是小型文件系统的一组快照,每次提交都会保存所有文件的快照,如果该文件较前一个版本没有变化,就用指针指向前一个版本。

image-20211022210226605
alt

git在提交时,每一个文件都会生成一个hash值,然后所有的文件生成一个树对象,树对象也会生成一个hash值,最后提交时提交的对象会生成一个commit id,指向树对象。

image-20211022210731306
alt

而不同的提交对象之间会形成一个链条。

image-20211022210907140
alt

你是不是有一个疑惑,保存文件的快照有什么好处?试想svn要新建一个分支,要怎么做?答案是需要复制所有的文件。而git则可以通过指针移动轻松的建立一个新的分支。

image-20211022211159097
alt

而且在切换分支时,也只需要移动head指针就可以了。速度杠杠的。

image-20211022211527266
alt

4.远程仓库操作

回顾下本地库与远程库的交互过程。

image-20211020204259268
alt

具体要怎么做呢?

4.1 创建一个远端库

(1)github官网注册账号。(进不去可以命令行输入ipconfig /flushdns)。

(2)在本地新建一个本地库huashan,执行git init,新建文件huashanjianfa.txt,提交。

(3)github上创建一个远程仓库gitsdemo,点右上角的+就可以创建,这里不赘述。创建成功就是下面这样。

image-20211022215451221
alt

注意到上面有一个https的地址,这就是我们远程库的地址了。将这个地址在本地取个别名origin。(注意originhttps之间的空格删掉手打,否则后面可能报错 I don't handle protocol 'https')

$ git remote add origin https://github.com/banjiubanjiu/gitsdemo.git

查看下配置的结果。

$ git remote -v
origin  https://github.com/banjiubanjiu/gitsdemo.git (fetch)
origin  https://github.com/banjiubanjiu/gitsdemo.git (push)

做一提交吧。

git push origin maste

 git push origin master