Skip to content

Git

Posted on:April 2, 2020 at 23:29:02 GMT+8

Git

简介

Git 是一个免费的,开源的分布式版本控制系统,被设计用来又快又好地处理大大小小的项目。

一些命令

git config —list —show-origin 查看所有的配置以及它们所在的文件。

git diff 比较当前文件与暂存区快照的差异。

git diff —staged 比较已暂存文件与最后一次提交的文件的差异。

git diff —cached 同上。

git difftool —tool=vimdiff 用图形化工具 diff。

git commit -v 会将你所作的更改的 diff 输出呈现在编辑器。

git commit -a Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤。

git rm 将文件从暂存区移除。如果要删除之前修改过或已经放到暂存区的文件,则必须使用强制删除选项 -f。

git rm —cached 我们想把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中。 换句话说,你想让文件保留在磁盘,但是并不想让 Git 继续跟踪。

git mv 移动,可用于重命名。

git log -p git log —patch 显示每次提交所引入的差异。

git log -2 限制 log 的数量为 2。

git log —stat 显示每次提交的简略统计。

git log —pretty

git log —pretty=oneline short full fuller

git log —pretty=format:“%h - %an, %ar : %s” 定制记录的显示格式。

选项说明
%H提交的完整哈希值
%h提交的简写哈希值
%T树的完整哈希值
%t树的简写哈希值
%P父提交的完整哈希值
%p父提交的简写哈希值
%an作者名字
%ae作者的电子邮件地址
%ad作者修订日期(可以用 —date=选项 来定制格式)
%ar作者修订日期,按多久以前的方式显示
%cn提交者的名字
%ce提交者的电子邮件地址
%cd提交日期
%cr提交日期(距今多长时间)
%s提交说明

git log —since=2.weeks

—util —author —grep —all-match

git log —no-merges

git commit —amend 这个命令会将暂存区中的文件提交。 如果自上次提交以来你还未做任何修改(例如,在上次提交后马上执行了此命令), 那么快照会保持不变,而你所修改的只是提交信息。

git restore —staged (老版本 git reset HEAD ) 取消暂存。

git restore (老版本 git checkout — ) 撤销未暂存区的修改。

git remote 查看远程仓库。origin 是克隆的仓库服务器的默认名称。

git remote -v

git remote add

git push

git remote show

git remote rename pb paul

git remote remove paul

git remote rm paul

git tag 列出已有的标签

git tag -l “v1.8.5*”

git tag -a v1.4 -m “my version 1.4” 创建附注标签

git show v1.4

git tag v1.4-lw 创建轻量标签。

git tag -a v1.2 9fceb02

git push origin 将标签推送到远程服务器。

git push origin —tags

git tag -d 删除标签

git push :refs/tags/ 来更新你的远程仓库

git push origin —delete 删除远程标签

git branch

git log —oneline —decorate 查看各个分支当前所指的对象。

git checkout

git checkout -b

git merge iss53 将当前分支与 iss53 分支合并。

git branch —merged

git branch —no-merged

git branch —merged master

远程引用是对远程仓库的引用(指针),包括分支、标签等等。 你可以通过 git ls-remote 来 显式地获得远程引用的完整列表, 或者通过 git remote show 获得远程分支的更多信息。

git push origin serverfix Git 自动将 serverfix 分支名字展开为 refs/heads/serverfix:refs/heads/serverfix。

可以运行 git push origin serverfix:awesomebranch 来将本地的 serverfix 分支推送到远程仓库上的 awesomebranch分支。

git checkout -b serverfix origin/serverfix 创建并切换到本地分支 serverfix,且起点位于 origin/serverfix。

git checkout —track origin/serverfix 作用同上的快捷方式。

git checkout serverfix 如果 serverfix 不存在且刚好有同名的远程分支,则作用同上。

git branch -u origin/serverfix (—set-upsteam-to) 设置或修改当前分支的上游分支。

git merge @{u} 同 git merge origin/master

分布式 集中式

集中式:有一个单一的集中管理的服务器,保存所有文件的修订版本。协同工作的人通过客户端连到这台服务器,取出最新的文件或提交更新。

分布式:客户端并不只提取最新版本的文件快照, 而是把代码仓库完整地镜像 下来,包括完整的历史记录。

Git 涉及到的区域

工作目录下的文件存在两种状态:已跟踪 未跟踪。已跟踪 的文件的状态又可能有:未修改 已修改 已放入暂存区。

已提交表示数据已经安全地保存在本地数据库中。

Git 中有工作区、暂存区(Git 术语叫索引 index)及 Git 目录。

git add 开始跟踪一个文件并放入暂存区 或 把已跟踪的文件放入暂存区。

配置

$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"

--global 表示这台机器上的所有仓库都会用这个配置。

建立工程

初始化文件夹为仓库

$ git init
Initialized empty Git repository in D:/Temp/learn-git/.git/

之后本地文件夹就会有.git文件夹

基本使用

添加文件到版本库

在 Git 目录下新建文件。

$ git status
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        first.txt

nothing added to commit but untracked files present (use "git add" to track)

git status 查看当前文件夹状态。

$ git add .

给当前目录下的所有文件创建一个快照。这些快照保存在一个暂时的区域,Git 中叫做index(暂存区)。

