获取Git仓库

在已存在目录中初始化仓库

$ git init

该命令会创建一个名为.git的隐藏文件。

克隆现有的仓库

$ git clone <url>
# 例如 git clone https://github.com/vuejs/vue
$ git clone <url> [newname]
# 自定义本地仓库的名字

Git支持多种数据传输协议:http://git://或者SSH

默认情况下,Git会将远程仓库设置为名为"origin"的远程仓库,并且会自动将您克隆的默认分支(通常是"master"或"main")设置为当前工作分支。

记录每次更新到仓库

初次克隆的仓库的工作目录下的所有文件都属于已跟踪文件,并处于未修改状态。

检查当前文件状态

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

上面提示说明所有已跟踪文件无任何修改。

Git之前默认分支名是master,后来改为main关于github默认分支名改为main后可能的处理

跟踪新文件

$ git add <文件名或目录路径>

这时使用git status命令,会提示Changes to be commited,紧跟下面的文件则是已跟踪、已暂存状态。

暂存已修改的文件

使用git status命令出现的Changes not staged for commit提示是说明该提示下面的文件已跟踪且内容发生变,但未提交到暂存区,这时使用git add提交到暂存区即可。

状态简览

使用-s--short选项可以简化状态输出:

$ git status -s
M README
MM Rakefile
A lib/git.rb
M lib/simplegit.rb
?? LICENSE.txt

注意状态有两列。

  • ??:新添加的未跟踪文件。
  • 空格:未修改。
  • A空格:新添加到暂存区的文件。
  • 空格M:工作区中已修改但未暂存的文件。
  • M空格:已修改且已暂存。
  • MM:已修改,暂存后又作了修改但未暂存。
  • R:文件已被重命名。
  • D:文件已被删除。

忽略文件

一般我们不希望项目编译产物和日志文件等被列入未跟踪文件。我们可以创建一个.gitignore文件,列出想要忽略的文件模式。

.gitignore的规范格式如下:

  • 空行和以#开头的行都会被忽略。
  • 可以使用glob模式匹配。
  • 匹配模式可以以/开头防止递归。
  • 匹配模式可以以/结尾指定目录。
  • 在模式前加!可以忽略除指定模式以外的文件或目录。

Glob 语法及解析

查看已暂存和未暂存的修改

使用git statusgit diff可以查看已暂存、未暂存的文件,只不过git diff以文件补丁形式更具体展示哪些行发生了改变。

git diff比较的是工作目录中当前文件和暂存区域快照之间的差异。 也就是修改之后还没有暂存起来的变化内容。

若要查看已暂存待提交的内容,可以使用git diff --staged命令。

