使用Git

Git的介绍及在开发中的使用

 

一、概述:

git在本地维护了三棵“树”,分别是:

1、工作目录:

  该目录实际存放文件

2、暂存区:

  缓冲区,临时保存文件的变动,执行的命令为:

git add filename
git add *

  该命令把文件添加到缓存区。

3、HEDA:

  指向最后一次提交的结果,执行的命令为:

git commit -m '描述'

  该命令将改动提交到了HEAD。

上图说明(图片来自廖雪峰老师博客):

 

 

以上就是本地git的大体组成结构,要想将文件提交到远程仓库(github),还需要以下两步:

1、关联远程仓库:

git remote add origin <Git Server> (https://githun.com/ahaii/xxx.git)

origin是默认远程仓库的名字。

2、推送本地文件到远程仓库:

git push -u origin master

 第一次推送时使用 -u 参数,git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

3、获取远程仓库获取最新版本,有两种方式:

git pull:

git pull  origin master #从远程仓库origin的master分支获取最新版本并于本地仓库合并

git fetch:

git fetch origin master        #获取远程仓库master分支到本地
git log -l master ..origin/master  #比较本地master分支和远程获取的master的差别
git merge origin/master        #合并master分支

 

二、使用实例:

1、在github中创建一个Repository

2、在setting的deploy中粘贴本地生成的id_rsa.pub

3、测试ssh远程连接是否成功:

ssh -T git@github.com

提示:'You’ve successfully authenticated, but GitHub does not provide shell access' 说明连接成功。

4、安装git本地客户端:

使用homebrew工具安装

1)安装homebrew:(homebrew官网:http://brew.sh/)

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

2)安装git:

brew install git

5、建立本地git仓库:

将本地项目根目录变成Git可以管理的仓库:

git init

6、将项目所有文件添加到缓存区中:

git add .

若只想添加某一个文件,只需将.换成相应文件名,可以多次执行add命令。

7、设置全局用户和邮箱:

git config --global user.email "ahaii@sina.com"

git config --global user.name "ahaii"

8、将缓存区中的文件(变动)commit到HEAD:

git commit -m '本次提交描述'

9、本地仓库关联github:

