Git - 修改|提交

一、修改之后提交本次更新到仓库。

工作目录下每个文件都不外科两种状态:已跟踪或未跟踪。已跟踪的文件是指那些被纳入了版本控制的文件,在上一次快照中有它们的记录,在工作一段时间后,它们的状态可能处于未修改、已修改或已放入暂存区。初次克隆某个仓库的时候,工作目录中的所有文件都属于已跟踪文件,并处于未修改状态。

编辑过某些文件之后,由于自上次提交后对它们做了修改,Git将它们标记为已修改文件。我们逐步将这些修改过的文件放入暂存区,然后提交所有暂存了的修改,如此反复。所以使用Git时文件的生命周期如下:


文件的状态变化周期
  • 1、查看当前文件状态
    $ git status
    现在创建一个新的 README 文件。如果之前并不存在这个文件,使用git status命令,将会看到一个新的未跟踪的文件。

    当前文件状态

    可以看到新建的 README 文件出现在 Untracked files 下面。未跟踪的文件意味着Git在之前的快照(提交)中没有这些文件;Git不会自动将之纳入跟踪范围。
    除非明明白白地告诉它“我需要跟踪该文件”,这样的处理让你不必担心将生成的二进制文件或其它不想被跟踪的文件包含进来。不过现在需要跟踪管理 README 这个文件。

  • 2、跟踪新文件
    使用命令git add开始跟踪一个文件。所以,要跟踪 README 文件,运行:
    $ git add README
    此时再运行 git status命令,会看到 README 文件已被跟踪,并处于暂存状态,等待提交。
    只要在 Changes to be committed 这行下面的,就说明已暂存状态。如果此时提交,那么该文件此时此刻的版本将被留存在历史记录中。git add命令使用文件或目录的路径作为参数。如果参数是目录的路径,该命令将递归地跟踪该目录下的所有文件。

  • 3、暂存已修改文件
    文件出现在 Changes not staged for commit 这行下面,说明已跟踪文件的内存发生了变化,但还没有放到暂存区。要暂存这次更新,需要运行git add命令。
    git add是个多功能命令:可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还可以用于合并时把有冲突的文件标记为已解决状态等。将这个命令理解为“添加内容到下一次提交中”而不是“将一个文件添加到项目中”要更合适。
    $ git add OC-Demo/Public/ListViewController/ListViewController.m
    现在两个文件都已暂存,下次提交时就会一并记录到仓库。
    假设此时,想要在 ListViewController.m 里再加条注释,重新编辑后,再运行git status查看,会发现 ListViewController.m 会同时出现在暂存区和非暂存区。
    实际上Git只不过暂存了运行git add命令时的那个版本,如果现在提交, ListViewController.m 的版本是最后一次运行git add命令时的那个版本,而不是运行git commit时,在工作目录中的当前版本。所以,运行了git add之后又作了修改的文件,需要重新运行git add把最新版本重新暂存起来。

  • 4、状态简览
    git status命令输入十分详细,但其用语有些繁琐。如果使用git status -sgit status --short命令,将得到一种更为紧凑人格式输出。
    新添加的未跟踪文件前有??标记,新添加到暂存区中的文件前有A标记,修改过的文件前有M标记。出现在右边的红名M表示已修改未暂存,出现在左边的绿色的M表示已修改并已放入暂存区。

  • 5、忽略文件
    一般我们会有些文件无需纳入Git的管理,也不希望它们总是出现在未跟踪文件列表。通常都是些自动生成的文件,比如日志文件,或编译过程中创建的临时文件等。在这种情况下,可以创建一个名为 .gitignore 的文件,列出要忽略的文件模式。
    $ cat .gitignore
    *.[oa]
    *~
    第一行告诉Git忽略所有以 .o.a 结尾的文件。一般这类文件和存档文件都是编译过程中出现的。
    第二行告诉Git忽略所有以 ~ 结尾的文件,许多文本编辑软件(比如 Emacs)都是用这样的文件名保存副本。此外,可能还需要忽略log,tmp,或者pid目录,以及自动生成的文档等等。要养成一开始 就设置好 gitignore 文件的习惯,以名将来误提交这类无用的文件。
    文件 .gitignore 的格式规范如下

    • 所有空行或者以 # 开关的行都会被Git忽略。
    • 可以使用标准的blob模式匹配。
    • 匹配模式可以以 / 开关,防止递归子文件夹。
    • 匹配模式可以以 / 结尾来指定目录。
    • 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号 ! 取反。

