Git基本操作(初学向)

274 阅读9分钟
  1. Git将数据当做一个文件系统的一组快照.每次提交或者保存状态的时候,Git会抓取一张所有文件当前状态的快照,然后存储一个指向该快照的引用.
  2. 如果文件没有变动,那么Git不会再保存在文件,而是设置一个指向已保存过的相同文件的链接.

img

  1. Git通过散列值来在数据库中存储数据,而不是文件名.

  2. Git所有的操作都是向数据库中添加数据.

  3. 三种状态:已提交committed,已修改modified,已暂存staged

    1. committed:数据已经被安全的保存到本地数据库
    2. modified:改动了文件,但还没提交到数据库
      1. 如果Git跟踪的文件出现了变更,并且没有被暂存,则就是modified状态
    3. staged:对已经修改的文件做出标识,并在下一次提交的时候加入到快照中
      1. 文件被修改,并且放入暂存区中,就是staged状态

img

  1. 工作目录是项目某个版本的单词检出(check out project,相当于从数据库中查看之前保存的文件状态)。这些数据从Git目录下面被提取出来,放到磁盘上以供使用。

  2. 暂存区保存了下次将要提交的信息。

Git配置

Git config

Git config用来获取和设置配置变量,用来控制Git外观和操作的方方面面。

这些变量放在三个不同的位置:所有用户、当前用户、单个仓库

  1. /etc/gitconfig,包含了系统中所有用户及其仓库的值。使用git config的 --system选项来从该文件读写配置变量
  2. ~/.gitconfig或者~/.config/git/config,针对当前用户,使用--global选项来从该文件读写配置变量
  3. 当前仓库的Git目录中的config文件:针对单个仓库使用的。

注意,每一级都会覆盖上一级的设置,所以./git/config中的值优于/etc/gitcongih中的值

设置用户身份

安装好Git的第一件事是设置name和email,Git每一次提交都需要用到这些信息。

命令如下:

git config --global user.name "your_name"

git config --global user.email "vms_zhang@tom.com"

如果传入了--global选项,则只需要设置一次就可以了.之后执行操作的时候,Git都会使用这些已经设置好的信息.

I. 如果想要在某个项目中使用不同的name,email,则可以在项目中使用不带--global的命令

检查个人设置

git config --list   # 查看配置信息

img

也可以使用git config user.name 来查看Git中当前某个键的值.

img

Git基础

获取Git仓库

获取Git仓库的方法:

  1. 方法一:把现有的项目导入Git中

  2. 方法二:从服务器上克隆现有的Git仓库

方法一:在现有目录中初始化git仓库

  1. 只需要进入相应的项目目录并对项目进行跟踪
    1. 在这个目录打开bash
    2. 输入命令进行初始化
git init   #标记当前目录是git目录

这个命令会创建一个.git的子目录,里面包含了Git仓库骨架的信息;

此时并未跟踪项目中的任何文件

  1. 跟踪项目中的文件并进行初次提交;

只需要执行git add命令,然后输入git commit命令就行了.

git add *.c   # 跟踪所有的.c文件

git add LICENSE  # 跟踪LICENSE文件

git commit -m "initial project version" # 提交,-m后面跟的是本次提交的备注信息

现在就已经对这些被跟踪的项目进行了初次提交

方法二:克隆现有仓库

比如克隆仓库git@github.com:VMS-zhang/GoStart.git,那么可以使用如下命令

git clone git@github.com:VMS-zhang/GoStart.git

这个命令会从github中克隆url所指向的仓库.

例子

  1. 创建一个空目录
  2. 打开bash界面,输入git clone git@github.com:VMS-zhang/GoStart.git

img

则会从github上把项目下载下来

img

img

下载下来的文件默认是已跟踪状态.

Git仓库中记录的变更

现在已经向git进行了一次提交,下一步可以做一些更改,然后再向仓库中提交数据.

工作目录下的每一个文件都处于两种状态

  1. 已跟踪tracked,即被Git感知的文件;已跟踪文件有三种状态,已修改/未修改/已暂存

  2. 未跟踪untracked,Git还没有感知到的文件

如果修改了已跟踪的文件,那么文件状态就会变成已修改,接下来需要把这些已修改的文件放到暂存区,提交所有已暂存的变更,重复这个过程.

img

查看当前文件的状态

git status

如果克隆仓库以后立即执行这个命令,会有如下的输出:

img

这个输出说明当前项目工作目录是干净的,因为没有任何文件被修改过;同时也没有找到任何未跟踪文件,否则文件会被列出.

默认是master分支.

例子:

  1. 向文件夹随便添加一个文件,例如一个名为README的文件

img

