Git使用教程二

本文继续记录Git的使用,重点介绍3个命令,它们分别是git add,git commit,git branch。针对每一个命令的使用,在文中都会借助于具体的操作示例演示一下。文中所介绍的3个命令,是非常基础也是经常使用的命令,不需要刻意去记忆,平常使用多了自然就记住了。

git add

git add命令时将工作区内容添加到索引index,或者说将更改添加到暂存区stage,以准备下一次提交分段的内容。平常开发中,如果不出现什么异常场景,如冲突,一般使用git命令提交的次序为:add,commit,push,add是将更改保存到本地暂存区,commit是将更改保存到本地Git仓库中,push是将当前分支的提交推送至远程仓库。

git add [--verbose | -v] [--dry-run | -n] [--force | -f] [--interactive | -i] [--patch | -p]
	  [--edit | -e] [--[no-]all | --[no-]ignore-removal | [--update | -u]]
	  [--intent-to-add | -N] [--refresh] [--ignore-errors] [--ignore-missing] [--renormalize]
	  [--chmod=(+|-)x] [--] [<pathspec>…​]

只有使用了add命令才会将文件纳入Git版本库的管理,然后使用git对这些文件进行跟踪。

add基本用法

git add -u [<path>]: 把<path>中所有跟踪文件中被修改过或已删除文件的信息添加到索引库,但是不包括新增的文件。省略<path>表示 . ,即当前目录。如果不特殊说明,.gitignore中添加的文件也会被自动忽略,不会被提交至暂存区

git add -A [<path>]:表示把[<path>]中所有跟踪文件中被修改过或已删除文件和所有新增的文件信息添加到暂存区。省略<path>表示 . ,即当前目录。注意这里的A是大写的。

git add .:表示将当前目录的所有被修改和所有新增的文件添加到索引库。

git add *:表示将当前目录的所有被修改和所有新增的文件添加到索引库。但是会有如下一条提示语:

$ git add *
The following paths are ignored by one of your .gitignore files:
localConfig.txt
Use -f if you really want to add them.

git add的规则跟git的版本有关系,所以开发中不建议使用git add *命令提交。在本次所有演示git使用的示例,git版本是 2.21.0.windows.1。

git status命令用于显示工作目录和暂存区的状态。使用此条命令可以看到工作目录哪些文件被更改了,哪些文件已经存放至暂存区了。在Git Base窗口中,一般已更改或者新增的还未提交至暂存区的文件会显示为红色,已经存放至暂存区的文件显示为绿色。

如果在工作目录有文件更改,但是还未add至暂存区,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

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        sub/

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

从git给出的提示命令可知道,git add后面是可以跟随多个文件的。不仅如此,一般命令行操作还支持正则表达式操作,Git命令也不例外。

