git使用

git使用

参考:

工作流一目了然,看小姐姐用动图展示10大Git命令 - 知乎 (zhihu.com)

菜鸟教程-git教程

git常用23条命令总结

git使用教程

MyBatis中文官网关于git的介绍 该网站还有关于vim的介绍vim入门教程

1.分区

1. git的由来

Git更像是把数据看作是对小型文件系统的一系列快照。在Git中,每当你提交更新或保存项目状态时,它基本上就会对当时的全部文件创建一个快照并保存这个快照的索引。另外,如果文件没有修改,Git不再重新存储该文件,而是只保留一个链接指向之前存储的文件。Git对待数据更像是一个快照流

SVN等以文件变化方式储存信息Git以文件快照方式储存信息

实际上,Git仓库中保存的信息都是以文件内容的哈希值来索引,而不是文件名。

img

2. git的5种状态

  • 未修改(Origin)
  • 已修改(Modified),已表示修改了文件,但还没保存到仓库中。
  • 已暂存(Staged),表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
  • 已提交(Committed),表示文件已经安全地保存在本地仓库中。
  • 已推送(Pushed),表示文件已经从本地仓库已经推送到远端仓库中。

3. git的分支

git分支是一个串联的链表

HEAD指向的是当前正在操作的分支,HEAD -> master 告诉我们当前处于 master 分支,HEAD也能代表当前分支最新提交的commit id。有时候,我们commit提交代码后,发现这一次commit的内容是有错误的,面对这种情况有两种解决方法:

解决方法1:修改错误内容,再次commit一次

解决方法2:使用git reset命令撤销这一次错误的commit

此时,该head出场了,它常常与reset连用,如下所示:

$ git reset HEAD <file>

因为head表示当前分支的最新提交的commit id,上述命令的目的是将文件file恢复到指定的commit id。
新建dev分支

分支切换命令为:

git checkout branchname

dev分支生长会变得越来越远,B0是最开始提交

合并dev分支到masterimage-20240713181256782

合并冲突现象:

dev和master共同祖先B2,然后对同一文件进行了修改分别是B3、B4,需要手动合并

手动解决冲突,产生新快照B5合并冲突

冲突的格式是这样的:

<<<<<<< HEAD
test master.
=======
test dev.
>>>>>>> dev

冲突是通过=======来分割的,其上部分表示HEAD分支的内容,其下部分表示dev分支的内容,这两部分内容发生了冲突。为了解决冲突,你必须选择使用由 ======= 分割的两部分中的一个或者也可以自行合并这些内容。

备注:通过上文Git的HEAD介绍,我们知道,HEAD指向的是当前正在操作的分支。因为运行合并命令(merge 命令)在 master 分支,所以 HEAD 指的是 master分支。

参考链接:==Git:合并分支—-git merge命令应用的三种情景==

git分支命令git分支命令

2. 常用操作

常用命令 含义
git config –global user.name 用户名 设置用户名
git config –global user.email 邮箱 设置用户邮箱
git init 初始化本地库
git status 查看本地库状态
git add 文件名 添加到暂存区
git commit-m “日志信息” 文件名 提交到本地库
git reflog/git log 查看历史记录
git reset –hard 版本号 版本穿梭
git stash 将暂存器和工作区内容保存
git stash pop 恢复之前的工作编辑状态

参考图:git常用命令速查

《Git常用命令》详细讲解·第10篇(git fetch、git pull和git push)

具体:

(1)git config

git config

(2)git stash

git stashgit stash总结

(3)git diff

git diff

(4)git checkout

git checkout

(5)git log

git log

git log 命令有众多的参数,选择合理的参数,可以方便查看过往的仓库提交历史记录。主要的参数有:--oneline--stat--author--after--before,还有-p-n

####–oneline 参数:简化默认的输出

--oneline 参数用于简化 git log 的默认的输出,仅仅输出 commit hash 前7个字符串和 commit message。如下所示:

$ git log --oneline
658ac24 modify some code in xxx section
9d05208 modify some code in xxx section 
cb53d27 modify some code in xxx section

–stat 参数:增加增删的统计数据

--stat 参数是在 git log 的基础上输出文件增删改的统计数据,方便我们查看仓库的改动情况。如下所示:

$ git log --stat
commit a8d08c1b60c0cbaa0be56378aa891726c45f0a49 
Author: Tim <xxx@mail.com>
Date:   Fri Oct 28 18:58:39 2022 +0800

    modify some code in xxx section

 lib/common/Localized.dart         |   2 +-
 lib/pages/calendar_plan_page.dart | 470 ++++++++++++++++++++---------------
 2 files changed, 248 insertions(+), 224 deletions(-)

