Git 基本原理与常用命令

xmnx 10年前

平时使用过两种版本控制软件 SVN 和 Git,平心而论,如果纯粹自己使用,那么绝对 Git 更加适合,本地库、远程库、离线工作、强大而灵活的分支、大名鼎鼎的Github, 这些都是选择 Git 的原因。记得刚接触时Git,感觉 Git 如此强大,再加上其是由大名鼎鼎的 Linus 所编写,所以花了很多的时间看各种资料,不过后来那些不常用的命令与功能还是仅仅停留在知道与了解的层面。Git 只是一种工具,是为了满足某种需求而被编写出来的一种工具,对于工具做到善加利用即可。当然,要做到善加利用,一定要深刻理解 Git 所倡导的理念,以及其内部的实现原理

Git 入门

这里推荐 @廖雪峰  所写的一个非常浅显易懂的Git教程 ,我当时就花了一个下午照着教程学操作一遍,然后就开始使用 Git 了。

Git 原理

Git 本质上是一套内容寻址文件系统。从内部来看,Git 是简单的 key-value 数据存储。它允许插入任意类型的内容,并会返回一个键值,通过该键值可以在任何时候再取出该内容。这些对象都压缩存储,并且以其自身的 SHA-1 哈希值作为唯一标示。它允许插入任意类型的内容,并会返回一个键值,通过该键值可以在任何时候再取出该内容。

Git主要包含 3 类对象:blog(存储文件数据)、tree(类似于目录)、commit。每次 Git 提交都会产生一个 commit 对象,并更新有改动的文件所关联的所有 tree 对象。多个 tree 对象一起记录了包含整个项目所有 blob 对象的信息, 并构成了(DAG)有向无环图 。所以在任何时间点任何情况下,通过 commit 对象关联的唯一根节点 tree,都可以遍历找出整个项目在这次 commit 状态下的全部文件。

Git 可以以两种主要的方式跨越两个仓库传输数据:基于HTTP协议之上,和 file://, ssh://, git:// 等智能传输协议

Git 插件

好的 IDE 基本都集成了 Git 插件,最性感的编辑器 sublime 也有第三方的 Git插件。这些插件基本对最常用的 Git 功能做好了菜单选项,所以通过对这些插件使用也能够了解到 Git 日常使用中最常用的命令与功能。


Git 使用注意

如果正在 IDE 中使用 Git插件,就不要在命令行 (shell) 中在进行操作,对于一个 Git库 同时有两个进程来操作可能会导致可能莫名其妙的问题。所以如果觉得软件的Git插件有的功能没找到或操作不方便,那么建议先关掉 IDE ,然后在用命令行窗口中去执行 Git 命令。


Git 常用命令

这个不需要刻意去记,但是要有大体的了解,用时可以查看 help 或者 Google.

git help <command>          # 显示指定命令的help    git config --global user.name "your name"    git config --global user.email "your email"        # 修改与提交    git status                   # 查看工作区状态    git add <file>               # 将指定文件修改提交到本地暂存区    git add .                    # 将所有修改过的文件提都交暂存区,不包括删除,"."即表示正则匹配所有字符    git add --all                # 将所有工作区修改提交到暂存区,包括 delete 掉的文件    git add -A                   # 同上    git commit -m"comments"      # 将暂存区的内容提交到本地库,并加上备注    git commit <file>            # 提交暂存区指定文件    git commit .                 # 提交暂存区所有文件    git commit -a                # 将git add, git rm和git commit等操作都合并在一起做,不包括新建文件    git commit -am "comments"    # 同上+添加备注        # 撤销与恢复    git checkout  -- <file>     # 抛弃工作区指定文件的修改    git checkoout .             # 抛弃工作区所有的修改    git reset <file>            # 将指定文件从暂存区恢复到工作区    git reset -- .              # 将所有文件从暂存区恢复到工作区    git reset --hard            # 恢复最近一次提交过的状态,工作区所有修改被放弃        # 查看提交    git show            # 显示某次提交的内容    git show $id    git log    git log <file>      # 查看该文件每次提交记录    git log -p <file>   # 查看每次详细修改内容的diff    git log -p -2       # 查看最近两次详细修改内容的diff    git log --stat      # 查看提交统计信息        # 差异对比    git diff <file>                     # 比较当前文件和暂存区文件差异    git diff <$id1> <$id2>              # 比较两次提交之间的差异    git diff <branch1>..<branch2>       # 在两个分支之间比较    git diff --staged                   # 比较暂存区和版本库差异    git diff --stat                     # 仅仅比较统计信息        # 关于版本    git tag                              #查看版本    git tag [name]                       #创建版本    git tag -d [name]                    #删除版本    git tag -r                           #查看远程版本    git push origin [name]               #创建远程版本(本地版本push到远程)        # 关于分支    git branch <new_branch>             # 创建新的分支    git checkout <branch>               # 切换到某个分支    git checkout -b <new_branch>        # 创建新的分支,并且切换过去    git branch -v                       # 查看各个分支最后提交信息    git branch -r                       # 查看远程分支    git branch --merged                 # 查看已经被合并到当前分支的分支    git branch --no-merged              # 查看尚未被合并到当前分支分支    git checkout $id                    # 把某历史提交checkout出来,无分支信息,切换到其他分支会自动删除    git checkout $id -b <new_branch>    # 把某历史提交checkout出来,创建成一个分支    git branch -d <branch>              # 删除某个分支    git branch -D <branch>              # 强制删除某个分支 (未被合并的分支被删除的时候需要强制)        # 关于远程仓库    git remote add origin <remote>       # 添加远程库    git remote -v                        # 查看远程服务器地址和仓库名称    git remote show origin               # 查看远程服务器仓库状态    git remote rm <repository>           # 删除远程仓库    git push -u origin master            # 客户端首次提交    git push -u origin develop           # 首次将本地develop分支提交到远程develop分支,并且track        # 跟踪远程库和本地库    git branch --set-upstream master origin/master    git branch --set-upstream develop origin/develop