Git 的使用

安装Git:

Linux安装git

先输入git,查看有没有安装git

$ git
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git

 像上面的情况,就是说没有安装git

Debian或Ubuntu Linux,通过一条sudo apt-get install git就可以直接完成Git的安装

老版本的Debian或Ubuntu Linux要使用sudo apt-get install git-core安装git

其他版本也可以通过到git官网下载源码,然后解压,依次执行:./configmakesudo make install这几个命令安装

Mac OS安装git

Mac OS有两种安装git的方式

一、是安装homebrew,然后通过homebrew安装Git,具体方法请参考homebrew的文档:http://brew.sh/

二、是直接从AppStore安装Xcode,Xcode集成了Git,不过默认没有安装,你需要运行Xcode,选择菜单“Xcode”->“Preferences”,在弹出窗口中找到“Downloads”,选择“Command Line Tools”,点“Install”完成安装。

Windows 安装git

在windows安装git,可直接从git官网下载程序,直接安装。

 

安装完成之后,还需要进行一步设置。启动git命令行工具,然后在命令行输入:

$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"

 注意: git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。

创建版本库:

版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

创建版本库首先要指定一个文件夹,也可以手动创建一个文件夹:

$ mkdir learngit
$ cd learngit

 如果使用Windows系统,尽可能保证目录路径没有中文

指定文件夹后,进入文件夹目录下,执行git init命令把该目录变成git管理的仓库

$ git init

可以使用ls -ah命令查看该目录下是否有一个.git目录,如果有就是创建成功了

$ ls -ah

使用版本库:

把文件添加到版本库

编写一个readme.txt文件,内容如下:

Git is a version control system.
Git is free software.

 然后把readme.txt放到刚刚创建的版本库(learngit)或者其子目录下

把文件添加到仓库(可以多次add不同的文件到仓库)

$ git add readme.txt

然后把文件提交到仓库(可以把添加到仓库里的文件全部提交到仓库)

$ git commit -m "本次文件提交的说明写在这里,比如日期、版本信息"
[master (root-commit) eaadf4e] wrote a readme file
 1 file changed, 2 insertions(+)
 create mode 100644 readme.txt

修改文件

修改readme.txt文件,改成如下内容:

Git is a distributed version control system.
Git is free software.

运行git status命令看看结果:

$ git status
On branch master
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:   readme.txt

no changes added to commit (use "git add" and/or "git commit -a")

git status命令可以让我们时刻掌握仓库当前的状态,上面的命令输出告诉我们,readme.txt被修改过了,但还没有准备提交的修改。

查看具体修改了什么需要用git diff这个命令看看:

$ git diff readme.txt 
diff --git a/readme.txt b/readme.txt
index 46d49bf..9247db6 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed version control system.
 Git is free software.

git diff顾名思义就是查看difference,显示的格式正是Unix通用的diff格式,可以从上面的命令输出看到,我们在第一行添加了一个distributed单词。

提交修改和提交新文件是一样的,第一步是git add

$ git add readme.txt

在执行第二步git commit之前,运行git status查看当前仓库的状态:

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   readme.txt

git status告诉我们,将要被提交的修改包括readme.txt,下一步,就可以提交了:

$ git commit -m "add distributed"
[master e475afc] add distributed
 1 file changed, 1 insertion(+), 1 deletion(-)

提交后,再用git status命令查看仓库的当前状态:

$ git status
On branch master
nothing to commit, working tree clean

Git告诉我们当前没有需要提交的修改,而且工作目录是干净(working tree clean)的。

添加远程仓库命令  git remote add <shortname> <url>  # shortname:仓库在本地的名字

git remote add pb https://github.com/paulboone/ticgit
使用pb代指https://github.com/paulboone/ticgit指向的仓库

远程仓库重命名命令 git remote rename <oldshortname> <newshortname>

删除远程仓库命令 git remote rm <shortname>

查看远程仓库命令 git remote

查看远程仓库及url命令 git remote -v

查看本地分支命令 git branch

本地分支重命名 git branch -m old_local_branch_name new_local_branch_name

删除本地分支命令 git branch -D <branchName>

删除远程分支命令 git push <shortname> --delete <branchName>

查看远程分支命令 git branch -r

查看全部分支命令 git branch -a

创建本地分支命令 git branch <branchname> # branchname:分支名称

把本地分支推送到远程仓库 git push <shortname> <branchname>

切换分支命令 git checkout <branchname>

从远程拉取分支  git checkout -b <local_branchname> origin/<remote_branchname>

