Git版本控制与github使用

Git是一个开源的分布式版本控制系统,用于敏捷高效地管理项目。相较svn,git最大的特点就是分布式,每个人都拥有一个克隆的版本库,所以提交代码、查看日志、创建分支、合并分支、回退等等操作都直接在本地完成而不需要网络。当然,本地版本库需要和远程共享版本库同步,这就需要网络了。

github,作为一家git服务提供商,可以托管你的git版本库,而且对于开源项目是可以免费托管,这对于开源项目是一大利好。

github使用

注册github账号

首先你要有一个github账号,注册地址 https://github.com/join,记住你的用户名和邮箱,这里例如mycwq和 [email protected] (邮箱必须是有效的,需要验证)

创建git版本库

登录github账号,点击右上角的+号创建版本库(Create a new repository)。版本库也叫数据仓库

可以保持以上选项不修改,点绿色按钮完成创建。成功后取到git库地址 https://github.com/mycwq/test.git

克隆版本库到本地

就是获取git共享库的所有内容,要确保系统安装了git命令工具,没有的话参考这篇文章
$ git clone https://github.com/mycwq/test.git

提交到共享版本库
git下这个操作有2个步骤,第一步提交代码到本地版本库,第二步是同步本地版本库到远程的共享版本库

如果是第一次使用,需要设置账号和邮箱
$ git config --global user.name "mycwq"
$ git config --global user.email "[email protected]"

下面以例子说明如何提交内容到版本库:
$ echo "# test" > README.md
$ git add README.md
$ git commit -m "first commit"
$ git push origin master

然后,按提示输入账号和密码。成功后,可以在github看到刚刚提交的内容。



git版本库与命令关系图

在阮一峰博客上找到这个图片,很有参考价值。文章在这里,不妨去看看吧

以上,fetch、clone、push、pull都是远程操作,其他都是本地完成的。


git常用命令

命令
说明
git diff
显示版本库所有文件的改动内容,但不包括版本外的文件
git status
树状显示版本库的大体情况,如哪些文件有改动,哪些还没加到版本库
git log
查看提交日志
git clone <库地址>
克隆远程版本库到本地
git fetch
同步共享版本库的更新内容到本地版本库
git add索引记录要提交的文件,在git commit时提交
git commit提交改动到本地版本库
git push
同步本地版本库到共享版本库
git remote
列出所有远程主机
git branch <分支名>
新建分支
git checkout <分支名>
切换到分支(设置某个分支为工作目录)
git checkout -b <分支名>
检出分支,等效于 git branch <分支名> && git checkout <分支名>
git merge <分支名>
合并某个分支到工作目录
git pull
同步共享版本库到本地版本库,并且合并到当前工作目录。等同于 git fetch 加上 git merge <分支名> 
git blame <filename>
获取文件每一行的详细修改信息,包括作者、日期和日志编号

git分支管理

分支的常用命令

建立分支
$ git branch branch1
列出所有分支
$ git branch
  branch1
* master
以上,*表示当前在使用的分支,即工作目录所在的分支。
如果是远程仓库github的分支情况:
$ git branch -r
  origin/branch1
  origin/master
切换分支
$ git checkout branch1
Switched to branch 'branch1'
相当于把branch1作为当前分支,可以 git branch 看下变化
删除分支
$ git branch -d branch1
以上命令,git会检查该分支是否已合并到上游分支,如果没有,则不能删除分支。
但如果真的要删除该分支,使用 -D 参数强行删除:
$ git branch -D branch1
如果想删除github上的分支 branch1,
$ git push origin --delete branch1
或者是
$ git push origin :branch1
重命名分支
$ git branch -m branch1 branch2
合并分支
git有三种合并分支方式,straight merge, squashed commits 和 cherry-picking
区别如下:
1、直接合并(straight merge)
   将某分支所有的历史记录全部合并到当前分支,原来分支有多少个commit,当前分支就增加多少条日志
 命令如下:
    $ git merge branch1
2、拼凑合并(squashed commits)
 将某分支上的所有的历史记录合成一条日志提交,这样的话,当前分支无法看到该分支每次的提交记录。
 命令如下:
    $ git merge --squash branch1
    $ git commit -m 'branch1 merge'
3、挑选合并(cherry-picking)
    将分支的某些提交日志合并到当前分支
  命令如下:
     $ git cherry-pick 7654321
   以上,7654321是提交日志的hash值,可以从git log 查到,本来是40位,但git通常需要前面7位就可以识别了。
   如果需要合并多条日志,但不想git每次都立刻合并,可以改下这个命令:
     $ git cherry-pick -n 7654321
提交到远程分支
提交到远程仓库github的分支 branch1,分支不存在会自动创建
$ git push origin branch1
导出分支
类似svn export,例如导出master分支:
git archive master -o ../master.zip

分支的使用

这里以最简单实用的主次分支模型,也就是两条分支,一条记master,另一条记develop,项目在develop下开发,再不定期合并到master分支。

首先,我们需要定位好 master 和 develop 的关系:
master :主分支,就是生产环境的版本
develop : 次分支,就是开发环境的版本

git创建时有master分支,我们需要再创建一个分支。使用下面这个命令,从master分支位置创建 develop 分支,并将当前分支切换到 develop 分支
 $ git checkout -b develop master
这样,我们可以在 develop 分支下开发了。直到项目需要交付给用户时,再将 develop分支 合到 master分支
 $ git checkout master
 $ git merge develop

当 develop分支合到 master 分支后,如果要继续开发,再把 develop 分支切换成当前分支
 $ git checkout develop
这样,又回到了开发分支,接着发布、开发,发布、开发,如此周而复始。

当然,分支在实际使用中可能不只这么简单,可能还要创建临时的 bugfix 分支,但方法都是差不多的。
1、创建一个bugfix 的临时分支:
 $ git checkout -b bugfix-0.1 master
2、修正bug后,再合并到master分支和develop分支
 $ git checkout master
 $ git merge --no-ff bugfix-0.1
 $ git checkout develop
 $ git merge --no-ff bugfix-0.1
3、再然后,删掉这个临时分支
 $ git branch -d bugfix-0.1

细心的同学会观察到我们这里使用了 --no-ff 参数,这是因为,Git 默认使用快进式合并(fast-farward merge),只是将 master 分支指针指向 bugfix-0.1分支,而 --no-ff 则会创建一条合并日志,保证bugfix-0.1分支删除时不丢失历史日志。


git相关

git config之 push.default

warning: push.default is unset; its implicit value has changed in
Git 2.0 from 'matching' to 'simple'. To squelch this message
and maintain the traditional behavior, use:

  git config --global push.default matching

To squelch this message and adopt the new behavior now, use:

  git config --global push.default simple

When push.default is set to 'matching', git will push local branches
to the remote branches that already exist with the same name.

Since Git 2.0, Git defaults to the more conservative 'simple'
behavior, which only pushes the current branch to the corresponding
remote branch that 'git pull' uses to update the current branch.

大致意思是,Git2.0 将 push.default 的默认值 matching 改成了 simple
matching
如果 git push 没有指定分支,git 会推送所有远程分支对应的本地分支
simple
如果 git push 没有指定分支,git 只推送当前分支


参考资料:
[3] A successful Git branching model  Vincent Driessen
[4] Git分支管理策略 阮一峰

参考:http://blog.csdn.net/mycwq/article/details/49443775
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章