$ git diff
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 8ebb991..643e24f 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -65,7 +65,8 @@ branch directly, things can get messy.
Please include a nice description of your changes when you submit your PR;
if we have to read the whole diff to figure out why you're contributing
in the first place, you're less likely to get feedback and have your change
-merged in.
+merged in. Also, split your changes into comprehensive chunks if your patch is
+longer than a dozen lines. If you are starting to work on a particular area, feel free to submit a PR
that highlights your work in progress (and note in the PR title that it's
  • diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md:表示正在比较的文件是 CONTRIBUTING.md
  • index 8ebb991..643e24f 100644:显示了被比较文件的索引信息。
  • --- a/CONTRIBUTING.md:表示原始版本的文件。
  • +++ b/CONTRIBUTING.md:表示修改后的版本的文件。
  • @@ -65,7 +65,8 @@:表示修改发生在原始文件的第65行,同时在修改后的文件的第65行开始。
  • -merged in.:表示从原始版本中删除了 merged in. 这行。
  • +merged in. Also, split your changes into comprehensive chunks if your patch is:表示在修改后的版本中添加了 merged in. Also, split your changes into comprehensive chunks if your patch is 这行。
  • +longer than a dozen lines.:表示在修改后的版本中添加了 longer than a dozen lines. 这行。

提交更新

$ git commit

执行上面命令会启动你选择的文本编辑器来输入提交说明。

追加-v选项查看具体修改。

追加-m选项可以将提交信息与命令放在同一行。

执行完后,会提示当前所在分支,本次提交的完整校验和,本次提交中有多少文件修订过以及多少行添加或删除。

跳过使用暂存区域

Git 提供了一个跳过使用暂存区域的方式, 只要在提交的时候,给 git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤。

移除文件

移除文件分为从磁盘移除和从暂存区移除。

如果是从磁盘移除,我们先手动删除文件,运行git status时会提示删除文件操作未暂存。然后使用git rm <文件或路径>记录此次操作。若要删除的文件之前修改过或已放入暂存区,则必须使用-f选项强制删除。

如果从暂存区移除但仍保存在当前工作目录中,使用git rm --cached <文件或路径>

移动文件

移动文件使用git mv <源文件或路径> <目的文件或路径>

git mv相当于下面三条命令:

$ mv README.md README
$ git rm README.md
$ git add README

git mv可以用于重命名文件。

查看提交历史

不传入任何参数的默认情况下,git log 会按时间先后顺序列出所有的提交,最近的更新排在最上面。

# 常规形式
$ git log
# -p 或 -patch 选项,增加补丁形式
$ git log -p
# --stat 选项,展示简略统计信息
$ git log --stat
# --pretty = oneline,展示简略统计信息
$ git log --pretty = oneline
# 定制记录的显示格式
$ git log --pretty = format:"%h - %an,ar%:s%"

输出格式

git log --pretty = format常用选项:

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

git log --pretty=format:%h %s" --graph的执行结果如下:

$ git log --pretty=format:"%h %s" --graph
* 2d3acf9 ignore errors from SIGCHLD on trap
* 5e3ee11 Merge branch 'master' of git://github.com/dustin/grit
|\
| * 420eac9 Added a method for getting the current branch.
* | 30e367c timeout code and tests
* | 5a09431 add timeout protection to grit
* | e1193f8 support for heads with slashes in them
|/
* d6016bc require time for xmlschema
* 11d191e Merge branch 'defunkt' into local

*表示一次提交,竖线 (|) 代表一个分支,斜线 (/) 和反斜线 (\) 表示分支的合并。

限制输出长度

限制git log输出的选项:

选项 说明
-<n> 仅显示最近的 n 条提交。
--since, --after 仅显示指定时间之后的提交。
--until, --before 仅显示指定时间之前的提交。
--author 仅显示作者匹配指定字符串的提交。
--committer 仅显示提交者匹配指定字符串的提交。
--grep 仅显示提交说明中包含指定字符串的提交。
-S 仅显示添加或删除内容匹配指定字符串的提交。

撤销操作

覆盖提交

$ git commit --amend

执行该命令,如果自上次以来未做任何修改,那么快照保持不变,只修改提交信息。

而如果存在修改,这次提交会覆盖上次提交。

取消暂存的文件

$ git reset HEAD <文件>

撤销对文件的修改

$ git checkout -- <file>

远程仓库的使用

查看远程仓库名称

git remote: 显示当前仓库已配置的所有远程仓库的简写名称。。默认名字是origin

git remote -v: 显示当前仓库已配置的所有远程仓库的简写名称和对应的URL。这会显示每个远程仓库的读取和写入的URL,如果你克隆了一个仓库,通常会看到一个名为"origin"的默认远程仓库。

添加远程仓库

git remote add <remote-name> <remote-url>: 添加一个新的远程仓库,并指定它的简写名称和URL。

从远程仓库中抓取与拉取

$ git fetch <remote-name>

git fetch命令用于从远程仓库下载最新的提交历史,但不会自动合并或更新您的工作目录。它只会将远程仓库的变更下载到本地,并将它们存储在名为"origin"(默认远程仓库名)的分支中,例如origin/master表示远程仓库的master分支。

$ git pull <remote-name> <branch-name>

git pull命令用于从远程仓库获取更新并自动合并到当前分支中。它实际上是git fetchgit merge两个命令的组合。首先,它会执行git fetch来获取远程仓库的更新,然后将这些更新自动合并到当前分支中。

推送到远程仓库

$ git push <remote-name> <branch>

git push将本地代码或修改推送到远程仓库的分支。

注意:执行git push前,确保拥有服务器的写入权限以及本地分支与远程分支之间没有冲突(即之前没有人推送过),否则你的推送将被拒绝,必须先抓取其他人的工作并合并到你的工作中才能推送。

查看某个远程仓库详情

命令格式:

$ git remote show <remote>

示例输出:

* remote origin
Fetch URL: https://github.com/username/repo.git
Push URL: https://github.com/username/repo.git
HEAD branch: main
Remote branches:
main tracked
feature-A tracked
feature-B new (next fetch will store in remotes/origin)
Local branches configured for 'git pull':
main merges with remote main
feature-A merges with remote feature-A
Local refs configured for 'git push':
main pushes to main (up to date)
feature-A pushes to feature-A (local out of date)

示例分析:

  • remote origin:显示该远程仓库的名称,即"origin"。
  • Fetch URLPush URL:显示该远程仓库的获取(fetch)URL和推送(push)URL。这里都为"https://github.com/username/repo.git"。
  • HEAD branch: main:指示远程仓库的默认分支是"main"分支。
  • Remote branches:显示所有在远程仓库中存在的分支,并且标记它们是否被本地跟踪(tracked)。
  • Local branches configured for 'git pull':显示与远程仓库分支进行合并(merge)的本地分支。
  • Local refs configured for 'git push':显示用于推送(push)到远程仓库的本地引用(通常是分支)。

远程仓库的重命名与移除

# 重命名
$ git remote rename <oldname> <newname>
# 删除
$ git remote remove <remote-name> 或 git remote rm <remote-name>

打标签

在Git中,你可以给特定的提交(Commit)来使用标签(Tag)打上标记,类似于一个代码版本的快照。标签通常用于标识重要的里程碑、版本发布或稳定版本,以便以后更容易地找到和访问这些特殊地提交。

列出标签

命令:git tag以字母顺序列出标签。

按照特定模式查找标签:git tag -l <glob模式>

创建标签

Git有两种标签:轻量标签(lightweight)和附注标签(annotated)。

轻量标签

轻量标签是对特定提交的引用。只包含提交信息。

命令:git tag <tagname> [commit-id]。不加提交号默认给当前分支的最新提交打标签。

附注标签

附注标签是Git数据库中一个完整对象,是可以被校验的,包含了打标签者的信息和一个标签信息。

命令:git remote -a <tag-name> -m "Tag message" [commit-id]。不加提交号默认给当前分支的最新提交打标签。

共享标签

git push不会将标签推送到远程服务器上。这需要我们显示的推送标签:

  1. 推送所有标签:git push origin --tags
  2. 推送指定标签:git push origin <tagname>

删除标签

  • 删除本地标签:git tag -d <tagname>
  • 更新远程仓库标签:git push <remote> :refs/tags/<tagname>git push origin --delete <tagname>

检出标签

git checkout可以用于检出指定的提交,并将仓库的 HEAD 指向该提交。这样会处于“分离 HEAD”状态,意味着您不再位于任何分支上。通常,您不会在这种状态下进行修改,因为新提交将没有分支引用,会很难找到和维护。

如果想检出旧标签并且需要更改旧版本中的内容,那么就需要新建一个分支:git checkout -b <branch-name> <tagname>

Git别名

Git提供给命令提供别名的功能。

命令格式:git config --global alias.<alias-name> <git-command>

《Pro Git》Git基础笔记的更多相关文章

  1. Git 基础笔记整理1

    Git 官网:http://git-scm.com/ git教程1:http://www.yiibai.com/git/home.html git教程2 :http://www.liaoxuefeng ...

  2. Git基础--笔记

    0.取的项目的git仓库 有两种取得 Git 项目仓库的方法.第一种是在现存的目录下,通过导入所有文件来创建新的 Git 仓库. 第二种是从已有的 Git 仓库克隆出一个新的镜像仓库来 1.在工作目录 ...

  3. Git源代码管理笔记

    很早之前也学过git但是没有详细的记录,这次是做个复习,巩固 若有不对的地方请您指出 目录 Git和SVN有什么区别? 什么是Git? github仓库 Star和Fork Pull request ...

  4. git学习小结 (笔记)

    Modesty helps one to go forward, whereas conceit makes one lag behind. "虚心使人进步,骄傲使人落后" 注:本 ...

  5. git学习基础教程

    分享一个git学习基础教程 http://pan.baidu.com/s/1o6ugkGE 具体在网盘里面的内容..需要的学习可以直接下.

  6. git的学习笔记(二):git远程操作

    1.创建ssh key ssh-keygen -t rsa -C "your_email@example.com" 执行命令后会在用户的家目录生成.ssh的隐藏文件夹,文件夹里有公 ...

  7. Git入门基础详情教程

    前言 写了一篇文章<一篇文章了解Github和Git教程>还觉得不错,继续写了<为了Github默默付出,我想了解你>,那么继续写Git 基础知识. Git 官网:https: ...

  8. Git使用基础篇

    Git使用基础篇 前言 Git是一个分布式的版本控制工具,本篇文章从介绍Git开始,重点在于介绍Git的基本命令和使用技巧,让你尝试使用Git的同时,体验到原来一个版 本控制工具可以对开发产生如此之多 ...

  9. Git使用基础篇(zz)

    Git使用基础篇 您的评价:          收藏该经验       Git是一个分布式的版本控制工具,本篇文章从介绍Git开始,重点在于介绍Git的基本命令和使用技巧,让你尝试使用Git的同时,体 ...

  10. Mac下Git的基础操作

    目前最火的版本控制软件是Git了吧,今天简单梳理一下Mac下Git的基础操作~~ 一.什么是Git Git是一个分布式代码管理工具,用于敏捷的处理或大或小的项目,类似的工具还有svn. 基于Git的快 ...

随机推荐

  1. 2021-01-11:linux中,如何看内存的使用情况呢?

    福哥答案2021-01-11: 1.free:查看内存占用情况,会直接返回,常用参数 -M.-G 是以MB或GB为单位返回结果.2.sar:定时检测系统资源占用情况,-r 参数是内存资源,一般用法 s ...

  2. 2021-08-30:给定两个字符串str1和str2,在str1中寻找一个最短子串,能包含str2的所有字符,字符顺序无所谓,str1的这个最短子串也可以包含多余的字符。返回这个最短包含子串。

    2021-08-30:给定两个字符串str1和str2,在str1中寻找一个最短子串,能包含str2的所有字符,字符顺序无所谓,str1的这个最短子串也可以包含多余的字符.返回这个最短包含子串. 福大 ...

  3. PostgreSQL一站式插件推荐 -- pg_enterprise_views

    近日发现PG官方插件列表中新收录了一款插件 pg_enterprise_views,因为官方已经数年未添新的插件了很是新奇,找了台设备测试过后果断上了生产,得空分享给大家. 该插件提供了数十张系统表及 ...

  4. Kubernetes 架构原则和对象设计

    Kubernet¶ Kubernetes 架构原则和对象设计¶ 什么是云计算¶ 云计算平台的分类¶ 以Openstack为典型的虚拟化平台 虚拟机构建和业务代码部署分离. 可变的基础架构使后续维护风险 ...

  5. 一天吃透Spring面试八股文

    内容摘自我的学习网站:topjavaer.cn Spring是一个轻量级的开源开发框架,主要用于管理 Java 应用程序中的组件和对象,并提供各种服务,如事务管理.安全控制.面向切面编程和远程访问等. ...

  6. 可视化生信分析利器 Galaxy 之 Docker 开发

    1. 背景 我们常常会基于某个 image 来启动一个 container,在这个 container 中我们可能会执行某些操作,比如创建一个文件,但是当这个 container 退出以后,如果我们以 ...

  7. Java中的金钱陷阱

    前言 有多少小伙伴是被标题 骗 吸引进来的呢,我可不是标题党,今天的文章呢确实跟"金钱"有关系. 但是我们说的不是过度追求金钱而掉入陷阱,而是要说一说在Java程序中,各种跟金钱运 ...

  8. string类型可以作为lock的锁对象吗

    lock 关键字介绍 lock 关键字是用于在多线程编程中实现同步和互斥访问的关键字.它的作用是确保共享资源在任意时刻只能被一个线程访问,从而避免出现竞态条件(race condition)和数据不一 ...

  9. 全球权威的 IT 研究公司 Gartner,发布未来五大隐私趋势

    Gartner(高德纳) 公司是全球最具权威的 IT 研究与顾问咨询公司之一,它成立于 1979 年,总部设在美国康涅狄克州斯坦福.其研究范围覆盖全部 IT 产业,包括 IT 的研究.发展.评估.应用 ...

  10. rocketmq-console基本使用

    rocketmq-console基本使用 作用:rocketmq-console是rocketmq的一款可视化工具,提供了mq的使用详情等功能. 一.安装部署 下载rocketmq组件 rocketm ...