欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Git基本知识-基本操作

程序员文章站 2024-03-08 15:54:40
...

Git基本知识-记录本地库中文件改变

在本地库的文件都可以归为两种状态:tracked或者untracked。tracked文件即已通过git add命令所添加过的文件,它们可以有三种状态:unmodified、modified或者staged;Untracked文件即除tracked文件外的文件。当你的本地Git库为新克隆的库时,那么此库中所有的文件都是tracked和unmodified文件,因为git只检查tracked状态的文件。

当你编辑tracked状态的文件的文件时,Git将其状态变更为modified,Git暂存这些已修改的文件,在随后的commit中将所有暂存的(staged)文件提交,如下图所示:

Git基本知识-基本操作

查看库中文件的状态

查看库中文件状态使用git status命令。

如果是在新克隆的库中运行如下:

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

意思是你的工作目录很干净,换句话说,你库中tracked状态的文件没有改变的。此命令告诉了你你当关所在的是哪个分支,并且通知你你当前库中文件与服务上文件是没有不同的。

然后在此本地库中添加一个文件然后运行git status命令如下:

$ echo 'My Project' > README
$ 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)

    README

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

你可以看到新建的README文件为untracked。

tracking 新的文件

为了使Git追踪一个新的文件,首先需要git add命令。如下:

$ git add README

然后此时我们运行git status命令如下:

$ 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:README

注:git add 命令既可以是文件,也可以是目录,如果是目录,则递归添加目录中所有的文件。

暂存已修改的文件

当我们改变一个tracked状态的文件时,假如文件就叫做lisi.txt,那么我们运行git status命令:

$ 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:   README

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

    modified:   lisi.txt

lisi.txt文件出现在名字叫作“Changes not staged for commit”的区域,意味着此被追踪的文件在工作目录中已经被修改,但是还没有staged(被暂存)。想要暂存则需要运行git add命令。git add 命令是一个多功能命令,可以用于tracking新的文件,stage(暂存)文件,或者标记合并时有冲突的文件为已解决文件等。git add命令可以这样解释:添加这些内容以便下次提交,而不是添加这个文件到项目中去。然后我们执行git add 命令后再执行git status命令如下:

$ git add lisi.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:   README
    modified:   lisi.txt

现在这两个文件都被暂存以便下次一起提交。现在如果我们对lisi.txt再次改变,然后运行git status如下:

$ vi lisi.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:   README
    modified:   lisi.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:   lisi.txt

见鬼?现在list.txt文件同时处于staged和unstaged的状态,这怎么可以呢?这表明了git在暂存文件(即将文件放入暂存区域)时git add命令运行时是什么样子暂存到暂存区域的文件就是什么样子。如果你现在提交,那么lisi.txt文件的版本则是暂存区域中的文件版本,而不是工作目录中的lisi.txt文件版本,即最后一次git add命令时暂存区域中的文件版本。所以,当你git add命令运行后又改变了暂存区域中的文件时,需要再次运行git add命令:

$ git add lisi.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 unstaged)

    new file:   README
    modified:   lisi.txt

Short Status

尽管git status命令的输出非常合理,但是也太哆嗦,git 还支持一种更紧凑的方式查看文件状态,运行git status -s 或者 git status –short命令即可:

$ git status -s 
A   README
M   lisi.txt
??  zhaoliu.txt

??表示untracked状态的文件;A表示新增的添加到staged区域的文件;M 表示已修改的文件,如果M与左边?对齐表示添加到staged区域,反之则尚未添加到;MM则表示已修改的文件暂存到staged区域后又发生了修改。

Ignoring Files

通常,总有一些文件我们不愿意它们被git管理,甚到不愿意看到它们,比如日志文件或者构建工具生成的文件,这时你可以创建一个叫做.gitignore的文件,在文件中列出过滤规则即可。过滤规则可简单如下:

$ cat .gitignore
*.[oa]
*~

第一条规则告诉git忽略任何以.o和.a结尾的文件,第二条规则则表示忽略所有以~结尾的文件。

过滤规则使用shell使用的简化正则表达式,表示匹配0个或者多个字符,[]表示匹配其中的任意一个,?表示匹配单一字符,*表示可匹配嵌套目录等等。如果开头为#,表示过滤规则的注释,等同空行;如果以!开头,表示取反等等,且看如下一例:

# 忽略以.a结尾的文件
*.a

# 即使上面规则,也不忽略此文件
!lib.a

# 仅忽略当前目录下的TODO文件,不忽略当前目录下子目录中的TODO文件
/TODO

# 忽略build目录下的所有文件
build/

# 忽略doc目录下所有以.txt结尾的文件,但不忽略其子目录下的.txt文件、
doc/*.txt

# 忽略doc目录下所有以.pdf目录结尾的文件,包括其子目录中的
doc/**/*.pdf

查看Staged状态文件与Unstaged状态文件的改变

使用git status命令可以让你查看哪些文件改变,但是要查看文件改变的内容需要使用git diff命令。

如果要查看尚未暂存到暂存区的文件改变,直接输入git diff:

$ git diff 
diff --git a/wangwu.txt b/wangwu.txt
index e69de29..99387b0 100644
--- a/wangwu.txt
+++ b/wangwu.txt
@@ -0,0 +1 @@
+zhangsanlisiwangbadan

此时比较的是你目录中的文件与staged区域中的文件改变,如果运行git diff –staged或者git diff –cached命令,则比较的则上上次提交后与暂存区中文件的不同。

Committing Your Changes

提交改变使用git commit命令,如果不带参数运行则提示输入备注信息然后提交,如果添加-m

删除文件

如果仅仅是在目录中删除文件,那么被删除文件不会被暂存,即在然后运行git commit时删除操作是不会被提交的,需要先使用git add添加到暂存区,然后再运行git commit,或者需要直接运行git commit -a 才可提交删除操作。如下:

$ rm lisi.txt
$ git status
On branch master
Changes not staged for commit:
    (use "git add/rm <file>..." to update what will be committed)
    (use "git checkout  --<file>..." to discard changes in working directory)

    deleted:    lisi.txt

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

    deleted:    lisi.txt

$ git commit -m "then the delete operation is committed"

别外或直拉使用git提供的git rm 命令可直接将删除变理暂存暂存区:

  • 如果同时删除目录中文件:git rm

Moving Files

git mv 命令可用于移动文件,在git中认为为rename,即重命名。用法如下:

$ git mv file_from file_to

git mv README.MD README执行相当于执行如下操作:

$ mv README.MD README
$ git rm README.MD
$ git add README