Git详细文档
CentOS6.8自带的git版本是1.7.1
卸载自带的git
yum remove git
安装Git前先确保已安装了libiconv
whereis libiconv
现在来安装Git
yum install -y perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker
cd /
wget https://www.kernel.org/pub/software/scm/git/git-2.9.5.tar.gz
tar -zxvf git-2.9.5.tar.gz
cd git-2.9.5
./configure --prefix=/usr/local/git --with-iconv=/usr/local/libiconv
make && make install
修改变量环境
vi /etc/profile
在最上面添加一行
export PATH=$PATH:/usr/local/git/bin
保存使其立刻生效
source /etc/profile
检查
git --version
命令行下输入git回车即可查看相关操作说明
git
创建版本库repository
cd /
mkdir mygit
把mygit目录变成Git可以管理的仓库
cd mygit
git init
提示 初始化空的 Git 仓库于 /mygit/.git/
.git默认为隐藏文件
查看
ls -a
如果删除的话是使用rm直接删除
rm -rf .git
添加测试文件
cd /mygit
vi test.txt
随便输入一些内容后保存
告诉Git,把文件添加到仓库
git add test.txt
回车后没有提示说明已添加上去了
提交
git commit -m "写了一个测试文件"
其中-m “写了一个测试文件”是这次提交的提交说明
修改操作
vi test.txt
随便修改一些内容后保存
查看状态
git status
回车后会提示test.txt被修改过而且未提交修改
查看改动的部分
git diff test.txt
提交修改和提交新文件都是使用git add,这里没有update的概念
git add test.txt
git commit -m "测试文件被我修改了"
再次查看
git status
显示 nothing to commit (working directory clean) 说明当前没有需要提交的修改
版本回退
继续修改test.txt文件
vi test.txt
继续提交
git add test.txt
git commit -m "测试文件又被我修改了"
此时已经有三个不同的版本了
git log
回车可以看到如下信息
commit 018246e868b91150637992c140428d4772a54a03
Author: root <root@61group.cn>
Date: Fri Nov 16 10:40:43 2017 +0800
测试文件又被我修改了
commit 208f5e586576b1edbb00cfc100739166d40bd3c6
Author: root <root@61group.cn>
Date: Fri Nov 16 10:35:14 2017 +0800
测试文件被我修改了
commit a0d3d5ad13779070a745985c09719ca308089662
Author: root <root@61group.cn>
Date: Fri Nov 16 10:26:11 2017 +0800
如果嫌输出信息太多,可以使用 git log --pretty=oneline 效果如下
018246e868b91150637992c140428d4772a54a03 测试文件又被我修改了
208f5e586576b1edbb00cfc100739166d40bd3c6 测试文件被我修改了
a0d3d5ad13779070a745985c09719ca308089662 写了一个测试文件
其中前面的一连串字符,如018246e868b91150637992c140428d4772a54a03 是版本号
在Git中,用HEAD表示当前版本,也就是最新的018246e868b91150637992c140428d4772a54a03
,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。
现在要把当前版本‘测试文件又被我修改了’回退到‘测试文件被我修改了’
git reset --hard HEAD^
检查文件是否回退到之前的版本
cat test.txt
再查看日志
git log
看到只剩下两个版本了,‘测试文件又被我修改了’这个版本不见了,怎么办?
只要上面的命令行窗口还没有被关掉,就可以顺着往上找
git reset --hard 018246e868b91150637992c140428d4772a54a03
这里版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。
如果当时命令行窗口已被关掉呢?
此时可以使用
git reflog
来查看所有分支的所有操作记录
管理修改
为什么Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件。
你会问,什么是修改?比如你新增了一行,这就是一个修改,删除了一行,也是一个修改,更改了某些字符,也是一个修改,删了一些又加了一些,也是一个修改,甚至创建一个新文件,也算一个修改。
继续修改test.txt的内容,
vi test.txt
内容改成hello
git add test.txt
git status
再修改test.txt的内容,内容改成hello world
git commit -m "第二次修改"
git status
此时提示修改没有被提交
这里的流程是:第一次修改 -> git add -> 第二次修改 -> git commit
为什么会出现这样的情况呢?
这里涉及到‘暂存区’的概念
Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念。
工作区(Working Directory),就是刚才创建的mygit这个目录,现在是直接在服务器上面操作的,实际应用中,这个工作区就是客户端的本地目录,也就是你的电脑上的某个目录
版本库(Repository),工作区下的隐藏目录.git
Git的版本库里存了很多东西,其中最重要的就是称为stage(index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。由于Git管理的是修改,当你用git add命令后,在工作区的第一次修改被放入暂存区,准备提交,但是,在工作区的第二次修改并没有放入暂存区,所以,git commit只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交。
撤销修改
继续修改test.txt的内容
vi test.txt
git status
这时提示已修改
执行撤销
git checkout -- test.txt
git status
这是提示nothing to commit, working tree clean,说明文件恢复了
git checkout — file命令中的—很重要,没有—,就变成了“切换到另一个分支”的命令,在后面的分支管理中会继续讲解。
继续修改test.txt的内容并执行
git add test.txt
此时想撤销的话就要使用
git reset HEAD test.txt
git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。
再用git status查看一下,提示如下
位于分支 master
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
修改: test.txt
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
再执行撤销
git checkout -- test.txt
git status
可以看到正常了
nothing to commit (working directory clean)
所以git的checkout的用法和SVN的checkout的用法是不同的
小结
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout — file。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考‘版本回退’一节,不过前提是没有推送到远程库。
========
删除文件
cd /mygit
vi new.txt
git add new.txt
git commit -m "新的“
平时我们通常使用rm来删除文件
rm -rf new.txt
使用git status显示你的工作站里的new.txt被你删除了
这时有两种操作
一是确定删除该文件
git rm new.txt
git commit -m "我确定删除new"
二是误删了,把误删的文件恢复
git checkout -- new.txt
git checkout其实是用版本库里的版本替换工作区的版本,无论工作区的操作是修改还是删除,都可以还原
====
使用GitHub远程仓库
先到GitHub注册一个账号
设置ssh无密码登陆密钥
cd /
ssh-keygen -t rsa -C "youremail@example.com"
把kinghaohui@qq.com换成你自己的邮件地址
提示Enter file in which to save the key (/root/.ssh/id_rsa)
这里随便输入一个key的名称,如 my(不输直接回车的话默认是id_rsa) ,然后一路回车,使用默认值即可,这里用作测试用途所以也无需设置密码。
这样会在当前目录和/root/.ssh目录都生成私钥和公钥文件
ls
可以看到生成了my和my.pub文件
其中my是私钥,my.pub是公钥
登陆GitHub,打开“Settings”,“SSH Keys”页面:
Title一栏任意填写,Key一栏填写my.pub的内容
配置 Git 用户信息
git config --global user.name yourusername
git config --global user.email youremail@example.com
创建仓库
在GitHub页面右上角,点击New repository
在Repository name填入my,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库:
目前,在GitHub上的这个learngit仓库还是空的
根据GitHub的提示,在本地的mygit仓库下运行命令:
cd /
mkdir my
cd my
echo "# my" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin git://github.com/username/my.git
其中的username要改成你自己的GitHub账户名
添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。
从现在起,只要本地作了提交,就可以使用git push把本地库的所有内容推送到远程库上
git push origin master
git push -u origin master
===
可能会出现的问题
为什么每次git push都要求输入帐号和密码,那是因为你使用的是https方式,而不是使用ssh方式
查看方式
git remote -v
重新设置成ssh方式
git remote rm origin
git remote add origin git@github.com:username/my.git
git push -u origin master
出现错误:Error: Permission denied (publickey)
若执行ssh-add /root/.ssh/xxx时出现错误:Could not open a connection to your authentication agent,则先执行如下命令即可:
ssh-agent bash
======
从远程库克隆
在GitHub上创建一个新的仓库mynew
勾选Initialize this repository with a README,这样GitHub会自动为我们创建一个README.md文件。
我这里打算把mynew放在/目录下
所以
cd /
git clone git@github.com:yourusername/mynew.git
ls
就可以看到多了一个mynew文件夹
============
分支管理