3.8 解决冲突
git是以行记录变化的,如果两个分支同时改了同一行,git就拿不定主意了,需要程序员手动解决冲突。
主分支master上编辑文件 hello.txt
.
vim hello.txt
在第二行加了点东西。并提交。
切换到hot_fix
,在同一文件第二行加点东西,提交。
现在将主分支的修改merge
到hot_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把冲突的地方做了标记。我们决定最后的版本后,修改,并删除它的标记。就解决了冲突。
最后看看状态,根据提示进行收尾工作。注意下面的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 哈希算法
哈希算法是从明文到密文的加密算法。它具有以下特点。
- 同一个明文,经同一个算法转换得到的密文一样。
- 输入数据变化,输出的结果一定变化,并且通常变化很大,即使你的输入数据只是稍微变化。
- 不可以逆推。
- 同一哈希算法的输出密文长度一定
由于以上特性,哈希算法可以用于数据校验。git就是用哈希算法保证数据的完整性的。
3.10 版本控制原理
svn等集中式的版本控制工具通过增量方式进行版本变化的记录,当需要某一个版本时,就把该文件的初始文件以及所有增量拼合成一个文件。如下图。
git把数据看作是小型文件系统的一组快照,每次提交都会保存所有文件的快照,如果该文件较前一个版本没有变化,就用指针指向前一个版本。
git在提交时,每一个文件都会生成一个hash值,然后所有的文件生成一个树对象,树对象也会生成一个hash值,最后提交时提交的对象会生成一个commit id,指向树对象。
而不同的提交对象之间会形成一个链条。
你是不是有一个疑惑,保存文件的快照有什么好处?试想svn要新建一个分支,要怎么做?答案是需要复制所有的文件。而git则可以通过指针移动轻松的建立一个新的分支。
而且在切换分支时,也只需要移动head指针就可以了。速度杠杠的。
4.远程仓库操作
回顾下本地库与远程库的交互过程。
具体要怎么做呢?
4.1 创建一个远端库
(1)github官网注册账号。(进不去可以命令行输入ipconfig /flushdns
)。
(2)在本地新建一个本地库huashan
,执行git init
,新建文件huashanjianfa.txt
,提交。
(3)github上创建一个远程仓库gitsdemo
,点右上角的+
就可以创建,这里不赘述。创建成功就是下面这样。
注意到上面有一个https
的地址,这就是我们远程库的地址了。将这个地址在本地取个别名origin。(注意origin
与https
之间的空格删掉手打,否则后面可能报错 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