–author 参数:过滤作者

在团队合作开发过程中,如果只想查看某个小伙伴提交的代码,怎么办呢?此时可以加上 --author 参数用来过滤 commit,限定输出给定的用户,如下所示:

$ git log --author="Tim"
commit 84b86471ea12bd1f5994d878a318dcdead1137e9
Author: Tim <xxx@mail.com>
Date:   Wed Dec 19 17:29:25 2022 -0800

    modify some code in xxx section

–after和–before 参数:限定指定日期范围的日志

如果我们想看某段时间内的提交历史,可以使用 --after--before 参数,十分好用,如下所示。不过,需要注意日期的格式,是10-1-2022这样的形式,国外风格的日期表示形式。

$ git log --after '10-1-2022'
commit a8d08c1b60c0cbaa0be56378aa891726c45f0a49 (HEAD -> dev, origin/dev, origin/HEAD)
Author: Tim <xxx@mail.com>
Date:   Fri Oct 28 18:58:39 2022 +0800

    modify some code in xxx section
...

-p 参数:输出每次提交的内容差异

-p 参数很常用,它能控制输出每个 commit 具体修改的内容,输出的形式以 diff 的形式给出。如下所示:

$ git log -p
commit a8d08c1b60c0cbaa0be56378aa891726c45f0a49
Author: Tim <xxx@mail.com>
Date:   Fri Oct 28 18:58:39 2022 +0800

    modify some code in xxx section

diff --git a/lib/common/Localized.dart b/lib/common/Localized.dart
index c870ab8..1992ccf 100644
--- a/lib/common/Localized.dart
+++ b/lib/common/Localized.dart

-n 参数:限定log输出的条数

如果想看最近的 n 条提交日志,怎么办?很简单。直接在 log 命令之后,加 -n 参数即可,n 表示用户要输出的数量.

$ git log -n 3 
commit a8d08c1b60c0cbaa0be56378aa891726c45f0a49
Author: Tim <xxx@mail.com>
Date:   Fri Oct 28 18:58:39 2022 +0800

    modify some code in xxx section
...

3. Git文件种类

  • 已追踪的Tracked:已经在版本库中的文件,或者是已经暂存到索引中的文件。如果想将新文件newfile添加到为已追踪(Tracked)的文件,执行git add newfile命令即可。
  • 被忽略的Ignored:
  • 未追踪的Untracked:。Git把工作目录下的所有文件当成一个集合,减去已追踪的文件和被忽略的文件,剩余部分最为未被追踪的文件(Untracked)。

4. 解释

1. git init会生产一个.git文件夹

2. git status会有git给我们的建议

  1. On branch master: 我们位于一个叫做“master”的分支里,这是默认的分支,nothing to commit, working directory clean : 说明你的工作目录目前是“干净的”,没有需要提交的文件(意思就是自上次提交后,工作目录中的内容压根儿就没改动过)。

  2. Untracked files 说明存在未跟踪的文件,所谓的“未跟踪”文件,是指那些新添加的并且未被加入到暂存区域或提交的文件。它们处于一个逍遥法外的状态,但你一旦将它们加入暂存区域或提交到 Git 仓库,它们就开始受到 Git 的“跟踪”。

3. 暂存区->工作区 | 版本库->暂存区/工作区

1、使用git checkout命令可以使暂存区的文件替换工作区的文件(暂存区域的旧版本覆盖工作目录的新版本,危险操作:相当于丢弃工作目录的修改)。

如果暂存区有旧版本文件,工作区是新版本的修改后的文件,那么需要先执行 add 命令覆盖暂存区域,然后再提交……

2、使用git reset命令可以回退版本。

5. Git 本地仓库与远程仓库建立连接

origin仓库解释

6.Git解决冲突

git冲突处理

7.Git撤销修改

image-20240713184405047

8.git pull

git pull

9.git rebase

git rebase

git rebase原理

​ ==上面的例子可抽象为如下实际工作场景:张三从B拉了代码进行开发,目前提交了两次,开发到D了;李四也从B拉出来开发了并且开发完毕,他提交到了M,然后合到主干上了。此时张三想拉下最新代码,于是他在feature分支上执行了git rebase master,即把master分支给rebase过来,由于李四更早开发完并合了主干,如此就相当于张三是基于李四的最新提交M进行的开发了。==

实际git提交实例

10.git reset

较少用!

11.git mv

git mv text.txt mydir

运行上面的 git mv 其实就相当于运行了3条命令:

$ mv test.txt mydir
$ git rm test.txt
$ git add mydir

12.git rm

git rm


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。
github