git学习之基础篇
Git Basics
获取git仓库
- 一般而言,获取git仓库有如下两种方式:
- 将尚未处于版本控制下的本地仓库加入git仓库。
- 从其他地方克隆一个已经存在git仓库。
- 当你有一个尚未处于版本控制的工程目录并且想开始用git进行控制时,首先需要到工程目录下输入git init,该命令将创建一个.git目录记录版本控制信息。之后可以用git add
将需要跟踪的文件放入暂存区。最后使用git commit提交进仓库即可。 - 从远程仓库克隆到本地的命令是git clone
。该命令将在本地创建一个远程仓库的副本。
记录仓库的修改
- 任意时刻,工作目录下的文件可以被分成已追踪和未追踪两种状态。已追踪的文件是存在于上次快照中的文件或者说是git了解的文件(能显示该文件的状态)。未追踪的文件则指目录下的其他文件。
- git追踪的文件有4种状态。分别是Untracked、Unmodified、Modified以及Staged。它们之间的流转可以参见下图:
- 用来确定各个文件状态的常用命令是git status。默认情况下该命令输出当前所在分支、未跟踪的文件以及要提交的变更。
- 要跟踪新文件,需要使用git add
。同时,若一个已经跟踪的文件发生修改也需要使用该命令将修改暂存,等待下一次提交。 - git status显示的信息虽然详细,但是稍微有点冗余。可以使用git status -s来得到一个简化版的输出,输出格式为xx
,前两个字符表示文件暂存区以及当前目录区的状态。常见的字符包括A(添加的新文件),M(已修改),D(删除),R(重命名)。
查看暂存与未暂存的修改
- 当你需要查看已经变化但尚未暂存或者已经暂存但是尚未提交的修改时可以使用命令git diff。默认情况下该命令比较暂存区与工作区的文件的差异来确定修改的内容。
- git diff的输出格式如下:
diff --git a/file1 b/file2
a/file1表示修改文件在git中(暂存区或仓库)的最新版本,b/file1表示该文件在工作区的版本.
index <hash1>..<hash2> mode
hash1 hash2分别对应两个文件的索引,mode记录文件权限相关信息。
--- a/fie1
+++ b/file2
@@ -number1,number2 +number1,number2
表示修改前,+代表修改后。number1表示显示出来的文本片段的行号,number2是显示的行数。
-hello
add this in hello
+insert a line - 若要查看暂存区与仓库区的不同,可以使用命令git diff --staged进行查看。
提交变更
- 使用git commit对暂存区的文件进行一次快照,形成一次提交。
- 使用参数 -m对本次提交进行相关说明。
- 使用参数 -a跳过暂存阶段,直接将所有跟踪的文件提交到仓库。
移除文件
- 从git中移除一个文件需要先移除然后提交。git rm完成前半部分操作。其效果等价于rm file;git add file。之后使用git commit即可。
- 该命令成功执行的前提是仓库区、暂存区、工作区的文件版本一致。这样可以保证可逆性。当文件已修改或者暂存未提交则执行失败。因为这些未提交的版本未被快照,无法回溯。
- 可以使用git rm -f强制删除文件。这意味着作者已经彻底抛弃该文件。
- 使用git rm --cached直接删除暂存区的文件.
- 使用git mv给文件重命名.
查看提交历史
- 可以使用命令git log逆序查看提交记录。默认情况下使用该命令会输出记录的哈希值、作者、提交时间以及提交信息。
- 该命令可以添加许多选项以满足不同需要。-p选项将会在git log输出信息的基础上增加每次提交的patch信息。这在代码复查或快速浏览合作者的一系列时提交非常有用。
- --stat选项会增加一些统计信息。列举出发生改变的文件以及相应增添、删除的次数。
- --pretty选项改变默认的log输出格式。其后可接oneline,short,full,fuller,format等参数,前四个参数的显示信息详略不同。format可以自定义输出信息格式。下面列举了一些格式信息。
%H
: Commit hash%h
: Abbreviated commit hash%T
: Tree hash%t
: Abbreviated tree hash%P
: Parent hashes%p
: Abbreviated parent hashes%an
: Author name%ae
: Author email%ad
: Author date (format respects the --date=option)%ar
: Author date, relative%cn
: Committer name%ce
: Committer email%cd
: Committer date%cr
: Committer date, relative%s
: Subject - --graph选项能以一个小巧的ASCILL图显示分支与合并的历史。
- 下面对一些常用的选项进行总结:
-p
: Show the patch introduced with each commit.--stat
: Show statistics for files modified in each commit.--shortstat
: Display only the changed/insertions/deletions line from the –stat command.--name-only
: Show the list of files modified after the commit information.--name-status
: Show the list of files affected with added/modified/deleted information as well.--abbrev-commit
: Show only the first few characters of the SHA-1 checksum instead of all 40.--relative-date
: Display the date in a relative format (for example, “2 weeks ago”) instead ofusing
: the full date format.--graph
: Display an ASCII graph of the branch and merge history beside the log output.--pretty
: Show commits in an alternate format. Options include oneline, short, full,fuller
: and format (where you specify your own format).--oneline
: Shorthand for --pretty=oneline --abbrev-commit used together. - 如果需要从全部的提交历史中筛选出某些记录,需要用到git log的另一类选项。具体来说,可以按照时间、作者、提交信息以及文件中某关键字次数的改变来筛选。
按照时间可以选参数 --since(--after),--until(--before)。按照作者使用 --author。按照提交信息可以使用 --grep
。按照关键字改变次数则可用参数 --S完成。比如在代码中新加入了一个函数,调用了一个函数都会导致代码中函数名出现次数的改变。这时用 -S可以便捷地知道哪些提交与该函数相关。这类筛选参数总结如下:-<n>
: Show only the last n commits--since
: --after Limit the commits to those made after the specified date.--until
: --before Limit the commits to those made before the specified date.--author
: Only show commits in which the author entry matches thespecified
: string.--committer
: Only show commits in which the committer entry matches thespecified
: string.--grep
: Only show commits with a comm:it message containing the string-S
: Only show commits adding or removing code matching the string
撤销
- 任何时刻,开发者可能需要撤销某些东西。下面会介绍几种常见的撤销操作,这类操作需要格外小心,因为它们是git少数可能会丢失你工作的命令。
- 当你提交过早而少
git add
某些文件,或者提交的文件有错误时,可以使用命令git commit --amend
.该命令使用本次暂存区的修改进行提交以替换掉上次提交。 - 若需要取消暂存某文件,可以使用命令
git reset HEAD filename
。若需要重置修改则可以使用命令git checkout -- filename
。
远程操作
- 为了能在任何git工程上与他人合作,需要了解如何管理远程仓库。与他人合作包括管理远程仓库以及向远程仓库push、pull数据。而管理远程仓库包括了解如何添加、移除远程仓库以及管理各种远程分之并定义是否追踪等等。
- 查看本机远程仓库的配置,可使用命令git remote。该命令将显示所有远程仓库的短名。若需要详细查看,可以使用命令git remote -v。
- 添加远程仓库使用命令git remote add
- 从远程仓库下拉数据可以使用命令git fetch
。该命令从远程仓库拉取本地没有的代码,但不会自动与当前工作的分支进行merge。要拉取并与当前分支merge则需要使用命令git pull。 - 将某个本地分支推送到远程仓库可以使用git push
- 当需要查看某特定远程仓库的信息时可以使用git remote show。
- 为远程分支重命名使用git remote rename
。
打标记
- 当我们需要在仓库的历史版本中标记某些重要的点,就要用到git的tag功能了。对tag的基本动作包括列举出已经存在的标记、如何创建以及删除标记以及标记的类型。
- 列举已经存在的标记比较简单,只需键入git tag(可附带-l或–list)命令即可,结果将以字典序顺序输出。若需要列举出某些特定的标记,则可使用git tag -l “
“ 按照patern进行筛选。patern为bash shell的通配符形式。有关shell的wildcard可参见此文。 - git支持两种类型的标记:轻量级标记(lightweight tag)以及注释型标记(annotated tag)。创建一个注释型标记的格式为git tag -a
-m ,创建完成后可使用git show查看标记数据以及该标记所指向的提交信息。创建一个轻量级标记相对简单,不需要提供-a,-s,或者-m选项。只需要提供一个tag name即可,如git tag v1.0。 - 默认的标记都是指向最近的一次提交,如果需要为以前某次提交做标记,可以在添加标记的命令后加上对应提交的hash值。
- 默认情况下,git push并不传输tags到远程服务器,必须显示地列出要推送的tag。推送某条tag可以使用命令git push
- 若要删除本地的标记,可以使用git tag -d
。要删除远程仓库的标记,则可以使用两种方式。第一种方式为git push :refs/tags/ 。第二种方式为git push–delete 。 - 若要查看某标记所指向版本的文件,可以对该标记做git checkout。注意,当我们检出到该版本后,若要进行某些修改,需要用git checkout -b
别名
- 为了简化某些命令的输入,可以利用git config完成命令的别名设置。其格式为git config –global alias.
。若设置了git config –global alias.unstage ‘reset HEAD – ‘,则git unstage 与其等价。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1686157273@qq.com
文章标题:git学习之基础篇
本文作者:qwqcxh
发布时间:2019-10-11, 20:21:11
最后更新:2019-10-19, 13:31:07
原始链接:http://qaq.github.io/2019/10/11/git基本介绍/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。