[Git] Git整理(一) Git的安装、配置和基本操作

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/FightFightFight/article/details/79710711

参考网站:https://git-scm.com/book/zh/v2/

#1.版本控制简介
版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统,在版本控制发展的历史中,首先出现的是本地版本控制。顾名思义,就是将每次版本的更新都记录到本地,但不能在不同设备之间进行版本控制管理。于是,出现了集中式版本控制系统,比如之前常用的SVN,集中式版本控制系统(Centralized Version Control Systems,简称 CVCS)有如下特点:

1.有一个服务器,用来保存所有文件的修改记录。
2.其他设备连接到这个服务器,来提交或更新最新的版本。

集中式版本控制系统相对于本地本地版本控制系统,有不少的优点,然而,缺点也很明显:

1.必须联网才能工作,否则下载代码/提交代码无法完成;
2.安全性低,服务器只有一个,如果发生宕机或损坏,数据就不能找回了。

于是,就出现了分布式版本控制系统(Distributed Version Control System,简称 DVCS),最常用的就是Git了。
分布式版本控制系统不的设计理念和集中式版本控制系统有很大的差别,在分布式版本控制系统中,客户端不止是提取服务器上的文件,而是将整个服务器上代码仓库的镜像克隆到了本地,这样一来,每个客户端就相当于一个服务器,任何一个服务器发生故障,都可以通过其他客户端来恢复数据,因此,保证了数据的安全性。此外,由于每个客户端都克隆了代码仓库的镜像,因此,可以在没有网络的情况下进行文件的提交(提交到本地的代码仓库中),网络恢复后再上传到服务器即可。

这点对于习惯用SVN的用户来说(比如我),比较难理解,在SVN中,svn commit之后就提交到了服务器中,而当使用git提交时,git commit之后时提交到了本地的数据库中,和远程的服务器没一点关系,只有git push之后,才会真正的提交到远程服务器。
#2.Git简介
Git是一种分布式版本控制系统,由linux之父 Linus Torvalds为了给Linux内核开源项目提供一个高效强大的分布式版本控制工具开发而成。
######Git工作原理
Git 和其它版本控制系统的主要差别在于 Git 对待数据的方法。 概念上来区分,其它大部分系统以文件变更列表的方式存储信息。 这类系统(CVS、Subversion、Perforce、Bazaar 等等)将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异。
Git 不按照以上方式对待或保存数据。 反之,Git 更像是把数据看作是对小型文件系统的一组快照。 每次你提交更新,或在 Git 中保存项目状态时,它主要对当时的全部文件制作一个快照并保存这个快照的索引。 为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。 Git 对待数据更像是一个快照流。
######Git三种状态
已修改:说明文件被修改了
已暂存:说明,对一个已修改文件的当前版本做了标记
已提交:说明被修改的文件已经被提交到本地数据库了

这三种状态分别对应三个区域:

工作目录:从服务器提取下的内容
暂存区:一个文件,保存了下次将提交的文件列表信息。
Git仓库:是 Git 用来保存项目的元数据和对象数据库的地方。,这是 Git 中最重要的部分,从其它计算机克隆仓库时,拷贝的就是这里的数据。
######Git工作流程
1.在工作目录中进行文件的操作,如代码的修改,删除;
2.将修改的内容放到暂存区中,准备进行提交;git add;
3.将暂存区中的文件提交到本地数据库中,git commit;
4.(可选)上传到远程服务器,git push;

#3.Git的安装(Linux)
在Ubuntu上安装Git,首先,执行该命令查看是否安装git:

