git版本管理操作步骤,git版本管理规范
一些基本概念分布式版本控制系统Git是一个分布式版本控制系统(DVCS)。在这个系统中,客户端并不是简单的拉取文件的某个版本,而是将文件版本的整个数据库(也就是整个代码仓库)克隆到本地系统。这样,任何一起工作的服务器都可以在故障后用任何镜像的本地仓库进行恢复。因为每一次克隆工作实际上都是代码库的完整备份。
存储模式Git中的所有数据在存储前都会用校验和进行计算,然后会用校验和引用文件的某个版本。此校验和是使用SHA-1哈希算法根据文件的内容或目录结构计算的,例如:
4b 9 da 6552252987 aa 493 b 52 f 8696 CD 6 d3b 00373存储在Git数据库中的信息由文件内容的哈希值而不是文件名进行索引。
关于三种状态下的Git,最重要的是有三个区域:
Git 仓库:
这是存储各种文件版本的数据库。可以从这个数据库中拉取各种文件版本,也可以将更新的文件推送到数据库中进行记录。这是Git保存项目元数据和对象数据库的地方,也是Git最重要的部分。从其他计算机克隆仓库时,复制到这里的数据是相同的。已推入此数据库的文件的相应状态为已提交 (commited)
。暂存区域:
这个区域用来存放目前已经修改过的文件,并标有版本。所有在同一时间段内没有提交到临时存储区的文件都属于同一个当前版本,这些标记使得相应的文件被包含在下一个提交的快照中。该区域是保存下次将提交的文件列表
信息的文件,通常位于Git 仓库
目录中。该区域的文件状态为已暂存 (staged)
。工作目录:
这个区域是开发者写代码的地方。已修改并保存的文件将存储在此区域,等待转移到临时存储区并提交。它是从项目的某个版本中独立提取出来的内容。那些从Git warehouse的压缩数据库中提取出来的文件放在这个区域所在的磁盘上,供你使用或修改。该区域的文件状态为已修改 (modified)
。Git work trilogy修改工作目录中的文件;将修改文件对应的文件快照上传到临时存储区。提交,在临时存储区中找到文件,并将快照永久存储在Git仓库目录中。常用命令配置用户名和密码$ git config-global user . name jack cheng $ git config-global user . email 767833640 @ QQ . com 如果使用-global选项,命令只需要提交一次。无论你以后在系统中执行什么操作,Git都会使用这个配置。如果要对特定项目使用不同的用户名和邮箱,可以通过在该项目目录中运行不带- global选项的命令来进行配置。
检查配置信息$ Git config - list检查特定项目的配置$ Git config user.name获取帮助$ git help config$ git help push创建存储库$ git init此命令将创建一个名为。git,它包含初始化的git存储库中所有必需的文件。这些文件是git存储库的主干。但这只是一个初始化操作,本地文件夹中的项目中的文件并没有被跟踪。使用Git add命令跟踪文件,使用git commit命令将文件提交到本地Git存储库。
检查status $ git status,查看当前仓库中哪些文件处于未跟踪状态,哪些文件已经放入临时存储区等待提交。
你可以看到。DS_Store文件位于Untracked files标题下,表明该文件是新创建的未跟踪文件,Git存储库中没有关于该文件的信息。
你可以看到此时。gitignore文件位于待提交变更的标题下,表示该文件已经被移动到临时存储区,处于临时存储状态。
将修改过的或未被跟踪的文件放入临时存储区$ git add文件名git add不仅可以跟踪新文件并将其放入临时存储区,还可以将修改过的文件放入临时存储区。这是一个多功能命令。这些放在临时存储区的文件将在下次提交时从010到59000提交到Git仓库。因此,git add命令的最佳翻译是“将内容添加到下一次提交”。
$ git添加文件目录此时,git add命令会递归跟踪该目录下的所有文件,并将该目录下的所有文件放入临时存储区。
检查已经临时存储的文件和当前工作目录中的文件之间的差异$ git diff git diff命令可以检查当前工作目录中已修改的文件和临时存储区中的文件之间的差异(注意,这只是与临时存储区的差异,而不是自上次提交以来的差异,所以如果将所有已修改的文件添加到临时存储区,git diff不会返回任何内容)
检查临时存储的文件和上次提交的文件的更改,$ git diff - staged或$ git diff-cache。提交临时存储区$ git commit -m 中的所有文件,说明你目前做了什么,以后回滚版本的时候可以很容易的找到。”注意,所有提交的文件都放在
一并
中,每个提交的版本都会记录在历史记录中。(只有提交后的版本才能回滚)回到过去,$ git log使用git log命令查看历史提交记录:
$ gitlog-pretty=online为了简化查看,可以使用gitlog-pretty=online参数:
$ Git reset - hard commit_id找到要回滚的版本的前一个commit_id,然后使用Git reset - hard commit_id命令回滚到需要的版本。只需键入commit _ id的前几个字母,git就会自动找到对应的id:
可以看到项目的最新版本此时已经回滚到3950d的版本。
$ git reflog从过去回滚到现在后,我们会发现最新版本9fd77已经不在git log的目录下了。如果我们想回到最新的版本呢?首先,使用git reflog命令查找提交9fd77时的记录:
Git reset - hard commit_id我们可以看到回滚前我们提交的最新commit_id是9fd77b1,所以我们使用git reset - hard 9fd77b1输入回滚前的最新版本:
所以,我们会从过去回到现在。
某招忽略文件有时候我们会有一些不需要纳入Git管理的文件,比如上面的。DS_Store。这时候我们要写一个. gitignore文件,列出Git仓库要忽略的文件模式。本文件的格式规范如下:
对以#开头的行为Git的注释。
在文件名的开头使用/例如
TODO会忽略Git warehouse中所有目录下的TODO文件,但是如果只希望Git忽略当前目录下的TODO文件,而不忽略其他目录下的TODO文件,那么应该这样写:
在文件名末尾使用/TODO/表示这个文件是一个目录,Git会忽略这个目录中的所有文件。
如果想让Git只记录一个特定的文件,忽略除了这个以外的所有文件,可以在这个文件名前面使用!倒置。但该功能一般用于以下情况:
#全部忽略。a文件*。a#但是所有的lib.a文件都不能忽略!Lib.a指定文件的格式通常应使用正则表达式:
*匹配0个或更多任意字符;【abc】可以匹配箱号中
暂存区
的任意字符(本例中要么是A,要么是B,要么是C);仅匹配一个任意字符;[0-9]表示匹配0到9范围内的所有数字。使用两个星号* *匹配任何中间目录。例如,learn/**/git可以匹配learn/git、learn/no/git或learn/no/python/git。看一个. gitignore文件的例子:#忽略所有以结尾的文件。a *。a#你不能忽略所有的lib.a文件!Lib.a#只忽略当前目录中的TODO文件/TODO#忽略生成目录中的所有文件。build/#忽略所有。doc目录下的txt文件doc/*。txt#全部忽略。doc目录(包括子目录)下的pdf文件doc/**/*。移除文件最常见的情况是,在。Gitignore文件。有时候为了贪图效率,我们用Git add。将所有文件放在临时存储区,包括一些不想在git版本管理中管理的日志文件。这时候我们希望可以把这些不想被管理的文件从临时存储区中删除,而让这些文件仍然存储在工作目录中,不被git跟踪。此时,可以使用gitrm-cached filename命令:
通过这种方式,可以将错误添加的文件从临时存储区中删除,从而防止它们在下一次提交时被添加到Git存储库中。
还有一种情况是我要删除的文件已经提交或者添加了,也就是已经被跟踪了,但是我想彻底删除这个文件,也就是删除工作目录中的这个文件。此时,我们可以先删除本地项目目录中的这个文件,然后使用git rm filename命令从跟踪文件列表中删除这个文件:
情况是这个文件已经添加但没有提交,直接用git rm命令清空。如果文件之前已提交,并且您从工作目录中删除了要删除的文件:
可以看到,删除文件的操作被记录在Changes not staged for commit的标题下,这意味着你需要再次提交这个被删除的操作,这样Git库就知道这个文件已经被删除了,不应该再被跟踪。
移动文件如果想重命名Git中的一些文件,可以使用git mv original_name target_name命令:
执行此命令后,可以看到工作目录中的test.cpp此时也被重命名为main.cpp,只需提交重命名操作即可。
参考Pro git廖雪峰git教程