克隆远程仓库命令 git clone <url> 

把另一个分支合并到当前分支 git merge <branchname>

从远程仓库抓取数据命令 git fetch <shortname>  # 会抓取上一次抓取或克隆后新推送的数据,但是不会自动和本地数据合并

从远程仓库拉取数据并合并到本地仓库命令 git pull  # 抓取上一次抓取或克隆后新推送的数据,自动和本地数据合并

版本回退

现在,再修改一次文件,修改readme.txt文件如下:

Git is a distributed version control system.
Git is free software distributed under the GPL.

然后提交:

$ git add readme.txt
$ git commit -m "append GPL"
[master 1094adb] append GPL
 1 file changed, 1 insertion(+), 1 deletion(-)

查看git仓库的历史记录,用git log命令查看:

$ git log
commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master)
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Fri May 18 21:06:15 2018 +0800

    append GPL

commit e475afc93c209a690c39c13a46716e8fa000c366
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Fri May 18 21:03:36 2018 +0800

    add distributed

commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Fri May 18 20:59:18 2018 +0800

    wrote a readme file

git log命令显示从最近到最远的提交日志

如果嫌输出信息太多,可以加上--pretty=oneline参数:

$ git log --pretty=oneline
1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master) append GPL
e475afc93c209a690c39c13a46716e8fa000c366 add distributed
eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 wrote a readme file

注意:我们看到的一大串类似1094adb...的是commit id(版本号),和SVN不一样,Git的commit id不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示

现在我们把readme.txt回退到上一个版本,也就是add distributed的那个版本

首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交1094adb...,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

现在,要把当前版本append GPL回退到上一个版本add distributed,就可以使用git reset命令:

$ git reset --hard HEAD^
HEAD is now at e475afc add distributed

查看readme.txt的内容:

$ cat readme.txt
Git is a distributed version control system.
Git is free software.

使用git log查看现在版本库的状态:

$ git log
commit e475afc93c209a690c39c13a46716e8fa000c366 (HEAD -> master)
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Fri May 18 21:03:36 2018 +0800

    add distributed

commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Fri May 18 20:59:18 2018 +0800

    wrote a readme file

最新的那个版本append GPL已经消失了,不过只要上面的命令行窗口还没有关闭,就可以找到append GPLcommit id1094adb...,就可以指定回到append GPL版本:

$ git reset --hard 1094a
HEAD is now at 83b0afe append GPL

版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号。

再查看readme.txt的内容:

$ cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.

Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从指向append GPL

改为指向add distributed

Git提供了一个命令git reflog用来记录每一次执行的命令:

$ git reflog
e475afc HEAD@{1}: reset: moving to HEAD^
1094adb (HEAD -> master) HEAD@{2}: commit: append GPL
e475afc HEAD@{3}: commit: add distributed
eaadf4e HEAD@{4}: commit (initial): wrote a readme file

Git的工作区和暂存区:

工作区(Working Directory)

就是在电脑里能看到的目录,比如learngit文件夹就是一个工作区

 

版本库(Repository)

工作区有一个隐藏目录.git,就是Git的版本库。

Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD

文件往Git版本库里添加的时候,是分两步执行的:

第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;

第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

创建Git版本库时,Git自动创建了唯一一个master分支,所以git commit就是往master分支上提交更改

可以理解为,需要提交的文件修改都先被放到暂存区(add),然后,一次性提交暂存区的所有修改(commit)

Git记录的是文件被修改的内容,不是文件

撤销修改

  • 当文件在工作区被修改,git checkout -- file可以丢弃工作区的修改,例如:git checkout -- readme.txt

有两种情况:

一种是文件自修改后还没有被放到暂存区,撤销修改就回到和版本库一样的状态;

一种是文件已经添加到暂存区后,又作了修改,现在撤销修改就回到添加到暂存区后的状态。

总之,就是让这个文件回到最近一次git commitgit add时的状态。

  • 当文件被修改并且被git add到暂存区,用命令git reset HEAD <file>可以把暂存区的修改撤销掉(unstage),重新放回工作区,例如:git reset HEAD readme.txt,然后再从工作区撤销对文件的修改

删除文件

从工作区删除文件用rm filename,从版本库删除文件用git rm filename,并且git commit

恢复在工作区删除的文件用git checkout -- file命令

恢复用git rm删除的文件只能把文件从版本库恢复到最新的版本但是会丢失最近一次提交后修改的内容

posted @ 2018-09-17 14:55  Wuliwawa  阅读(130)  评论(0编辑  收藏  举报