Ubuntu@ubuntu:~$ git
usage: git [--version] [--help] [-C <path>] [-c name=value]
           [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
           [-p | --paginate | --no-pager] [--no-replace-objects] [--bare]
           [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
           <command> [<args>]

如果是上面所示例,则说明已安装,如果不是,对于Debian的版本,使用如下命令进行安装:

sudo apt-get install git

对于早期版本的debian系统,需要执行sudo apt-get install git-core,这是因为之前有个软件也叫git(GNU Interactive Tools),因此避免混淆,在后面加了core;后来的版本中gun I T改名位gnuit了,git安装就变成了现在的命令;
如果时其他Linux版本,请参考 http://git-scm.com/download/linux.

#4.配置Git环境:
######1.配置用户信息:
当然,安装完成后还需要进行配置,因为是分布式管理,每一次提交都需要账号和信息,因此需要你的帐户名和邮箱:

git config --global user.name "youname"
git config --global user.email "your email"

git config 命令加--global表示,这台机器上的所有git仓库都使用该配置;如果想想针对特定项目使用不同的用户名称与邮件地址时,可以在那个项目目录下运行没有--global选项的命令来配置。
Git自带了一个git config的工具类控制git的外观和行为的配置变更,这些变量存储在不同的位置,而且每个变量可以有不同的作用范围,作用范围由三个文件控制:
/etc/gitconfig:包含系统上每一个用户的Git配置,通过git config --system读取和设置;
~/.gitconfig:当前用户的Git配置,通过git config --global 读取和设置;
repository/.git/config:当前工作目录中的Git配置,在当前工作目录中不加--system--global设置;
每一个级别覆盖上一级别的配置,所以 .git/config 的配置变量会覆盖 /etc/gitconfig 中的配置变量。
######2.配置编辑器:
在使用git提交代码时,需要编辑提交信息,Git会打开配置的编辑器让用户编辑,如果不配置,则使用默认编辑器,如nano、vim等,配置vim编辑器如下:

git config --global core.editor vim

这样就配置了vim为git编辑器。
更多git config 命令可以参考:https://git-scm.com/docs/git-config
######3.检查配置信息:
当配置好用户信息和编辑器后,整个Git环境就配好了,当然还可以进行其他的配置,通过git config -l查看当前git的配置:

Ubuntu@ubuntu:~/workspace/test$ git config -l
user.name=jyq
[email protected]
color.ui=auto
commit.template=/home/Ubuntu/.commit_template
push.default=simple
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
user.name=jiayongqiang
[email protected]
Ubuntu@ubuntu:~/workspace/test$ 

还可以指定某一项:git config <key>,如:

Ubuntu@ubuntu:~/workspace/test$ git config core.editor
vim
Ubuntu@ubuntu:~/workspace/test$ git config user.name
jiayq

#5.获取Git仓库
Git仓库,又称版本库,只有版本库中的文件才能被Git进行管理。有两种方式可以创建一个Git 仓库:
1.在本地创建一个新的并且没有在git控制下的仓库.创建一个版本库非常简单,首先创建一个新目录,

mkdir MyRepository
cd MyRepository

执行git init 命令就会创建:

Ubuntu@ubuntu:~/workspace/test$ git init
Initialized empty Git repository in /home/Ubuntu/workspace/test/.git/
Ubuntu@ubuntu:~/workspace/test$ 

创建完成后,会提示你一个空的git 仓库创建完成,并且在该目录下生成一个.git文件.
2.通过git clone 克隆一个Git仓库,这时默认配置下远程 Git 仓库中的每一个文件的每一个版本都将被拉取下来,在前面说过了,Git会拉取整个远程仓库的镜像,因此,如果远程服务器发生宕机或者数据丢失,不用担心,在拉取过远程仓库的客户端就有完整的数据,如:

git clone http://127.0.0.1:8082/gits/workspace/

在拉取远程仓库代码时,可以使用HTTP协议http://,也可以使用SSH协议如[email protected]/xxx
#6.Git基本命令
当本地创建了Git仓库后,就可以对仓库中的文件进行版本控制了,处于仓库中的文件,有且只有两种状态:已跟踪状态和未跟踪状态,已跟踪的文件是指那些被纳入了版本控制的文件,在上一次快照中有它们的记录,在工作一段时间后,它们的状态可能处于未修改,已修改或已放入暂存区。工作目录中除已跟踪文件以外的所有其它文件都属于未跟踪文件,它们既不存在于上次快照的记录中,也没有放入暂存区。初次克隆某个仓库的时候,工作目录中的所有文件都属于已跟踪文件,并处于未修改状态。转换图如下:
来源:
(上图来自https://git-scm.com/book)
接下来通过几种基本操作来理解什么是已跟踪文件和未跟踪文件

######6.1.查看文件状态
使用git staus可以查看当前工作目录中文件的状态:

Ubuntu@ubuntu:~/workspace/test$ touch first.txt  #创建一个文件
Ubuntu@ubuntu:~/workspace/test$ git status
On branch master  #分支名称
Initial commit
Untracked files:  #未跟踪文件
  (use "git add <file>..." to include in what will be committed)
	first.txt  
nothing added to commit but untracked files present (use "git add" to track)

从命令中看出,first.txt处于未跟踪状态,因此,通过git add命令将文件添加到暂存区。
######6.2.添加文件到暂存区
使用git add可以将文件添加到暂存区,再此查看文件状态,此时文件就会处于已跟踪状态:

Ubuntu@ubuntu:~/workspace/test$ git add . #.代表当前路径
Ubuntu@ubuntu:~/workspace/test$ git status
On branch master 
Initial commit
Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
	new file:   first.txt
Ubuntu@ubuntu:~/workspace/test$ 

.代表当前路径,如果要添加某一个文件,直接使用git add filename即可。当git add之后,说明文件就处于暂存区了。
######6.3.提交文件到本地仓库
当文件处于暂存区时,说明文件是已跟踪状态,这时就可以使用git commit将暂存区中的文件提交到本地仓库了:

Ubuntu@ubuntu:~/workspace/test$ git commit
[master (root-commit) 5e42953] fist commit:
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 first.txt
Ubuntu@ubuntu:~/workspace/test$ 

当输入git commit 回车后,Git会为用户打开配置的编辑器编辑提交信息,编辑保存后,就提交成功了。
######6.4.追加提交
当用户提交之后发现漏提了文件或者提交了错误文件,使用git commit --amend 命令可以在上次提交的基础上进行追加,这样会将两次提交合并为一个提交。
######6.5.查看修改
使用git diff命令可以查看对文件具体的修改,包括已暂存文件和未暂存文件(未跟踪状态),要查看未暂存文件的修改,直接使用git diff [.|filename],如:

Ubuntu@ubuntu:~/workspace/test$ 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:   first.txt  #modify表示修改了文件

no changes added to commit (use "git add" and/or "git commit -a")
Ubuntu@ubuntu:~/workspace/test$ git diff   #查看具体修改
diff --git a/first.txt b/first.txt
index 188ebe5..57e6697 100644
--- a/first.txt
+++ b/first.txt
@@ -1 +1,3 @@
-jjjjjjj:
+
+this is first.txt
+first modify
Ubuntu@ubuntu:~/workspace/test$ 

如果查看已暂存的修改,使用git diff --staged 或者git diff --cached, 如:

Ubuntu@ubuntu:~/workspace/test$ git add .    #将修改添加到暂存区
Ubuntu@ubuntu:~/workspace/test$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
	modified:   first.txt
Ubuntu@ubuntu:~/workspace/test$ git diff   #查看未暂存文件的具体修改
Ubuntu@ubuntu:~/workspace/test$ git diff --staged  #查看已暂存文件的具体修改
diff --git a/first.txt b/first.txt
index 188ebe5..57e6697 100644
--- a/first.txt
+++ b/first.txt
@@ -1 +1,3 @@
-jjjjjjj:
+
+this is first.txt
+first modify
Ubuntu@ubuntu:~/workspace/test$ 

git diff 之外,Git还提供了一个工具用于查看修改:git difftool 命令可以用来简单地启动一个外部工具来为你展示两棵树之间的差异,比如:

@ubuntu:~/workspace/test$ git difftool --cached  #启动一个外部工具查看暂存区中的修改
This message is displayed because 'diff.tool' is not configured.
See 'git difftool --tool-help' or 'git help config' for more details.
'git difftool' will now attempt to use one of the following tools:
meld opendiff kdiff3 tkdiff xxdiff kompare gvimdiff diffuse diffmerge ecmerge p4merge araxis bc codecompare emerge vimdiff
Viewing (1/1): 'first.txt'
Launch 'meld' [Y/n]: Y  #启动meld进行比较

######6.6.查看历史提交记录
使用git log 可以查看历史提交信息:

Ubuntu@ubuntu:~/workspace/test$ git log
commit 17eb84c7c3e74be0d73199455e8a33e439e2e602
Author: jiayq <[email protected]>
Date:   Mon Mar 26 20:55:12 2018 +0800
    d:ist commit:
Ubuntu@ubuntu:~/workspace/test$ 

还可以根据参数查看不同的提交信息:

git log -p 显示每次提交的内容差异
git log -stat 显示每次提交的简单信息统计
git log -4  显示最近4次提交
git log --author=“XXX”  显示xxx的提交记录

######6.7.撤销修改
如果要取消已暂存的修改,使用git reset HEAD <file> 命令,如:

@ubuntu:~/workspace/test$ git status  #查看状态
On branch master
Changes to be committed:  #待提交
  (use "git reset HEAD <file>..." to unstage)
	modified:   first.txt
@ubuntu:~/workspace/test$ 
@ubuntu:~/workspace/test$ git reset HEAD #撤销已暂存文件的修改
Unstaged changes after reset:  
M	first.txt
@ubuntu:~/workspace/test$ 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:   first.txt
no changes added to commit (use "git add" and/or "git commit -a")

如果要撤销未暂存的本地修改,使用git checkout -- file 命令,如:

@ubuntu:~/workspace/test$ git checkout -- first.txt
@ubuntu:~/workspace/test$ git status
On branch master
nothing to commit, working directory clean
@ubuntu:~/workspace/test$ 

执行完git checkout -- file 命令后,对file做的所有修改都将清除。
######6.7.移除文件
如果想移除一个已跟踪的文件,使用git rm 命令,如:

@ubuntu:~/workspace/test$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
	deleted:    first.txt
@ubuntu:~/workspace/test$ git commit
[master 3a2d770] git rm
 1 file changed, 1 deletion(-)
 delete mode 100644 first.txt
@ubuntu:~/workspace/test$ 

首选查看状态,然后移除已处于仓库中的first.txt文件,最后提交这次操作,这样该文件就不再纳入版本管理了。 如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项git rm -f
此外,git rm 后还可以列出文件或者目录的名字,也可以使用 glob 模式,如:

git rm \*.bak  #移除跟踪文件中所有.bak结尾的文件

######6.8.移动文件
Git中没有显示跟踪文件移动的操作,使用git mv 命令可以给文件重命名,但是仓库中存储的元数据并不会体现出这是一次改名操作,该命令如下:

@ubuntu:~/workspace/test$ git mv first.txt first_new.txt
@ubuntu:~/workspace/test$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
	renamed:    first.txt -> first_new.txt  #状态变为renamed
@ubuntu:~/workspace/test$ 

git mv 命令相当于以下三个命令:

mv first.txt first_new.txt
git rm first.txt
git add first_new.txt

######6.9.版本切换(回退)
如果要某一次提交,或者当我们代码已经提交了,但是要回退到提交代码之前的状态,可以有以下两种操作:
1.回退到某次提交,但是本地的修改记录也会保存:

git reset commitid

2.回退到某次提交,本地的修改记录全部撤销:

git reset --hard commitid

HEAD是一个表示指向当前版本的指针,因此也可以使用HEAD指针来回退版本,如:

git reset HEAD

这个命令之前说过,用于撤销暂存区的修改,原因就是会退到当前提交的版本上,因此会撤销暂存区的修改
如果要回退到当前版本前一次的版本上,可以在HEAD后加一个^:

git reset HEAD^   #回退到当前版本前一次的版本上
git reset HEAD^^   #回退到当前版本前两次次的版本上

如果要回退到当前版本前n次版本的化,使用n个^是不妥的,可以直接使用~n,如:

git reset HEAD~3   #回退到当前版本前三次的版本上

这些都是回退版本的情况,如果要切换到最新版本呢?还是一样的,给定最新提交的版本id就可以了:

git reset commitId

不过要注意,如果回退版本后,,使用git log 就无法找到之后的commitId了,因此git又提供了一个命令,可以方便的找到相关的版本的提交id——git reflog:

$ git reflog
ee3311e HEAD@{0}: reset: moving to ee3311ea70fc07d137cbdee2895b438312d02ab4
a30e920 HEAD@{1}: reset: moving to a30e92023a36e1d5eeb738138eb11a49e3ec0629
ee3311e HEAD@{2}: reset: moving to ee3311ea70fc07d137cbdee2895b438312d02ab4
a30e920 HEAD@{3}: reset: moving to a30e92023a36e1d5eeb738138eb11a49e3ec0629
ee3311e HEAD@{4}: commit: Bug #3
a30e920 HEAD@{5}: commit: Bug #2
bd0d21f HEAD@{6}: commit: Bug #1
73e2b53 HEAD@{7}: reset: moving to 73e2b53

git reflog 用于记录本地仓库中的分支信息、提交log等。
说了这么多,其实版本切换只需要记住git reset commitId 就行,HEAD 表示当前版本的commitId,如果切换后不保留本地修改,则加上--hard 参数即可。

7.使用.gitignore忽略不提交文件

在当前git运行的目录下,创建一个.gitignore文件,将不需要提交的文件添加到这里。当再次操作git status时,就会自动忽略,如:

touch .gitignore

此时在当前目录下创建了一个.gitignore文件,打开该文件,将不需要提交的文件写入:

bin/*
.classpath
META-INF/*
.project
.settings

完成后,git将忽略这些文件的状态,不会对他们进行跟踪。

总结

以上这个命令是Git操作本地文件时的基本命令,需要提交修改文件时,正确的步骤应是:

git status   #查看文件状态
git diff     #查看文件修改内容
git add .    #添加到暂存区
git commit   #提交到本地数据库

这样可以保证提交的正确性,以免错提或者漏题文件。

猜你喜欢

转载自blog.csdn.net/FightFightFight/article/details/79710711
Git