Git
Git
Linux上安装git
在linux上我们建议你用二进制的方式来安装git,可以使用发行版包含的基础软件包管理工具来安装,如果你是是CentOS或者Fedora的操作系统,可以使用yum命令来安装git:
sudo yum install git
如果你是ubuntu或者是Debian可以使用apt-get的命令来安装git:
sudo apt-get install git
要了解更多选择, Git 官方网站上有在各种 Unix 风格的系统上安装步骤,网址为 http://git-scm.com/download/linux
Windows上安装
在 Windows 上安装 Git 也有几种安装方法。 官方版本可以在 Git 官方网站下载。 打开http://git-scm.com/download/win,会检查你的操作系统是32位的还是64位的,并自动开始下载对应的安装包。
另一个简单的方法是安装 GitHub for Windows。 该安装程序包含图形化和命令行版本的 Git。 它也能支持Powershell,提供了稳定的凭证缓存和健全的换行设置。 你可以在 GitHub for Windows 网站下载,网址为 http://windows.github.com。
Git配置
当安装完 Git 应该做的第一件事就是设置你的用户名称与邮件地址。 这样做很重要,因为每一个 Git 的提交都会使用这些信息,并且它会写入到你的每一次提交中,不可更改:
git config --global user.name “123”
git config --global user.email 123@qq.com
再次强调,如果使用了 --global 选项,那么该命令只需要运行一次,因为之后无论你在该系统上做任何事情,Git 都会使用那些信息。 当你想针对特定项目使用不同的用户名称与邮件地址时,可以在那个项目目录下运行没有 --global 选项的命令来配置。
很多 GUI 工具都会在第一次运行时帮助你配置这些信息。
你也可以使用git config --list
来查看git的所有配置
获取帮助
若你使用 Git 时需要获取帮助,有三种方法可以找到 Git 命令的使用手册:
git help <verb>
git <verb> --help
man git-<verb>
例如,要想获得 config 命令的手册,执行
git help config
当然,如果你遇到问题也可以查看git的官方文档。
https://git-scm.com/book/zh/v2
Git原理
git的四个区域
Workspace: 工作区,就是你平时存放项目代码的地方
Index / Stage: 暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
Repository: 仓库区(或版本库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本
Remote: 远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换
工作流程
git的工作流程一般是这样的:
1、在工作目录中添加、修改文件;
2、将需要进行版本管理的文件add到暂存区域;
3、将暂存区域的文件commit到git仓库;
4、本地的修改push到远程仓库,如果失败则执行第5步
5、git pull将远程仓库的修改拉取到本地,如果有冲突需要修改冲突。回到第三步
因此,git管理的文件有三种状态:已修改(modified),已暂存(staged),已提交(committed)
文件的四种状态
Untracked : 未跟踪, 此文件在文件夹中,但并没有加入到git库,不参与版本控制, 通过git add 状态变为Staged。
Unmodify: 文件已经入库且未修改, 即版本库中的文件快照内容与文件夹中完全一致,这种类型的文件有两种去处,如果它被修改, 而变为Modified,如果使用git rm移出版本库, 则成为Untracked文件。
Modified:文件已修改,仅仅是修改,并没有进行其他的操作,这个文件也有两个去处,通过git add可进入暂存staged状态,使用git checkout 则丢弃修改,返回到unmodify状态, 这个git checkout即从库中取出文件,覆盖当前修改
Staged:暂存状态,执行git commit则将修改同步到库中,这时库中的文件和本地文件又变为一致,文件为Unmodify状态。
Git常用命令
创建仓库
什么是仓库呢?就是可以用git管理的一个目录,这个仓库里所有的文件的改动(增加/修改/删除)都由git跟踪记录。也能通过git查看所有的记录,当然也能够通过git“还原”到某个记录点。在你要创建仓库的文件下,执行git init
初始化一个空的仓库
这个时候会在仓库目录下多了一个.git目录,.git目录里由很多关于git管理的文件,这里面的东西不用我们管,没事也别去瞎折腾。
有了仓库之后,我们就可以使用git add和git commit向仓库添加要跟踪的文件,和提交修改的内容了。
git add 与 git status
仓库里刚新建的文件是不会被跟踪起来的,比如我们使用git status就能查看到文件的状态,需要使用git add才可以
基本用法:
git add
通过git add
示例:
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命令的用法如下:
示例:
git commit -m "first commit" #把暂存区和当前已被跟踪的文件的所有的修改提交到仓库里,-m参数指定了此次提交的message内容
git commit info.log -m "save info.log" # 提交info.log
-
git commit file1.name file2.name file3.name .. -m “commit messages”
commit指提交修改到本地的仓库里,file*.name指的是带commit的文件 –m后面的内容指提交的信息,即备注
-
git commit -a -m “commit messeages”
添加的-a参数会把当前暂存区里所有的修改(包括删除操作)都提交,但是那些尚未添加到暂存区的内容是不会提交的,网上有
很多的博客内容说-a参数会把尚未add的文件也提交了,这个说法是错误的。
修改你的提交
有时候,我们提交一个commit后,发现有些部分漏掉了,尤其是有的内容忘记添加到暂存区了,导致这些内容没有commit,那如果我们把这些“漏掉”内容作为一个新的commit提交总不太好,其实我们可以把“漏掉”的内容提交到上一个commit里。
还有时候,我们刚刚最近的一次提交的commit message写的内容不够严谨,需要重新整理下。
那上面的两种场景,我们怎么处理呢? 答案是git commit --amend
这个命令只能修改最近的一次提交
比如你想修改aaa的内容,同时再新增个bbb文件,最后修改上一次提交的message信息。
那你可以先修改完aaa后,然后把aaa和bbb通过git add .
或者git add aaa.txt bbb.txt
加到暂存区,然后使用git commit --amend
把当前暂存区里的内容合并到上一次commit里,而且还可以修改上一次提交的message信息。
git commit --amend # 跳出一个VIM编辑框,此时我们可以修改提交内容格式,然后保存退出(如下图)
Git会新增加一个commit-id覆盖了上一次的commit-id, 这样漏掉的文件会合并到上一次的提交,然后我们也修改了提交message的规范,大家可以通过
git log –p
去查看这次内容。当然我们除了添加“漏掉”的文件,也可以删除“误修改”的文件。最后使用git push –fore
强制推送修改后的commit。
保存退出后,可以看到如下信息,然后再查看一下log和status
还有一个git rebase –i
的操作。比较麻烦,懒得写了~~
git clone
git clone 拷贝一个 Git 仓库到本地,让自己能够查看该项目,或者进行修改。
拷贝项目命令格式如下:
git clone [url]
如从github上下载一个开源库
git clone https://github.com/alibaba/async_simple.git
git push
命令格式如下:
git push <远程主机名> <本地分支名>:<远程分支名>
如果本地分支名与远程分支名相同,则可以省略冒号:
git push <远程主机名> <本地分支名>
以下命令将本地的 master 分支推送到 origin 主机的 master 分支。(提前是已经有远端主机信息了,origin是远端主机的别名,一般从远程git clone下来后,在.git/config配置有)
$ git push origin master
相等于:
$ git push origin master:master
如果本地版本与远程版本有差异,但又要强制推送可以使用 --force 参数:
git push --force origin master
删除主机的分支可以使用 --delete 参数,以下命令表示删除 origin 主机的 master 分支:
git push origin --delete master
git pull
git pull 命令用于从远程获取代码并合并本地的版本。
git pull 其实就是 git fetch 和 git merge FETCH_HEAD 的简写。 命令格式如下:
git pull <远程主机名> <远程分支名>:<本地分支名>
更新操作:
$ git pull
$ git pull origin
将远程主机 origin 的 master 分支拉取过来,与本地的 brantest 分支合并。
git pull origin master:brantest
如果远程分支是与当前分支合并,则冒号后面的部分可以省略。
git pull origin master
上面命令表示,取回 origin/master 分支,再与本地的 brantest 分支合并。
PS:
git的大乌龟TortoiseGit官网https://tortoisegit.org/download/
自动生成.gitignore文件的网址:http://www.gitignore.io/