Git 属于分布式版本控制系统,而 SVN 属于集中式。
中心服务器用来交换每个用户的修改,没有中心服务器也能工作,但是中心服务器能够 24 小时保持开机状态,这样就能更方便的交换修改。
Github 就是一个中心服务器。
新建一个仓库之后,当前目录就成为了工作区,工作区下有一个隐藏目录 .git,它属于 Git 的版本库。
Git 的版本库有一个称为 Stage 的暂存区以及最后的 History 版本库,History 存储所有分支信息,使用一个 HEAD 指针指向当前分支。
git add files
把文件的修改添加到暂存区git commit
把暂存区的修改提交到当前分支,提交之后暂存区就被清空了git reset -- files
使用当前分支上的修改覆盖暂存区,用来撤销最后一次 git add filesgit checkout -- files
使用暂存区的修改覆盖工作目录,用来撤销本地修改可以跳过暂存区域直接从分支中取出修改,或者直接提交修改到分支中。
使用指针将每个提交连接成一条时间线,HEAD 指针指向当前分支指针。
新建分支是新建一个指针指向时间线的最后一个节点,并让 HEAD 指针指向新分支,表示新分支成为当前分支。
每次提交只会让当前分支指针向前移动,而其它分支指针不会移动。
合并分支也只需要改变指针即可。
“快进式合并”(fast-farward merge),会直接将 master 分支指向合并的分支,这种模式下进行分支合并会丢失分支信息,也就不能在分支历史上看出分支信息。
可以在合并时加上 --no-ff 参数来禁用 Fast forward 模式,并且加上 -m 参数让合并时产生一个新的 commit。
$ git merge --no-ff -m "merge with no-ff" dev
master 分支应该是非常稳定的,只用来发布新版本;
日常开发在开发分支 dev 上进行。
在一个分支上操作之后,如果还没有将修改提交到分支上,此时进行切换分支,那么另一个分支上也能看到新的修改。这是因为所有分支都共用一个工作区的缘故。
可以使用 git stash 将当前分支的修改储藏起来,此时当前工作区的所有修改都会被存到栈中,也就是说当前工作区是干净的,没有任何未提交的修改。此时就可以安全的切换到其它分支上了。
$ git stash
Saved working directory and index state \ "WIP on master: 049d078 added the index file"
HEAD is now at 049d078 added the index file (To restore them type "git stash apply")
**该功能可以用于 bug 分支的实现。如果当前正在 dev 分支上进行开发,但是此时 master 上有个 bug 需要修复,但是 dev 分支上的开发还未完成,不想立即提交。**在新建 bug 分支并切换到 bug 分支之前就需要使用 git stash 将 dev 分支的未提交修改储藏起来。
Git 仓库和 Github 中心仓库之间的传输是通过 SSH 加密。
如果工作区下没有 .ssh 目录,或者该目录下没有 id_rsa 和 id_rsa.pub 这两个文件,可以通过以下命令来创建 SSH Key:
$ ssh-keygen -t rsa -C "[email protected]"
然后把公钥 id_rsa.pub 的内容复制到 Github “Account settings” 的 SSH Keys 中。
.gitignore 文件
忽略以下文件:
不需要全部自己编写,可以到 https://github.com/github/gitignore 中进行查询。