0%

Git-基础乱七八糟版

Git 有三种状态:已提交(committed)、已修改(modified)和已暂存(staged)。

  • 已提交表示数据已保存在本地数据库中。
  • 已修改表示修改了文件,但还没保存到数据库中。
  • 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。

Git 仓库目录是 Git 用来保存项目的元数据和对象数据库的地方。 从其它计算机克隆仓库时,拷贝的就是这里的数据。
工作目录是对项目的某个版本独立提取出来的内容。 这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。
暂存区域是一个文件,保存了下次将提交的文件列表信息,一般在 Git 仓库目录中。 有时候也被称作“索引”。

基本的 Git 工作流程如下:

  1. 在工作目录中修改文件。
  2. 暂存文件,将文件的快照放入暂存区域。
  3. 提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。

工作目录下的每一个文件都不外乎这两种状态:已跟踪或未跟踪。
已跟踪的文件是指那些被纳入了版本控制的文件,在上一次快照中有它们的记录,在工作一段时间后,它们的状态可能处于未修改,已修改或已放入暂存区。
工作目录中除已跟踪文件以外的所有其它文件都属于未跟踪文件,它们既不存在于上次快照的记录中,也没有放入暂存区。

进入该项目目录并输入: git init 该命令将创建一个名为 .git 的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件。

使用命令 git add 开始跟踪一个文件,如果参数是目录的路径,该命令将递归地跟踪该目录下的所有文件。
若已跟踪文件的内容发生了变化,但还没有放到暂存区。 要暂存这次更新,需要运行 git add 命令。 这是个多功能命令:可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等。
将这个命令理解为“添加内容到下一次提交中”而不是“将一个文件添加到项目中”要更加合适。

要查看哪些文件处于什么状态,可以用 git status 命令。
使用 git status -s 命令或 git status–short 命令,你将得到一种更为紧凑的格式输出:
新添加的未跟踪文件前面有 ?? 标记,新添加到暂存区中的文件前面有 A 标记,修改过的文件前面有 M 标记。 出现在右边的 M 表示该文件被修改了但是还没放入暂存区,出现在靠左边的 M 表示该文件被修改了并放入了暂存区。

想知道具体修改了什么地方,可以用 git diff 命令。
此命令比较的是工作目录中当前文件和暂存区域快照之间的差异, 也就是修改之后还没有暂存起来的变化内容。
查看尚未暂存的文件更新了哪些部分,不加参数直接输入 git diff。
要查看已暂存的将要添加到下次提交里的内容,可以用 git diff –cached 命令。

提交命令 git commit ,在 commit 命令后添加 -m 选项,将提交信息与命令放在同一行
给 git commit 加上 -a 选项,Git 会把所有已经跟踪过的文件暂存起来一并提交,跳过 git add 步骤。
提交完发现漏掉了几个文件没有添加,或者提交信息写错了。 此时可以运行带有 –amend 选项的提交命令尝试重新提交,如果自上次提交以来你还未做任何修改,那么快照会保持不变,修改的只是提交信息。

1
2
3
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend

从 Git 中移除某个文件,必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交。
可以用 git rm 命令完成此项工作,并连带从工作目录中删除指定的文件,这样以后就不会出现在未跟踪文件清单中了。如果只是简单地从工作目录中手工删除文件,运行 git status 时就会在 “Changes not staged forcommit” 部分(也就是 未暂存清单)看到。

1
$ git rm PROJECTS.md

把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中。 即让文件保留在磁盘,但是并不想让 Git 继续跟踪,使用 –cached 选项。rm 命令后面可以列出文件或者目录的名字,也可以使用 glob 模式。

1
$ git rm log/\*.log

使用 git reset HEAD … 来取消暂存(修改了两个文件并且想作为两次独立的修改提交,却意外地输入 git add * ,取消暂存两个中的一个)。

git checkout – … 撤消修改,

运行 git mv 就相当于运行了下面三条命令:

1
2
3
$ mv README.md README
$ git rm README.md
$ git add README

git log 会按提交时间列出所有的更新,包括每个提交的 SHA-1 校验和、作者的名字和电子邮件地址、提交时间以及提交说明。
-p 用来显示每次提交的内容差异。–stat 选项列出所有被修改过的文件、有多少文件被修改了以及被修改过的文件的哪些行被移除或是添加。

查看已经配置的远程仓库服务器,运行 git remote 命令。
运行 git remote add 添加一个新的远程 Git 仓库。
从远程仓库中获得数据,可以执行 git fetch [remote-name],这个命令会访问远程仓库拉取你还没有的数据。 执行完成后,你将会拥有那个远程仓库中所有分支的引用。注意其并不会自动合并。

如果有一个分支设置为跟踪一个远程分支,可以使用 git pull 命令来自动的抓取然后合并远程分支到当前分支。
默认情况下,git clone 命令会自动设置本地 master 分支跟踪克隆的远程仓库的 master 分支。
运行 git pull 通常会从最初克隆的服务器上抓取数据并自动尝试合并到当前所在的分支。

推送到远程仓库:git push [remote-name] [branchname]。只有当你有服务器的写入权限,并且之前没有人推送过时,这条命令才能生效。 当你和其他人在同一时间克隆,他们先推送到上游然后你再推送到上游,你的推送就会毫无疑问地被拒绝。 你必须先将他们的工作拉取下来并将其合并进你的工作后才能推送。

运行 git remote rename 去修改一个远程仓库的简写名。移除一个仓库使用 git remote rm。

使用 git show tagname 命令可以看到标签信息与对应的提交信息。

附注标签是存储在 Git 数据库中的一个完整对象。 它们是可以被校验的;其中包含打标签者的名字、电子邮件地址、日期时间;还有一个标签信息;并且可以使用 GNU Privacy Guard (GPG)签名与验证。
创建附注标签:git tag -a,使用 -m 选项指定一条存储在标签中的信息。

1
$ git tag -a v1.4 -m "my version 1.4"

轻量标签本质上是将提交校验和存储到一个文件中,创建时不需要任何选项。
后期打标签要在命令的末尾指定提交的校验和(或部分校验和)。

默认情况下 git push 不会传送标签到远程仓库服务器上,运行 git push origin [tagname],使用 –tags 选项传送所有不在服务器上的标签。

删除本地仓库上的标签,使用命令 git tag -d ,但并不会从任何远程仓库中移除这个标签,必须使用 git push :refs/tags/ 来更新远程仓库。

想查看某个标签所指向的文件版本,可以使用 git checkout 命令。