去github上新创建的repository中复制ssh地址(https://github.com/ahaii/....git)。

git remote add origin https://github.com/ahaii/testblog.git

10、上传代码到github仓库:

git push -u origin master

会要求输入github的用户名和密码。

以上就是将本地代码上传到github的过程。

11、更新当前分支:

git pull

12、克隆远程仓库到本地:

git clone https://github.com/ahaii/xxx.git

 

三、分支介绍:

在创建仓库的时候,会默认创建master主分支。使用分支可以从主线上分离开,分支上的任何更改不会影响主线,开发完成后可以分支合并到主线。

1、创建分支:

git branch <branchname>

2、切换到分支中:

git checkout <branchname>

3、创建一个新的分支,并切换过去:

git checkout -b <branchname>

4、切回主分支:

git checkout master

5、删掉分支:

git branch -d <branchname>

6、合并分支:

git checkout master   #需先切回主分支
git merge <branchname>

 

四、其他常用命令:

1、显示最近几条提交信息:

#git log --oneline -3     #显示最近的3次提交信息
fb7d208 show article detail
a99d32c reset
fb05f6b show category aritcle and set url.name

2、从暂存区删除文件:

git rm <file>

3、查看缓存区文件状态: 

#git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   hello.txt

有一个文件在缓存区(执行过git add)

修改hello.txt文件内容后,再次添加到缓存区。然后查看缓存区状态:

#git status 
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   hello.txt

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   hello.txt

显示缓存区中有一个文件,并且,该文件被修改之后没有再次提交到缓存区。也可以使用-s参数以精简方式查看:

#git status -s
AM hello.txt

显示结果中,第一列A表示文件添加到缓存区,第二列红色M表示文件被修改过后,没有再次添加到缓存区。

文件被修改后,没有再次添加到缓存区时,查看具体修改内容:

#git diff
diff --git a/hello.txt b/hello.txt
index eb8c108..6a57f2f 100644
--- a/hello.txt
+++ b/hello.txt
@@ -1,3 +1,4 @@
 hello
 world
 .
+.

4、查看缓存区文件:

git ls-files

5、版本回滚 git reset:

为了安全,对文件修改后,一般都会添加到版本库中(git add filename、git commit -m 'message')。当不小心修改错了文件,或者误删文件且已提交到了仓库中时(执行了git add 和 git commit),可以使用reset参数将版本库回滚到前一个版本。

 文本被修改前的内容:

#cat hello.txt 
hello ...

修改后文本内容:

#cat hello.txt 
hello ...
world

提交文本到版本库:

git add hello.txt
git commit -m 'add world'

现在,想回滚到文本被修改之前的状态(实际工作中,很可能会更改多处文本,我们根本记不住):

查看最近的几次提交信息:

#git log
commit 10c040baeaf8084dcbc9c0be91c042d83e27547a
Author: ahaii <yuliu100@sina.com>
Date:   Wed Sep 27 13:21:49 2017 +0800

    add world

commit afa5f754c9434c2b64919086da4bead6db2eb4d0
Author: ahaii <yuliu100@sina.com>
Date:   Wed Sep 27 13:05:03 2017 +0800

    add hello.txt

Git中,使用HEAD表示当前的版本,即git log中现实的第一个ID(这里是10c040baeaf8084dcbc9c0be91c042d83e27547a,add world)。上一个版本是(afa5f754c9434c2b64919086da4bead6db2eb4d0,add hello.txt),用HEAD^表示,前一个版本使用HEAD^^表示。

现在,回滚到上个版本(没有world):

#git reset --hard HEAD^
HEAD is now at afa5f75 add hello.txt

查看文本内容:

#cat hello.txt 
hello ...

已经没有world了。

再次查看提交信息:

#git log
commit afa5f754c9434c2b64919086da4bead6db2eb4d0
Author: ahaii <yuliu100@sina.com>
Date:   Wed Sep 27 13:05:03 2017 +0800

    add hello.txt

最新的一条即afa5f754c9434c2b64919086da4bead6db2eb4d0(add hello.txt)。

6、删除文件:

git rm <filename>  #删除缓存区和本地工作目录下的文件
git rm --cached <filename>    #只删除缓存区内的文件,本地工作目录下文件保留

 

五、Git目录下的几种文件状态:

1、 在仓库目录下创建新的文件,不做任何git提交:

#git status
On branch master
Your branch is up-to-date with 'origin/master'.
Untracked files:
  (use "git add <file>..." to include in what will be committed)

    test.txt

nothing added to commit but untracked files present (use "git add" to track)

2、git add提交到缓存区后:

#git add test.txt 
#git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   test.txt

3、此时,文件在缓存区里创建了快照,根据提示,使用reset HEAD命令可以恢复到未缓存状态(将已缓存的文件移除,回到git add操作之前):

#git reset HEAD test.txt 
#git status
On branch master
Your branch is up-to-date with 'origin/master'.
Untracked files:
  (use "git add <file>..." to include in what will be committed)

    test.txt

nothing added to commit but untracked files present (use "git add" to track)

4、执行git add 后,对文件进行修改,然后查看git状态:

#echo 'hello' > test.txt
#git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   test.txt

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   test.txt

可以看到,多了一个 'Changes not staged for commit:' 状态,表示文件被修改过后,没有被放入缓存区(git add)。此时,如果想提交到版本库,需要重新执行git add。(注:只有状态为Changes to be committed)的文件才能被git commit。

5、如果想撤回,则执行git checkout(回到文件被修改之前,工作目录中文件也会被修改):

#git checkout -- test.txt
#git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   test.txt

此时,文件内容为空。

 

六、遇到的错误:

1、远程仓库版本比本地高,本地push时报错:

! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'https://github.com/ahaii/python.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

解决:先更新本(pull)地版本库,再push。

   或者丢弃远程仓库的版本,强制push: 

git push -f

2、本地仓库有修改,没有合并提交,想用远程仓库上面的代码更新本地:

error: You have not concluded your merge (MERGE_HEAD exists).
hint: Please, commit your changes before merging.
fatal: Exiting because of unfinished merge.

解决:

  1、下载远程库内容,不做合并:

git fetch --all

  2、reset把HEAD指向刚刚下载的最新版本

git reset --hard origin/master

 

 

参考资料:https://git-scm.com/book/zh/v2

posted @ 2016-12-30 20:34  ahaii  阅读(295)  评论(0编辑  收藏  举报