ubuntu安装命令:sudo apt-get install git
也可在官网进行下载后安装,网址为:http://git-scm.com/download/linux
方法1: 官方版本可以在 Git 官方网站下载。 打开http://git-scm.com/download/win,会检查你的操作系统是32位的还是64位的,并自动开始下载对应的安装包。
方法2:安装 GitHub for Windows,该安装程序包含图形化和命令行版本的 Git,能支持Powershell,提供了稳定的凭证缓存和健全的换行设置。网址为 http://windows.github.com。
安装完 Git 应该做的第一件事就是设置你的用户名称与邮件地址,因为每一个 Git 的提交都会使用这些信息,并且它会写入到你的每一次提交中,不可更改,命令如下:
git config --global user.name “xiaoming”
git config --global user.email [email protected]
值得注意,如果使用了 --global 选项,那么该命令只需要运行一次,因为之后无论你在该系统上做任何事情,Git 都会使用那些信息。 当你想针对特定项目使用不同的用户名称与邮件地址时,可以在那个项目目录下运行没有 --global 选项的命令来配置。
很多 GUI 工具都会在第一次运行时帮助你配置这些信息。
可以使用git config --list来查看git的所有配置。
使用 Git 时需要获取帮助,有三种方法可以找到 Git 命令的使用手册:
git help
git --help
man git-
例如,要想获得 config 命令的手册,执行
git help config
当然,如果你遇到问题也可以查看git的官方文档。
https://git-scm.com/book/zh/v2
什么是仓库呢?就是可以用git管理的一个目录,这个仓库里所有的文件的改动(增加/修改/删除)都由git跟踪记录。也能通过git查看所有的记录,当然也能够通过git“还原”到某个记录点。
如何创建一个仓库呢?
step1:mkdir test(创建一个目录)
step2:cd test(进入这个目录)
step3:git init(初始化一个空的仓库)
上面三个步骤就可以创建一个空的仓库了,这个时候会在仓库目录下多了一个.git目录,.git目录里由很多关于git管理的文件,这里面的东西不用我们管,没事也别去瞎折腾。
有了仓库之后,我们就可以使用git add和git commit向仓库添加要跟踪的文件,和提交修改的内容了。
在仓库里刚新建的文件是不会被跟踪起来的,比如我们使用git status就能查看到文件的状态,需要使用git add才可以;
git add使用:git add
通过git add 的方式把path目录下的所有文件添加到git的暂存区,当然这些文件不包含已经被删除的文件。
示例:
git add . # 将所有修改添加到暂存区
git add *.cpp # 将以.cpp结尾的文件的所有修改添加到暂存区
git add hello* # 将所有以Hello开头的文件的修改添加到暂存区,例如: helloWorld.txt,hello.h,helloGit.md ...
git add hello?.* # 将以hello开头后面只有一位的文件提交到暂存区 例如:hello1.txt,helloA.cpp 如果是helloGit.txt和hello.cxx是不会被添加的。
git add 是把文件添加到暂存区,那如果想从暂存区删除呢?可以使用git rm -f 或者 git rm –cached 把文件从暂存区里移除,这个移除并不代码把文件从磁盘上删除了,只是说不被git管理了而已。
git commit使用:
git add 只是把文件添加到暂存区而已,并没有真正跟踪起来,需要使用git commit命令提交到仓库才能真正被git跟踪记录,可通过git commit --help查看commit命令的使用,下面举例说明:
git commit -a -m “initial commit” #把暂存区和当前已被跟踪的文件的所有的修改提交到仓库里,-m参数指定了此次提交的message内容
git commit Makefile Logger.cpp –m “修改编译错误,添加了对log4cpp库的依赖“ # 提交Makefile和Logger.cpp的修改
1 创建git账号和git用户组
$ sudo adduser git #添加git用户
$ sudo passwd git #添加git的密码
$ sudo groupadd git #添加git用户组
$ sudo usermod -G git git #添加git用户到git用户组
2 创建git仓库
$ cd /srv # srv目录下存放git的仓库
$ mkdir nginx-docs.git # 创建nginx-docs.git目录
$ cd nginx-docs.git
$ git init --bare # bare选项指示该仓库为裸仓库
$ sudo chown -R git:git /srv/nginx-docs.git # 修改权限为git用户
3 禁止git用户登录shell,这样git通过sh服务登录会被拒绝
chsh git
4 克隆远程仓库
clone命令为:
git clone git@<您的 CVM IP 地址>:git仓库路径
比如:git clone [email protected]:/srv/nginx-docs.git
在这个过程中需要输入用户名和密码,我们可以通过rsa认证的方式省略掉密码的输入;
5 免密输入配置
就是通过rsa认证,生成公钥和私钥,然后把客户端的公钥告诉git服务器,具体步骤如下:
在客户端机器上,比如我在windows机器上已经配置用户名和密码,见上一章的git配置说明,然后打开git bash shell,生成rsa的秘钥对,ssh-keygen –t rsa命令后一路按回车,此时会在c:/Users/lizhiyong/.ssh/目录下生成id_rsa.pub和id_rsa文件,id_rsa.pub是公钥文件,id_rsa是私钥文件;
在git服务器上:
$ su git
$ ssh-keygen –t rsa
$ touch authorized_keys
然后把客户端的id_rsa.pub追加到这个文件里。这样后,我们就不需要每次都输入git密码了。
1 git原理-git的四个区域
Workspace: 工作区,就是你平时存放项目代码的地方
Index / Stage: 暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
Repository: 仓库区(或版本库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本
Remote: 远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换
2 git原理-工作流程
git的工作流程一般是这样的:
a.在工作目录中添加、修改文件;
b.将需要进行版本管理的文件add到暂存区域;
c.将暂存区域的文件commit到git仓库;
d.本地的修改push到远程仓库,如果失败则执行第5步
e.git pull将远程仓库的修改拉取到本地,如果有冲突需要修改冲突。回到第三步
因此,git管理的文件有三种状态:已修改(modified),已暂存(staged),已提交(committed)
3.git原理-文件的四种状态
Untracked: 未跟踪, 此文件在文件夹中,但并没有加入到git库,不参与版本控制, 通过git add 状态变为Staged。
Unmodify: 文件已经入库且未修改, 即版本库中的文件快照内容与文件夹中完全一致,这种类型的文件有两种去处,如果它被修改, 而变为Modified,如果使用git rm移出版本库, 则成为Untracked文件。
Modified:文件已修改,仅仅是修改,并没有进行其他的操作,这个文件也有两个去处,通过git add可进入暂存staged状态,使用git checkout 则丢弃修改,返回到unmodify状态, 这个git checkout即从库中取出文件,覆盖当前修改
Staged:暂存状态,执行git commit则将修改同步到库中,这时库中的文件和本地文件又变为一致,文件为Unmodify状态。
4.推送到远程分支
git push命令用于将本地分支的更新推送到远程主机。它的格式与git pull命令相仿。
git push <远程主机名> <本地分支名>:<远程分支名>
注意,分支推送顺序的写法是<来源地>:<目的地>,所以git pull是<远程分支>:<本地分支>,而git push是<本地分支>:<远程分支>。例如:
git push origin master:refs/for/master
a.如果省略远程分支名,则表示将本地分支推送与之存在”追踪关系”的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。
git push origin master
上面命令表示,将本地的master分支推送到origin主机的master分支。如果后者不存在,则会被新建。
b.如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支。
git push origin :master # 等同于 git push origin --delete master
上面命令表示删除origin主机的master分支。
c.如果当前分支与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略。
git push origin
上面命令表示,将当前分支推送到origin主机的对应分支。
d.如果当前分支只有一个追踪分支,那么主机名都可以省略。
git push
5.git push和冲突解决
git push的时候如果有冲突时我们必须去修复这个冲突;
首先我们调用git pull去拉取分支下来,然后会在冲突的文件里记录冲突的内容,手动去解决冲突,然后
再git commit 和 git push
在使用git的时候,我们可能针对同一个任务由多次提交,比如我们针对同一个feature可能由多个同事修改了不同部分,但是多个提交让我们的版本管理显得比较凌乱,此时我们可以合并多个commit为一个。
首先假设我们有三个commit,如左下所示:我们想把最近的三个commit合并为一个commit,那么此时我们可以使用git rebase命令了,即git rebase –i 4cbeb4248f7, -i后面的参数表示不要合并的commit的hash值。输入命令出现右下图:
可以看到其中分为两个部分,上方未注释的部分是填写要执行的指令,而下方注释的部分则是指令的提示说明。指令部分中由前方的
命令名称、commit hash 和 commit message 组成。
pick 和 squash的意思如下。我们将 ad777ea和a271901这两个commit前方的命令改成 squash 或 s,然后输入:wq以保存并退出
pick 的意思是要会执行这个 commit
squash 的意思是这个 commit 会被合并到前一个commit
退出后会弹出如下界面,即需要我们重新编辑合并后的commit信息,未注释掉的是会包含在commit message里的,按”wqa”保存后即完成了此次commit的合并。
a.需改自己的提交
有时候,我们提交一个commit后,发现有些部分漏掉了,尤其是有的内容忘记添加到暂存区了,导致这些内容没有commit,那如果我们把这些“漏掉”内容作为一个新的commit提交总不太好,其实我们可以把“漏掉”的内容提交到上一个commit里。
还有时候,我们刚刚最近的一次提交的commit message写的内容不够严谨,需要重新整理下。
那上面的两种场景,我们怎么处理呢? 答案是git commit –amend
比如最近的一次提交的内容少提交了一个README.md文件了,而且“Merge branch ‘master’ of 47.106.79.26:/srv/nginx-docs”的内容也不够严谨,需要规范化提交内容。
此时我们可以先调用git add README.md文件到暂存区,然后调用git commit –-amend把当前暂存区里的内容合并到上一次commit里,而且还可以修改上一次提交的message信息。
$ git commit --amend # 跳出一个VIM编辑框,此时我们可以修改提交内容格式Git会新增加一个commit-id覆盖了上一次的commit-id, 这样漏掉的文件会合并到上一次的提交,然后我们也修改了提交message的规范,大家可以通过git log –p去查看这次内容。当然我们除了添加“漏掉”的文件,也可以删除“误修改”的文件。最后使用git push –fore强制推送修改后的commit。
b.修改任意提交
如果我们想要修改比较久远的commit message的格式不太符合规范,怎么去修改呢?比如我想修改从bed58d54e之后所有的commit message的内容?
$ git rebase –i bed58d54e # 打算从bed58d54e(不包含bed58d54e)之后所有的commit 的message
输入上面一条命令后,会弹出下文这个窗口,上半部分是一些pick命令,下半部分是一些提示内容,不过有意思的是此时的commit内容的排列和git log里的排列是反的,也就是倒序的。如果我们仅仅修改commit message,需要把打算修改的commit的对应pick命令修改为reword,然后保存。
之后会弹出编辑commit message的内容,如果我们有多处commit需要被修改的话会多次弹出vim编辑窗口。
如果在修改前所有的commit都已经push到远程仓库的话,我们需要使用git push --force强制推送到远程仓库。
上文仅仅说明了修改历史提交的message,但是如果在某个历史提交中少提交内容,比如上文某个源码文件里的内容修改不完整,提交很多天经过严格测试才发现,那么我们就可以使用git rebase的edit命令修改提交内容了。
$ git rebase –i bdc6778948a
上面的命令后我们可以使用edit命令替换pick命令。保存后,此时git rebase会停止工作,以便我们可以编辑文件和commit message,修改并提交后,可以继续其它的edit命令。在这个过程中我们会使用到以下这两条命令
$ git commit –-amend
$ git rebse --continue
如果在修改前所有的commit都已经push到远程仓库的话,我们需要使用git push --force强制推送到远程仓库。
1.普通查看
a.$ git log # 不带任何参数
b.$ git log --onelie # 每条日志显示一行
c.$ git log –[length] # 只显示前面的length条日志
d.$ git log --skip=[skip] -3 # 跳过前面的skip条日志
e.$ git log -p # 显示一些统计信息以及文件的改动内容和行信息
f.$ git log --stat # 显示提交的作者 日期 message 和文件内容统计信息
g.$ git shortlog # 显示每个author提交commit和多少条commit
2.过滤
a.按日期
$ git log --after=“2018-7-1” # 2018年7月1好之后的所有日志
$ git log –-before=“2014-7-1”
b.按作者
$ git log --author=“Dounin”
c.按照提交信息
$ git log --grep=“issue” # 按照提交本中是否包含issue的日志
d.按文件
$ git log – ./src/http/modules/ngx_http_xslt_filter_module.c
e.按照内容
$ git log -S “ngx_free” # 即所有文件中包含了 ngx_free字符串的修改
f.按照范围
$ git log … # 比如 git log master…feature这可以显示出自从master分支fork之后,feature分支上所有的提交
3.commit id
$ git show commit-id # 显示commit-id的提交内容,包括所有文件的修改信息