$ git commit

之后再用git commit就可以把暂存区中的内容永久地存到 Git 仓库里。

直接git commit会要求你输入这次提交的信息,vim 方式输入。

git commit -m "message" 可以综合这两步过程。

修改

修改一下文件内容,然后把 TA 们添加到暂存区。

$ git diff --cached

可以查看最近一次 add 的文件的修改内容,如下所示:

diff --git a/first.txt b/first.txt
index b683137..53c5510 100644
--- a/first.txt
+++ b/first.txt
@@ -1 +1 @@
-This is first line.
\ No newline at end of file
+First line.
\ No newline at end of file

add 之后再 status 查看当前暂存区与上一次 commit 之间的差别。

如果没什么再需要修改的,就可以 commit 提交到仓库了。

git commit -a 可以把addcommit一次完成。

这会把所有修改的(不包括新建的)文件添加到暂存区,再 commit 提交

Git 追踪的是内容不是文件

查看历史

$ git log

git log可以在任何时刻使用,来查看每一次 commit 的信息。

TODO

分支和合并

管理分支

一个Git仓库可以有多个分支。

新建分支

$ git branch dev

查看分支

$ git branch

Git会显示出所有分支,TODO

  dev
* master

切换分支

2.23 加入,现在还在试验阶段,是为了分担 git checkout(以前切换分支是 checkout)的功能。

Git 更新(Windows) git update-git-for-windows

$ git switch dev

就切换到了dev分支

分支

image-20210406213952479

合并

git checkout master
git merge experiment

image-20210406213908836

变基

基本

$ git checkout experiment
$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: added staged command

image-20210406213929111

一般我们这样做的目的是为了确保在向远程分支推送时能保持提交历史的整洁——例如向某个其他人维护的项目贡献代码时。 在这种情况下,你首先在自己的分支里进行开发,当开发完成时你需要先将你的代码变基到 origin/master 上,然后再向主项目提交修改。 这样的话,该项目的维护者就不再需要进行整合工作,只需要快进合并便可。

更有趣的变基例子

image-20210406215556657

git rebase --onto master server client

选中在 client 分支里但不在 server 分支里的修改(即 C8 和 C9),将它们在 master 分支上重放。

image-20210406215751796

接着快进合并 master:

git checkout master
git merge client

image-20210406220028811

整合 server 分支:

git rebase master server

git rebase 直接将 topicbranch rebase 到 basebranch 上,省去了切换到 topicbranch 的步骤。

image-20210406220241674

接着同样可以快进合并 master。

变基需遵循准则:

如果提交存在于你的仓库之外,而别人可能基于这些提交进行开发,那么不要执行变基。

变基操作的实质是丢弃一些现有的提交,然后相应地创建一些内容上一样但实际上不一样的提交。

标签

拉取

贮藏 stash

搜索

子模块

钩子

分享和更新项目

检查和比较

补丁

原理

更多

.gitignore

.gitignore 用来规定一些不需要提交到版本库(不被 Git 追踪)的文件,大多是配置文件和临时文件或中间生成的文件。如果文件已经被追踪,再添加了过滤此文件的规则,不会生效。

.gitignore忽略规则的匹配语法

来自 https://www.cnblogs.com/kevingrace/p/5690241.html

在 .gitignore 文件中,每一行的忽略规则的语法如下: 1)空格不匹配任意文件,可作为分隔符,可用反斜杠转义 2)以“”开头的行都会被 Git 忽略。即#开头的文件标识注释,可以使用反斜杠进行转义。 3)可以使用标准的glob模式匹配。所谓的glob模式是指shell所使用的简化了的正则表达式。 4)以斜杠”/“开头表示目录;”/“结束的模式只匹配文件夹以及在该文件夹路径下的内容,但是不匹配该文件;”/“开始的模式匹配项目跟目录;如果一个模式不包含斜杠,则它匹配相对于当前 .gitignore 文件路径的内容,如果该模式不在 .gitignore 文件中,则相对于项目根目录。 5)以星号”*“通配多个字符,即匹配多个任意字符;使用两个星号”**” 表示匹配任意中间目录,比如a/**/z可以匹配 a/z, a/b/z 或 a/b/c/z等。 6)以问号”?“通配单个字符,即匹配一个任意字符; 7)以方括号”[]“包含单个字符的匹配列表,即匹配任何一个列在方括号中的字符。比如[abc]表示要么匹配一个a,要么匹配一个b,要么匹配一个c;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配。比如[0-9]表示匹配所有0到9的数字,[a-z]表示匹配任意的小写字母)。 8)以叹号”!“表示不忽略(跟踪)匹配到的文件或目录,即要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。需要特别注意的是:如果文件的父目录已经被前面的规则排除掉了,那么对这个文件用”!”规则是不起作用的。也就是说”!”开头的模式表示否定,该文件将会再次被包含,如果排除了该文件的父级目录,则使用”!”也不会再次被包含。可以使用反斜杠进行转义。

需要谨记:git对于.ignore配置文件是按行从上到下进行规则匹配的,意味着如果前面的规则匹配的范围更大,则后面的规则将不会生效;

参考

Git - Book

2021-04-06 22:25:02

2019-11-28 22:39:44