所谓的glob模式是指shell所使用的简化了的正则表达式。
星号 * 匹配零个或多个什么问题字符;
[abc] 匹配任何一个列在方括号中的字符 (匹配一个a,匹配一个b,或匹配一个>c);
问号 ? 只匹配一个什么问题字符;如果在方括号中使用短划线分隔两个字符 ,表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配 0 到 9 的数>字。);
使用两个星号 ** 表示匹配什么问题中间目录,比如 a/**/z 可以匹配 a/z ,a/b/z 或 a/b/c/z 等。

.gitignore 例子

# 这是注释,相当于//
*.a               # 忽略所有.a文件
!lib.a            # 按上行,忽略所有.a文件,但lib.a除外
/TODO             # 忽略当前目录中的TODO文件,不包含 subdir/TODO
build/            # 忽略build目录下的所有文件。
doc/*.txt         # 忽略doc目录下的txt文件,不包含子文件夹里的。
doc/**/*.pdf      # 忽略doc目录下的所有pdf文件。包含子文件夹里的。

十分详细的针对数十种项目及语言的 .gitignore 文件列表:
https://github.com/github/gitignore

  • 6、查看已暂存和未暂存的修改
    如果git status 命令输出过于模糊,想知道具体修改了什么地方,可以用git diff命令。
    此命令比较的是工作目录中当前文件和暂存区快照之间的差异,也就是修改后还没有暂存起来的变化内容。
    若要查看已暂存的将要添加到下次提交里的内容,可以用git diff --cached命令。(Git 1.6.1及以上版本,还可以用git diff --staged,效果相同。)
    git diff本身只显示尚未暂存的改动,而不是自上次提交以来所有的改支。所以有时候一下暂存了所有更新过的文件后,运行git diff后会什么也没有。

  • 7、提交更新
    提交之前一定要确认还有什么修改或新建的文件但是还没有git add的。否则提交的时候不会记录这些未暂存的变化修改。先用git status看下,然后再运行git commit进行提交
    $ git commit
    这种方式会启动文本编辑器以便输入本次提交的说明。(默认会启用shell的环境变量$EDITOR所摄影室的软件。也可以使用git config --global core.editor命令来设定指定的编辑软件。)
    另外,可以在commit命令后添加-m选项,将提交信息与命令放在同一行。
    $ git commit -m "fix bug"
    完成提交后,它会告诉显示 ,当前是在哪个分支提交的,本次rjua的完整 sha-1 校验和是什么,以及在本次提交中,有多少文件修改过,多少行添加和删除。

    提交时记录的是放在暂存区的快照。任何还未暂存的仍然保持已修改状态。可以在下次提交时纳入版本管理。每一次运行提交操作,都是对项目作一次快照,以后可以回到这个状态,或者进行比较。

  • 8、跳过使用暂存区。
    使用暂存区域的方式可以精心准备要提交的细节 ,但有时候略显繁琐。Git提供了一个路过使用暂存区域的方式,只要在提交的时候,给git commit加上-a选项,Git就会自动把所有已跟踪过的文件暂存起来一并提交,从而路过git add步骤。

  • 9、移除文件
    要从Git中移除某个文件,就必须 要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交。可以用git rm命令完成此项工作。并连带从工作目录中删除指定的文件,这样以后就不会出现在未跟踪文件清单中了。

    如果只是简单地从目录中手工删除文件,运行git status时就会在 "Changes not staged for commit" 部分(也就是未暂存清单)看到。
    然后运行git rm命令,移除此文件。
    $ git rm README
    下次提交时,该文件就不再纳入版本管理了。如果删之前修改过并且已经入到暂存区的话,则必须 要用强制删除选项 -f (即 force 的首字母)。这是一种安全特性,用于防止误删还没有添加到快照的数据 。这样的数据不能被Git恢复。

    另外一种情况是,我们想把文件从Git仓库中删除,但仍然 希望保留在当前工作目录中。换句话说,想让文件保留在磁盘,但是并不想让Git继续跟踪(移除跟踪)。当忘记添加 gitignore 文件,不小心把一个很大的日志文件或一堆 .a 文件添加到暂存区时。这时就可以用--cached选项。
    $ git rm --cached README
    git rm命令后面可以列表文件或目录的名字,也可以使用 blob 模式,比如
    $ git rm log/\*.log
    星号之前的反斜杠\,因为Git有它自己的文件模式扩展匹配方式,所以我们不用shell来帮忙展开。此命令删除log/目录下扩展名为.log的所有文件(包括子文件夹)。
    $ git rm \*~
    此命令删除以~结尾的所有文件。(包括子文件夹)

  • 10、移动文件
    要改名,可以使用如下命令:
    $ git mv file_from file_to
    其实git mv相当于下面三条命令
    $ mv file_from
    $ git rm file_from
    $ git add file_to

你可能感兴趣的:(Git - 修改|提交)