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官网下载源码,然后解压,依次执行:./config
,make
,sudo 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 GPL
的commit id
是1094adb...
,就可以指定回到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
文件夹就是一个工作区
工作区有一个隐藏目录.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 commit
或git 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
删除的文件
:只能把文件从版本库恢复到最新的版本
,但是会丢失最近一次提交后修改的内容