Git
简介:
Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
Git 是用于 Linux内核开发的版本控制工具。与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持(wingeddevil注:这得分是用什么样的服务端,使用http协议或者git协议等不太一样。并且在push和pull的时候和服务器端还是有交互的。),使源代码的发布和交流极其方便。 Git 的速度很快,这对于诸如 Linux kernel 这样的大项目来说自然很重要。 Git 最为出色的是它的合并跟踪(merge tracing)能力。
不懂git!使用教程:
最权威:https://git-scm.com/book/zh/v1/
最易懂:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/
实现:
结构图:

原理:
一般认为 git 由工作区、暂存区、版本库组成:
Git 本地数据管理,大概可以分为三个区,工作区,暂存区和版本库。
- 工作区(Working Directory)
是直接编辑的地方,肉眼可见,直接操作。
- 暂存区(Stage 或 Index)
数据暂时存放的区域。
- 版本库(commit History)
存放已经提交的数据,push 的时候,就是把这个区的数据 push 到远程git仓库了。
我们只不过将github 换成了一个某台服务器上的git罢了。当然,也就少了管理,分享,点赞等功能。
以下默认涉及服务器已安装 git 且可以正常使用(点击这里查看安装教程)。
按照一般版本控制,分为以下4个场景:
场景1:初次投产。包括初始化及文件同步
#远端库初始化
$ cd {remote git repository path}
$ git init
$ touch README.md
$ git add README.md
$ git commit -m "init remote git repository"
#修改配置文件 允许push命令
$ vi {remote git repository path}/.git/config
#追加以下内容
[receive]
denyCurrentBranch = ignore
#本地库初始化
$ cd {git repository path}/../
$ git clone ssh://username@hostname:{remote git reposiotry path}/.git
场景2:增量更新
#本地库
$ cp {something} {git repositorypath }
$ git checkout -b branch1
$ git add .
$ git commit -m "add something"
$ git checkout master
$ git git merge branch1
$ git push -u origin master -f
$ git branch -D branch1
#远端库同步
$ cd {remote git repository path}
$ git reset --hard
场景3:版本回退。
#本地库
$ cp {something} {git repositorypath }
$ git log
$ git reset --hard versionId
#若无需新增则直接提交
$使用场景2的步骤新增内容
$git push -f (若使用过push -u {remoteName} {branchName}则后续默认提交此分支)
#远端库
$ cd {remote git repository path}
$ git reset --hard
其他的场景均可组合实现。
遇到问题:
问题1:Updates were rejected because the tip of your current branch is behind
1.使用强制push的方法:
$ git push -u origin master -f
这样会使远程修改丢失,一般是不可取的,尤其是多人协作开发的时候。
2.push前先将远程repository修改pull下来
$ git pull origin master
$ git push -u origin master
3.若不想merge远程和本地修改,可以先创建新的分支:
$ git branch [name]
然后push
$ git push -u origin [name]
问题2:refusing to merge unrelated histories
出现这个问题的最主要原因还是在于本地仓库和远程仓库实际上是独立的两个仓库。假如我之前是直接clone的方式在本地建立起远程github仓库的克隆本地仓库就不会有这问题了。
$ git pull origin master –allow-unrelated-histories