可以看到,README文件处于未跟踪状态,显示了"untracked files",Git不会自动把这些文件包含到下一次提交的文件范围中,除非明确告诉Git去跟踪这些文件.

跟踪新文件

刚才创建了一个README,但是还没有进行跟踪,使用git add对其进行跟踪.

img

可以看到,git status的时候,Changes to be committed下面就是已暂存的文件.

现在如果提交,那么之前执行的git add时候的文件版本就会被添加到历史快照中间.

暂存已修改文件

刚才clone的时候,从仓库获取到了README.md文件,如果对这个文件进行修改,则会使这个文件变成一个已跟踪但未暂存的状态

img

这个时候也需要使用git add命令来进行暂存.

Git add 既可以跟踪新文件,也可以用来暂存文件,还有一些其他功能.

Git add 命令的最好理解是:添加内容到下一次提交中!

img

二次修改

如果此时对README.md再一次进行修改,查看一下状态

img

现在README.md有两种状态

  • 绿色的代表执行git add README.md时候的那个状态

  • 红色的那个是现在README.md的状态.

所以还需要进行一次git add来设置README.md作为新的修改

img

忽略文件

可能不希望在仓库中记录一些日志信息,可以使用.gitignore来进行设置

  1. 创建一个名.gitignore的文件,在其中列出待匹配的模式

例子:

img

具体的匹配规则可以查看git文档.

查看已暂存或者未暂存的变更

如果想知道具体的修改内容,而不仅仅是修改的文件的名字,可以使用git diff命令

他解决了

  1. 查看未暂存的更改git diff
    1. 注意这个命令不是显示从上一次提交以来进行的变更,而只是显示还没有进入暂存区的那些变更
    2. 因为进入暂存区的变更将来会被提交到数据库,所以不需要进行特别指明,而还没有进入暂存区的数据下一次不会被提交到数据库中,所以需要进行指明
  2. 查看已暂存的更改git diff --staged
    1. 会比较已暂存文件和上次commit时候文件状态的差异

Git diff 显示了具体添加和删除了那些行.

  1. 如果查看尚未添加到暂存区的变更,可以使用git diff命令,而不需参数

img

命令会对比当前工作目录下的内容和暂存区的内容,对比结果就显示了有那些还没有暂存的新变更.

  1. 如果查看哪些已暂存的内容,可以使用git diff --staged命令,这会对比暂存区中保存的变更和上一次提交的内容

img

提交变更

任何没有进入暂存区的变更都不会进入到提交的内容中.

使用git commit -m "本次提交的备注信息"

img

输出了

  1. 提交到的分支

  2. 校验和f3e1844

  3. 改动的文件个数和源文件新增和删除了多少行的统计信息.

移除文件

首先需要把文件从暂存区中移除,然后再提交.

移除并从工作目录中删除

使用git rm命令:将文件从已跟踪列表移除并提交同时在工作目录中删除这个文件

img

此时这个文件在硬盘上也删除了

从工作目录中删除但没有在git中删除

注意,如果单纯的只是从工作目录中删除了一个文件,而没有使用git rm命令,那么会出现如下输出:

比如删除的是README文件

img

这个时候需要执行git rm 命令,Git才会记录文件的移除状态到暂存区

img

从git移除并不从工作目录删除

使用git rm --cached README

img

只是在git中删除了这个文件,而硬盘上依旧保存这个文件

重命名文件

git mv file_name new_name

给文件重命名

img

实际上,mv命令执行了三个操作

mv README README1

git rm README

git add README1

查看提交历史

git log

  1. 如果只是执行git log命令而不加参数,则输出所有的提交记录,新提交的在前面进行显示

img

常用参数

  1. -p参数,可以同时附带-2参数来查看最近的两次提交

img

  • -p会同时显示出每次提交的差异,即diff

  1. --stat,来查看每个提交的简要统计信息
  • 改动的文件列表

  • 被改动的文件数

  • 新增行

  • 删除行

img

  1. --pretty,更改默认的输出格式
    1. --pretty=oneline,在每一行中显示一个提交.

img

  1. 也可以自己指定输出的格式,

img

具体格式可参考git文档

撤销操作

向前一次commit中添加文件

如果提交之后才发现自己忘了添加某些文件,或者写错了提交信息,可以尝试使用--amend进行重新提交.

git commit --amend

例子

git commit -m "first"

git add second.txt

git commit --amend   

上面代码只会产生一个提交,因为第二次提交修正了第一个提交的结果.

撤销已暂存的文件

如果修改了两个文件,并将两个文件加入到了暂存区,但是本次只想提交其中一个文件的修改

img

提示使用git restore --staged 命令把文件移出暂存区.

img

撤销对文件的修改

修改一个文件以后,如何把他恢复到上一次提交时候的状态?

img

git restore命令来进行撤销