Git的使用

来源:互联网 发布:js横陈烈感受静态的美 编辑:程序博客网 时间:2024/06/05 12:50

Git详细文档

CentOS6.8自带的git版本是1.7.1

卸载自带的git

yum remove git


安装Git前先确保已安装了libiconv

whereis libiconv

libiconv安装


现在来安装Git

yum install -y perl-ExtUtils-CBuilder perl-ExtUtils-MakeMakercd /wget https://www.kernel.org/pub/software/scm/git/git-2.9.5.tar.gztar -zxvf git-2.9.5.tar.gzcd git-2.9.5./configure --prefix=/usr/local/git --with-iconv=/usr/local/libiconvmake && make install

修改变量环境

vi /etc/profile

在最上面添加一行

export PATH=$PATH:/usr/local/git/bin

保存使其立刻生效

source /etc/profile

检查

git --version

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

命令行下输入git回车即可查看相关操作说明

创建版本库repository

1.创建文件夹

cd /mkdir mygit


2.把这个目录变成Git可以管理的仓库

cd mygitgit init

提示 初始化空的 Git 仓库于 /mygit/.git/

.git默认为隐藏文件

3.查看

ls -a

删除

rm -rf .git

添加文件

cd /mygitvi 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 018246e868b91150637992c140428d4772a54a03Author: root <root@61group.cn>Date:   Fri Nov 16 10:40:43 2017 +0800    测试文件又被我修改了commit 208f5e586576b1edbb00cfc100739166d40bd3c6Author: root <root@61group.cn>Date:   Fri Nov 16 10:35:14 2017 +0800    测试文件被我修改了commit a0d3d5ad13779070a745985c09719ca308089662Author: 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 /mygitvi new.txtgit add new.txtgit commit -m "新的“

平时我们通常使用rm来删除文件

rm -rf new.txt

使用git status显示你的工作站里的new.txt被你删除了

这时有两种操作

一是确定删除该文件

git rm new.txtgit 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文件夹


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

分支管理








原创粉丝点击