# 将包含来自sub/目录和子目录的文件添加到暂存区。
$ git add sub/*.txt

# 将以Hello结尾的文件的所有修改添加到暂存区。
$ git add *Hello    

# 将所有以Hello开头的文件的修改添加到暂存区 如:HelloWorld.txt,Hello.java,HelloGit.txt ...
$ git add Hello*  

# 将以Hello开头后面只有一位的文件的修改提交到暂存区 如:Hello1.txt,HelloA.java   
# 如果是HelloGit.txt或者Hello.java是不会被添加的
$ git add Hello?    

# 将所有当前目录的符合git-*.sh的文件提交是暂存区,如git-base.sh,git-cmd.sh ...
$ git add git-*.sh
git add -i [<path>]:用于查看中被所有修改过或已删除文件但没有提交的文件,同时进入一个子命令系统。

$ git add -i
           staged     unstaged path
  1:    unchanged        +9/-1 readme
  2:        +0/-0      nothing sub/sub01.txt
  3:        +0/-0      nothing sub/sub02.txt

*** Commands ***
  1: status       2: update       3: revert       4: add untracked
  5: patch        6: diff         7: quit         8: help
What now>

git add命令只能查看已经add至暂存区的文件。上面输出表示,readme文件已经添加至暂存区,但是被更改了,还没有将更改后的文件提交至暂存区。而sub目录下的文件sub01.txt和sub02.txt已经被添加至暂存区,待commit。

已经add至暂存区的文件,如果使用git log是查不到记录的,git log是用于显示提交记录的日志信息。但是可以使用git ls-files [-s | --stage]或者git ls-files [-c | --cached]查看所有已经在暂存区的所有文件,这里查询的文件包括已经提交至Git仓库的文件。

$ git ls-files --stage
100644 29f019e76999603266c09715b7f8bec240445350 0       .gitignore
100644 1f0bbf20eed2c5dc17a0fbfd72729d11a0156a59 0       MainTest.java
100644 baaefe98c5dca2930504fabebcc27107522456ba 0       readme
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       sub/sub01.txt
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       sub/sub02.txt

git commit

git commit是将暂存区的文件提交是Git仓库,它还会将用户信息和日志消息一起存储在新的提交中。

git commit [-a | --interactive | --patch] [-s] [-v] [-u<mode>] [--amend]
	   [--dry-run] [(-c | -C | --fixup | --squash) <commit>]
	   [-F <file> | -m <msg>] [--reset-author] [--allow-empty]
	   [--allow-empty-message] [--no-verify] [-e] [--author=<author>]
	   [--date=<date>] [--cleanup=<mode>] [--[no-]status]
	   [-i | -o] [-S[<keyid>]] [--] [<file>…​]

Git每次提交代码,都要写Commit message(提交说明),否则就不允许提交。

如果在某次提交中,没有添加提交说明,git会提示本次提交失败。

$ git commit
Aborting commit due to empty commit message.

git commit添加提交说明有两种方式,一种是直接执行git commit命令后,会弹出一个自己配置的文本编辑器,要求输入本次提交说明。另外一种就是直接使用git commit -m 'xxxxx'将命令和提交说明在一起执行。

$ git commit -m "the commit message"

在使用git commit命令时提交时,首先需要确定待commit的文件是否已经存在于暂存区了,如果还没有提交至暂存区,需要首先执行add命令提交至暂存区。如果该文件已经被Git纳入了版本库管理中,那么这时候有一个快捷命令,会先把所有已经track的文件的改动先add进来,然后提交(有点像svn的一次提交,不用先暂存)。

$ git commit -a

在进行提交时,还有一种命令增补提交,会使用与当前提交节点相同的父节点进行一次新的提交,旧的提交将会被取消。

$ git commit --amend #增补提交

假设目前有如下几种提交。

$ git log
commit a757055ba9790281b78f5421768b12bf8062af1b (HEAD -> master)
Author: Mike <mike@git.com>
Date:   Sun Aug 25 09:07:19 2019 +0800

    测试commit -a

对readme文件进行更改后,直接使用commit命令提交,而不是使用增补提交的方式,提交日志记录如下:

$ git log
commit 6853eda5aa638db481329859717da1ff71d87d6c (HEAD -> master)
Author: Mike <mike@git.com>
Date:   Sun Aug 25 09:17:46 2019 +0800

    readme文件commit提交

commit a757055ba9790281b78f5421768b12bf8062af1b
Author: Mike <mike@git.com>
Date:   Sun Aug 25 09:07:19 2019 +0800

    测试commit -a

很明显上述日志多了已提交6853eda5aa638db481329859717da1ff71d87d6c的提交,再次对readme文件更改,然后使用增补提交的方式,提交记录如下:

$ git log
commit 26ed9aa703d194df374eb1dc6e6aa58fde3c72af (HEAD -> master)
Author: Mike <mike@git.com>
Date:   Sun Aug 25 09:17:46 2019 +0800

    readme文件commit --amend增补提交

commit a757055ba9790281b78f5421768b12bf8062af1b
Author: Mike <mike@git.com>
Date:   Sun Aug 25 01:07:19 2019 +0800

    测试commit -a

使用增补提交后,这时候提交记录总次数并没有新增,但是最后一次提交记录的commit id已经有变化了,现在提交记录为26ed9aa703d194df374eb1dc6e6aa58fde3c72af。

git branch

git branch命令用于罗列、创建或者删除分支。

git branch [--color[=<when>] | --no-color] [-r | -a]
	[--list] [-v [--abbrev=<length> | --no-abbrev]]
	[--column[=<options>] | --no-column] [--sort=<key>]
	[(--merged | --no-merged) [<commit>]]
	[--contains [<commit]] [--no-contains [<commit>]]
	[--points-at <object>] [--format=<format>] [<pattern>…​]
git branch [--track | --no-track] [-f] <branchname> [<start-point>]
git branch (--set-upstream-to=<upstream> | -u <upstream>) [<branchname>]
git branch --unset-upstream [<branchname>]
git branch (-m | -M) [<oldbranch>] <newbranch>
git branch (-c | -C) [<oldbranch>] <newbranch>
git branch (-d | -D) [-r] <branchname>…​
git branch --edit-description [<branchname>]

git branch在罗列分支时,当前分支会以*突出显示。

查看当前有哪些分支

$ git branch
* dev
  dev01
  master

上述显示中有3个分支,当前在dev分支上。

查看远程哪些分支

$ git branch --remote
  origin/HEAD -> origin/dev
  origin/dev
  origin/master

上述显示了2个远程分支,远程分支显示时会有orgin标识。origin/HEAD指向的是默认分支,表示在远程仓库上dev是默认分支。

查看所有分支

$ git branch -a
* dev
  dev01
  master
  remotes/origin/HEAD -> origin/dev
  remotes/origin/dev
  remotes/origin/master

上述显示了5个分支,3个本地分支,2个远程分支。

新建一个分支

$ git branch dev02

上面命令新建了一个dev02的本地分支。

$ git branch
* dev
  dev01
  dev02
  master

修改分支名称

$ git branch -m dev02 master01
$ git branch
* dev
  dev01
  master
  master01

删除本地某个分支

$ git branch -d dev02
Deleted branch dev02 (was 5bcc944).

在删除分支时,有一点需要注意,当前所在的分支不能是待删除的分支。

有关删除远程分支和更改远程分支的内容,在介绍git push内容时再做示例演示。

小结

本文重点介绍了Git使用过程中的最常用的3个命令,它们分别是git add,git commit,git branch,这3个命令的使用并没有太大的难点,只需要会使用即可。真正复杂的操作会在后续文章中再做介绍,开发中时常需要考虑的是各种异常场景,Git的使用也不例外,比如,如果出现了冲突怎么办?如果某次提交发现引发了更大的问题,这时候如何回退?如何查看本次提交的差异内容等等。

参考资料

Git教程

Git Community Book 中文版

评论

您确定要删除吗?删除之后不可恢复