Categories

Tags

Git的使用

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详细说明

===
可能会出现的问题
为什么每次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文件夹

============

分支管理