git
分布式版本控制,最流行的版本控制工具。
安装 git
Linux上:
在linux 上我们建议你用二进制的方式来安装 git ,可以使用发行版包含的基础软件包管理工具来安装,如果你是是CentOS 或者 Fedora 的操作系统,可以使用 yum 命令来安装 git
$ sudo yum install git
如果你是ubuntu 或者是 Debian 可以使用 apt get 的命令来安装 git
$ sudo aptget install git
Windows上安装:
在Windows 上安装 Git 也有几种安装方法。 官方版本可以在 Git 官方网站下载。 打开
http://git scm.com/download/win,会检查你的操作系统是 32 位的还是 64 位的,并自动开始下载对应的安装包。
MAC上安装 git :
首先查看电脑是否已经安装git ,打开终端输入git 。方法一:通过homebrew 安装 git:首先homebrew::/usr/bin/rubye"$(curlfsSLhttps://raw.githubusercontent.com/Homebrew/install/master/install安装git: brew install git。方法二:通过xcode:直接从AppStore 安装 Xcode Xcode 集成了 Git ,不过默认没有安装,你需要运行 Xcode ,选择菜单 Xcode”Xcode”-->“Preference",在弹出窗口中找到“Downloads”Downloads”,选择 Command Line “Tools”,点 Install” 就可以完成安装了。
配置git
当安装完Git 应该做的第一件事就是设置你的用户名称与邮件地址。 这样做很重要,因为每一个 Git 的提交都会使用这些信息,并且它会写入到你的每一次提交中,不可更改:
$ git config --global user.name “用户名” //全局修改
$ git config --global user.email 邮箱
$ git config --local user.name “用户名” //当前目录修改
$ git config --loacal user.email 邮箱
如果使用了global 选项,那么该命令只需要运行一次,因为之后无论你在该系统上做任何事情,Git都会使用那些信息。 当你想针对特定项目使用不同的用户名称与邮件地址时,可以在那个项目目录下运行没有global 选项的命令来配置。很多 GUI 工具都会在第一次运行时帮助你配置这些信息。你也可以使用git config list 来查看 git 的所有配置。
获取帮助
$ git help <verb>
$ git <verb> help
$ man git-<verb>
当然,如果你遇到问题也可以查看git 的官方文档。https://gitscm.com/book/zh/v2
分布式:
创建仓库(初始化空的仓库)
$ git init --bare #初始化空仓库,里面并不会存储具体代码,只有一些版本信息
$ git init # 如果仓库有代码,会显示代码
远端仓库
git clone 用户名@ip:/path/to #远端仓库的拉去
这个过程需要输入用户密码,才可以进行拉取。如果不想输入密码,可以利用 ssh 公钥和私钥,把公钥拷贝到对方的机器当中。可以利用如下命令:
$ ssh-keygen -t rsa # -t rsa 加密算法
一直点Enter 可以得到如下所示,创建成功。
这时在C盘-->用户-->当前用户名-->.ssh文件可以找到:
我们将.pub为文件拷贝到需要控制的机器的当前路径下,这样就不需要输入密码了。ssh 非对称加密,本地的数据+私钥(id_rsa)一起发送,到达对方的机器利用公钥(id_rsa.pub)解密。
git的原理
git的四个区域
Workspace: 工作区,就是你平时存放项目代码的地方。
Index / Stage: 暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息。
Repository: 仓库区(或版本库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本。
Remote: 远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换。
注意:git 与 svn 的区别,svn 没有index。
工作流程
git的工作流程一般是这样的:
1、在工作目录中添加、修改文件;
2、将需要进行版本管理的文件add到暂存区域;
3、将暂存区域的文件commit到git仓库;
4、本地的修改push到远程仓库,如果失败则执行第5步
5、git pull将远程仓库的修改拉取到本地,如果有冲突需要修改冲突。回到第三步
因此,git管理的文件有三种状态:已修改(modified),已暂存(staged),已提交(committed)
文件的四种状态
Untracked: 未跟踪, 此文件在文件夹中,但并没有加入到git库,不参与版本控制,通过git add 状态变为Staged。
Unmodify: 文件已经入库且未修改, 即版本库中的文件快照内容与文件夹中完全一致,这种类型的文件有两种去处,如果它被修改,而变为Modified,如果使用gitrm移出版本库, 则成为Untracked文件。
Modified:文件已修改,仅仅是修改,并没有进行其他的操作,这个文件也有两个去处,通过git add可进入暂存staged状态,使用git checkout 则丢弃修改,返回到unmodify状态, 这个git checkout即从库中取出文件,覆盖当前修改
Staged:暂存状态,执行git commit则将修改同步到库中,这时库中的文件和本地文件又变为一致,文件为Unmodify状态。
常用的指令
正向操作:
$ vi hello.c # :x 表示不修改时间保存
$ git add hello.c #加入暂存区
$ git status #显示当前状态
$ git commit hello.c -m "first commit" #提交到本地仓库
$ git log #查看提交记录
$ git branch #显示当前分支
其中的含义:
1.当前文件经过sha1的哈希算法生成的哈希值,该哈希值代表本次的提交。
2.当前最新提交的指针。
3.当前的分支。
4.提交的注释。
$ git config --local -l
实际上这些信息就是在C盘-->用户-->当前用户名-->.gitconfig 文件中。
$ git push origin master #推送到远端仓库
逆向操作 :
$vi world.c
$git add world.c
$git restore -S . #从暂存区返回到当前工作区
$git status
$ git commit world.c -m "first commit world"
$git log
$ git reflog
$git reset head~1 # ~1表示回退一个版本,从本地仓库退回到工作区
$git log
提交到本地仓库后看到的提交记录:
执行git reflog 得到 显示不同阶段提交的哈希值的前七位以及head~版本号。
执行完$git reset head~1 与 $git log 得到当前只有一次提交记录:
注意reset的不同参数:
$git reset --mixed head~1 # 从本地仓库退回到工作区
$git reset --soft head~1 # 从本地仓库退回到暂存区
$git reset --hard head~1 #抹掉上一次commit。
整理操作:
$git commit --amend #整理最近的提交
$git rebase -i #整理以前的提交
命令git commit --amend演示,开始的提交记录为:
执行完命令以后可以将commit 2 改为commit 01。
当然也可以修改提交的文件内容:
$vi world.c
$git add world.c
$git commit --amend
将左图的信息改为右图后再进行提交,可以看到并没有新的提交记录。
始终记住的$git rebase -i 针对的是本地仓库(repository)整理操作!!
合并操作演示:
git rebase -i
git rebase -i 版本号(七位) 版本号
出现如下界面,选择将 commit 02 合并到 commit 01,然后会再次修改提交注释。
修改操作演示:
我们现在要修改commit hello 的这次提交文件hello.c里面的内容。
#依次执行如下操作:$git rebase - i #将 pick --> e
$ vi hello.c #修改内容
$git add hello.c #将修改的内容再次加入暂存区
$git commit --amend #必须再次amend
$git rebasse --continue
解决冲突
一般是远端仓库(remote)与工作区(workspace)发生冲突。
我们现在工作区repo-a和工作区repo-b分别都有一个world.c文件,我们将repo-a中的world.c修改够提交到远端仓库。我们再工作区repo-b也进行修改world.c文件,经过add ,commit 提交到本地仓库。git pull拉取远端仓库,这是就产生了冲突,我们就可以打开冲突文件。进行修改后再次推送到远端仓库。
当前打开的冲突文件:
创建及切换分支
$git branch develop #创建develop分支
$git checkout develop #切换到develop分支
$git checkout -b debug #切换到debug分支,如果没有该分支创建分支。
合并分支
# 将dubug分支合并到master分支
先将dubug分支推向远端仓库,再切换到master分支.
再执行:$ git merge dubug #将dubug分支合并到当前分支。
注意:项目开发过程中先编译通过再进行提交!