git基础
Posted 天际凯迪
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了git基础相关的知识,希望对你有一定的参考价值。
一、 获取git仓库 :两种方法
第一种:在现有项目或目录下导入所有文件到git中
1.在终端进入项目目录 cd ..
运行git init 来初始化git仓库
2.在已经存在文件的文件夹中初始化git仓库
git Add *.C
git Add License
git Commit -M "Initial Project Version"
git add命令用来实现对指定文件的跟踪,然后执行git commit提交
第二种:从服务器克隆一个现有的git仓库
git clone https://github.com/woailuo2015/git.git
二、记录每次更新到仓库
1.工作目录下的给个文件只有两种状态:已跟踪或未跟踪
已跟踪的文件:指被纳入版本控制的文件,在上一次快照中有他们的记录,在工作一段时间后,他们的状态可能处于未修改,已修改或已放入缓存区。
未跟踪的文件:除了已跟踪的文件之外的其他文件都是未跟踪的文件,它们即不存在于上次快照的记录中,也没有存放暂存区。
初次克隆某个仓库的时候,工作目录中的所有文件都是属于已跟踪文件,并处于未修改状态。
2.检查当前文件状态
git status -s
新添加的未跟踪文件前面有??标记
新添加到暂存区中的文件前面有A标记
修改过的文件前面有M标记(M有两个可以出现的位置:
右边的M表示该文件被修改了但是没有放到暂存区,
左边的M表示该文件被修改了并放到了暂存区)
3.
跟踪新文件 git add
暂存已修改文件 git add
在提交commit 文件之前,不管你修改多少次这个文件,最后提交的都是你最后git add的这个文件(最新的文件)
4.忽略文件:cat .gitignore
我们创建一个 .gitignore文件,在里面列出要忽略的文件模式。
文件 .gitignore的格式规范如下:
所有空行或者以#开头的行都会被git忽略;
可以使用标准的glob模式匹配;
匹配模式可以以(/)开头防止递归;
匹配模式可以以(/)结尾指定目录;
要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反;
GitHub 有一个十分详细的针对数十种项目及语言的 .gitignore 文件列表,你可以在 https://github.com/github/gitignore 找到它.
3.查看已暂存和未暂存的修改
git diff
此命令比较的是工作目录中当前文件和暂存区快照之间的差异,也就是修改之后还没有暂存起来的变化内容。
git diff --cached
git diff --staged
这两个命令效果相同
4.提交更新git commit
每次准备提交前,先用git status看一下是不是都已经暂存起来了,被一切修改过的或者新建的文件都git add过,就可以提交了。
git commit -m " 内容"
这个命令可以提交信息
提交后它会告诉你,这次提交中有多少文件修改过,多少行添加和删除过。
请记住:提交时记录的是放在暂存区的快照。任何还未暂存的仍然保持已修改状态,可以在下次提交时纳入版本管理。每一次运行提交操作,都是对你项目做一次快照,以后回到这和状态,或者进行比较。
5.跳过使用暂存区域
git commit -a
尽管使用暂存区的方式可以精心准备要提交的细节,但是有时候这么做略显繁琐。所以Git提供了一个跳过使用暂存区域的方式,只要在提交的时候,给git commit 加上-a选项,git就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过git add步骤;
6.移除文件
git rm
这个命令后面可以列出文件或者目录的名字
git rm --cached
这个命令作用:移除git仓库中的文件,也就是让文件保存在磁盘,但是不想让git继续跟踪。
7.移动文件
重命名:在git中对文件改名,可以这么做:
git mv file_from file_to
实际运行git mv file_from file_to命令就相当于运行了下面三条命令:
mv file_from file_to
git rm file_from
git add file_to
8.查看提交历史 git log
默认不用任何参数的话,git log 会按提交时间列出所有的更新,最近的更新排在最上面。
git log -p -2
用来显示每次提交的内容差异
git log --stat
可以看到每次提交的简略的统计信息
git log --pretty=oneline 或者short 或者full 或者fuller
指定使用不同于默认的方式展示提交历史
git log --pretty=format:"%h - %an, %ar : %s"
可以定制要显示的记录格式。
git log --pretty=format常用的选项列出了常用的格式占位符写法及其代表的意义。 Table 1. git log --pretty=format 常用的选项
选项 |
说明 |
%H |
提交对象(commit)的完整哈希字串 |
%h |
提交对象的简短哈希字串 |
%T |
树对象(tree)的完整哈希字串 |
%t |
树对象的简短哈希字串 |
%P |
父对象(parent)的完整哈希字串 |
%p |
父对象的简短哈希字串 |
%an |
作者(author)的名字 |
%ae |
作者的电子邮件地址 |
%ad |
作者修订日期(可以用 --date= 选项定制格式) |
%ar |
作者修订日期,按多久以前的方式显示 |
%cn |
提交者(committer)的名字 |
%ce |
提交者的电子邮件地址 |
%cd |
提交日期 |
%cr |
提交日期,按多久以前的方式显示 |
%s |
提交说明 |
你一定奇怪 作者 和 提交者 之间究竟有何差别, 其实作者指的是实际作出修改的人,提交者指的是最后将此工 作成果提交到仓库的人。 所以,当你为某个项目发布补丁,然后某个核心成员将你的补丁并入项目时,你就是 作者,而那个核心成员就是提交者。 我们会在 分布式 Git 再详细介绍两者之间的细微差别。
Table 2. git log 的常用选项
选项 |
说明 |
-p |
按补丁格式显示每个更新之间的差异。 |
--stat |
显示每次更新的文件修改统计信息。 |
--shortstat |
只显示 --stat 中最后的行数修改添加移除统计。 |
--name-only |
仅在提交信息后显示已修改的文件清单。 |
--name-status |
显示新增、修改、删除的文件清单。 |
--abbrev-commit |
仅显示 SHA-1 的前几个字符,而非所有的 40 个字符。 |
--relative-date |
使用较短的相对时间显示(比如,“2 weeks ago”)。 |
--graph |
显示 ASCII 图形表示的分支合并历史。 |
--pretty |
使用其他格式显示历史提交信息。可用的选项包括 oneline,short,full,fuller 和 format(后跟指定格式)。 |
9.限制输出长度
git log --since=2.weeks 显示最近两周内的提交
git log --author 显示指定作者的提交
git log --grep 搜索提交说明中的关键字
如果只关心某些文件或目录的历史提交,可以在git log选项的最后面指定他们的路径。因为是放在最后位置的选项,所以用两根短划线(--)隔开之前的选项和后面限定的路径名。
Table 3. 限制 git log 输出的选项
选项 |
说明 |
-(n) |
仅显示最近的 n 条提交 |
--since, --after |
仅显示指定时间之后的提交。 |
--until, --before |
仅显示指定时间之前的提交。 |
--author |
仅显示指定作者相关的提交。 |
--committer |
仅显示指定提交者相关的提交。 |
--grep |
仅显示含指定关键字的提交 |
-S |
仅显示添加或移除了某个关键字的提交 |
10.撤销操作
git commit --amend
你提交后发现忘记了暂存某些需要的修改,可以向下面这样操作:
$ git commit -m ‘initial commit‘
$ git add forgotten_file
$ git commit --amend
最终你只会有一个提交:第二次提交将代替第一次提交的结果。
接下来要演示如何操作暂存区域与工作目录中已修改的文件。
这些命令在修改文件状态的同事,也会提示如何撤销操作。
11.取消暂存的文件
git reset
12.撤销对文件的修改
如果你不想保留对某个文件的修改,如何方便地撤销修改并将它还原成上次提交时的样子,
git checkout -- 某文件
这个是一个危险的命令,除非你确定不要这个文件了,否则不要使用这个命令。
如果你仍然想保留对这个文件作出的修改,但是现在仍然需要撤销,我们将会在git分支介绍保存进度与分支;这些通常是更好的做法。
记住:在git中任何已提交的东西几乎总是可以恢复的。甚至那些被删除的分支中的提交或使用 --amend选项覆盖的提交也可以恢复。然而,任何你未提交的东西丢失后很可能再也找不回来了。
三、远程仓库的使用
1.查看远程仓库
git remote
git remote -v
这个命令会显示需要读写远程仓库使用的git保存的简写与其对应的URL。
2.添加远程仓库
git remote add <shortname> <url>
git remote add origin https://github.com/woailuo2015/git.git
现在你可以在命令行中使用字符串origin来代替整个URL。
3.拉取远程仓库:git fetch origin
这个命令会访问远程仓库,从中拉取所有你还没有的数据。执行后,你将会有那个远程仓库中所有分支的额引用,可以随时合并会查看。
git pull
命令会自动抓取人后合并远程分支到当前分支。
4.推送到远程仓库
git push [remote-name] [branch-name]
git push origin master
只有当你有所克隆服务器的写入权限,并且之前没有人推送过时,这条命令才能生效。
如果有人先你一步推送了,你只能先将他们的工作拉取下来并将其合并进你的工作后才能推送。
5.查看远程仓库
git remote show [remote-name]
git remote show origin
6.远程仓库的移除与重命名
git remote rename 来修改远程仓库的简写名
git remote rename origin og
git remote rm 来移除一个远程仓库
git remote rm origin
四、打标签
git可以给历史中的某一个提交打上标签,以示重要
1.列出标签 git tag
git tag -l ‘v1.8.5*‘ 列出v1.8.5系列的标签所有信息
2.创建标签
git使用两种主要类型的标签:轻量标签与附注标签
轻量标签:很像一个不会改变的分支--它只是一个特定提交的引用。
附注标签:是存储在git数据库中的一个完整对象。他们是可以被校验的。
2.1附注标签
git tag -a v1.4 -m ‘my version 1.4‘
git show 命令可以看到标签信息与对应的提交信息
git show v1.4
2.2轻量标签:实质是将提交校验和存储到一个文件中:没有保存任何其他信息。
不需要-a -s -m这些选项
git tag v1.4-lw
2.3 后期打标签 对过去的提交打标签
你也可以对过去的提交打标签。 假设提交历史是这样的:
$ git log --pretty=oneline 15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branch ‘experiment‘ a6b4c97498bd301d84096da251c98a07c7723e65 beginning write support 0d52aaab4479697da7686c15f77a3d64d9165190 one more thing 6d52a271eda8725415634dd79daabbc4d9b6008e Merge branch ‘experiment‘ 0b7434d86859cc7b8c3d5e1dddfed66ff742fcbc added a commit function 4682c3261057305bdd616e23b64b0857d832627b added a todo file 166ae0c4d3f420721acbb115cc33848dfcc2121a started write support 9fceb02d0ae598e95dc970b74767f19372d61af8 updated rakefile 964f16d36dfccde844893cac5b347e7b3d44abbc commit the todo 8a5cbc430f1a9c3d00faaeffd07798508422908a updated readme
现在,假设在 v1.2 时你忘记给项目打标签,也就是在 “updated rakefile” 提交。 你可以在之后补上标签。 要 在那个提交上打标签,你需要在命令的末尾指定提交的校验和(或部分校验和):
$ git tag -a v1.2 9fceb02
2.4共享标签
默认情况下,git push 命令并不会传送标签到远程仓库服务器上。 在创建完标签后你必须显式地推送标签到 共享服务器上。 这个过程就像共享远程分支一样 - 你可以运行 git push origin [tagname]。
$ git push origin v1.5 Counting objects: 14, done. Delta compression using up to 8 threads. Compressing objects: 100% (12/12), done. Writing objects: 100% (14/14), 2.05 KiB | 0 bytes/s, done. Total 14 (delta 3), reused 0 (delta 0) To [email protected]:schacon/simplegit.git
* [new tag] v1.5 -> v1.5
如果想要一次性推送很多标签,也可以使用带有 --tags 选项的 git push 命令。 这将会把所有不在远程仓库 服务器上的标签全部传送到那里。
$ git push origin --tags Counting objects: 1, done. Writing objects: 100% (1/1), 160 bytes | 0 bytes/s, done. Total 1 (delta 0), reused 0 (delta 0) To [email protected]:schacon/simplegit.git
* [new tag] v1.4 -> v1.4 * [new tag] v1.4-lw -> v1.4-lw
现在,当其他人从仓库中克隆或拉取,他们也能得到你的那些标签。
2.5检出标签
在 Git 中你并不能真的检出一个标签,因为它们并不能像分支一样来回移动。 如果你想要工作目录与仓库中特定 的标签版本完全一样,可以使用 git checkout -b [branchname] [tagname] 在特定的标签上创建一个 新分支:
$ git checkout -b version2 v2.0.0 Switched to a new branch ‘version2‘
当然,如果在这之后又进行了一次提交,version2 分支会因为改动向前移动了,那么 version2 分支就会和 v2.0.0 标签稍微有些不同,这时就应该当心了。
五、git别名
Git 并不会在你输入部分命令时自动推断出你想要的命令。 如果不想每次都输入完整的 Git 命令,可以通过 git config 文件来轻松地为每一个命令设置一个别名。 这里有一些例子你可以试试:
$ git config --global alias.co checkout $ git config --global alias.br branch $ git config --global alias.ci commit $ git config --global alias.st status
这意味着,当要输入 git commit`时,只需要输入 `git ci。 随着你继续不断地使用 Git,可能也会经常使 用其他命令,所以创建别名时不要犹豫。
在创建你认为应该存在的命令时这个技术会很有用。 例如,为了解决取消暂存文件的易用性问题,可以向 Git 中 添加你自己的取消暂存别名:
$ git config --global alias.unstage ‘reset HEAD --‘
这会使下面的两个命令等价:
$ git unstage fileA $ git reset HEAD -- fileA
这样看起来更清楚一些。 通常也会添加一个 last 命令,像这样: $ git config --global alias.last ‘log -1 HEAD‘
这样,可以轻松地看到最后一次提交:
$ git last commit 66938dae3329c7aebe598c2246a8e6af90d04646 Author: Josh Goebel <[email protected]> Date: Tue Aug 26 19:48:51 2008 +0800
test for current head Signed-off-by: Scott Chacon <[email protected]>
可以看出,Git 只是简单地将别名替换为对应的命令。 然而,你可能想要执行外部命令,而不是一个 Git 子命 令。 如果是那样的话,可以在命令前面加入 ! 符号。 如果你自己要写一些与 Git 仓库协作的工具的话,那会很 有用。 我们现在演示将 git visual 定义为 gitk 的别名:
$ git config --global alias.visual ‘!gitk‘
总结
现在,你可以完成所有基本的 Git 本地操作-创建或者克隆一个仓库、做更改、暂存并提交这些更改、浏览你的 仓库从创建到现在的所有更改的历史。
以上是关于git基础的主要内容,如果未能解决你的问题,请参考以下文章
VSCode自定义代码片段15——git命令操作一个完整流程
GitGit 分支管理 ( 克隆远程分支 | 克隆 master 分支 git clone | 查看远程分支 git branch -a | 克隆远程分支 git checkout -b )(代码片段
GitGit 分支管理 ( 克隆远程分支 | 克隆 master 分支 git clone | 查看远程分支 git branch -a | 克隆远程分支 git checkout -b )(代码片段