Git 在保存和对待各种信息的时候与其它版本控制系统有很大差异,尽管操作起来的命令形式非常相近。Git有以下特点:
Git 和其它版本控制系统(包括 Subversion 和近似工具)的主要差别在于 Git 对待数据的方法。 概念上来区分,其它大部分系统以文件变更列表的方式存储信息。 这类系统(CVS、Subversion、Perforce、Bazaar 等等)将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异。
Git 不按照以上方式对待或保存数据。 反之,Git 更像是把数据看作是对小型文件系统的一组快照。 每次你提交更新,或在 Git 中保存项目状态时,它主要对当时的全部文件制作一个快照并保存这个快照的索引。 为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。 Git 对待数据更像是一个快照流。
这是 Git 与几乎所有其它版本控制系统的重要区别。 因此 Git 重新考虑了以前每一代版本控制系统延续下来的诸多方面。 Git 更像是一个小型的文件系统,提供了许多以此为基础构建的超强工具,而不只是一个简单的 VCS。
在 Git 中的绝大多数操作都只需要访问本地文件和资源,一般不需要来自网络上其它计算机的信息。 如果你习惯于所有操作都有网络延时开销的集中式版本控制系统,Git 在这方面会让你感到速度之神赐给了 Git 超凡的能量。 因为你在本地磁盘上就有项目的完整历史,所以大部分操作看起来瞬间完成。
Git 中所有数据在存储前都计算校验和,然后以校验和来引用。 这意味着不可能在 Git 不知情时更改任何文件内容或目录内容。 这个功能建构在 Git 底层,是构成 Git 哲学不可或缺的部分。 若你在传送过程中丢失信息或损坏文件,Git 就能发现。
你执行的 Git 操作,几乎只往 Git 数据库中增加数据。 很难让 Git 执行任何不可逆操作,或者让它以任何方式清除数据。 同别的 VCS 一样,未提交更新时有可能丢失或弄乱修改的内容;但是一旦你提交快照到 Git 中,就难以再丢失数据,特别是如果你定期的推送数据库到其它仓库的话。
五、三种状态
Git 有三种状态,你的文件可能处于其中之一:已提交(committed)、已修改(modified)和已暂存(staged)。 已提交表示数据已经安全的保存在本地数据库中。 已修改表示修改了文件,但还没保存到数据库中。 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
简单内容冲突处理
当两条分支对同一个文件的同一个文本块进行了不同的修改,并试图合并时,Git不能自动合并的,称之为冲突(conflict)。解决冲突需要人工处理。
比如当前在master分支,想把dev分支merge过来,结果产生了一个冲突,打开文件内容可以看到这么一个冲突:
<<<<<<< HEAD
test in master
=======
test in dev
>>>>>>> dev
<<<<<<<标记冲突开始,后面跟的是当前分支中的内容。
HEAD指向当前分支末梢的提交。
=======之后,>>>>>>>之前是要merge过来的另一条分支上的代码。
>>>>>>>之后的dev是该分支的名字。
对于简单的合并,手工编辑,然后去掉这些标记,最后像往常的提交一样先add再commit即可。
Git常用指令
git add README添加文件
git add [file name] 添加一个文件到git index
git branch 查看本地所有分支
git branch -a 查看所有的分支
git branch -r 查看远程所有分支
git branch 删除远程branch
git branch -D master develop 删除本地库develop
git branch branch_0.1 master 从主分支master创建branch_0.1分支
git branch -m branch_0.1 branch_1.0 将branch_0.1重命名为branch_1.0
git commit -a 提交当前repos的所有的改变
git commit -v 当你用-v参数的时候可以看commit的差异
git commit -m "This is the message describing the commit" 添加commit信息
git commit -a -a是代表add,把所有的change加到git index里然后再commit
git commit -a -v 一般提交命令
git commit 提交
git clone git://github.com/schacon/grit.git 从服务器上将代码给拉下来
git checkout --track origin/dev 切换到远程dev分支
git checkout dev 切换到本地dev分支
git checkout -b dev 建立一个新的本地分支dev
git commit -m "init" 提交并且加注释
git commit -m "remove" 移除文件(从Git中删除)
git commit -a -m "log_message" (-a是提交所有改动,-m是加入log信息) 本地修改同步至服务器端 :
git checkout branch_1.0/master 切换到branch_1.0/master分支
git config --list 看所有用户
git diff 查看尚未暂存的更新
git diff --cached 或 $ git diff --staged 查看尚未提交的更新
git fetch 相当于是从远程获取最新版本到本地,不会自动merge
git init本地初始化
git ls-files 看已经被提交的
git log 看你commit的日志
git merge origin/dev 将分支dev与当前分支进行合并
git pull 本地与服务器端同步
git push origin master将文件给推到服务器上
git push (远程仓库名) (分支名) 将本地分支推送到服务器上去。
git push origin master:hb-dev将本地库与服务器上的库进行关联
git remote show origin 显示远程库origin里的资源
git remote show 查看远程库
git rm 文件名(包括路径) 从git中删除指定文件
git rm [file name] 删除一个文件
git rm a.a 移除文件(从暂存区和工作区中删除)
git rm --cached a.a 移除文件(只从暂存区中删除)
git rm -f a.a 强行移除修改后文件(从暂存区和工作区中删除)
git remote add origin git@github.com:daixu/WebApp.git增加一个远程服务器端
git stash push 将文件给push到一个临时空间中
git stash pop 将文件从临时空间pop下来