Datawhale学习笔记:faster git丨202401 task01
1Git简介
1.1版本控制系统
版本控制系统是一种用于跟踪和管理文件或代码更改的系统。它允许用户记录文件的每个版本,以便于查看、比较和恢复以前的版本。版本控制系统广泛应用于软件开发、文档管理和任何需要跟踪文件变化的领域。
版本控制系统主要有集中式和分布式两种类型:
- 集中式版本控制系统:这种系统有一个中央服务器,所有的版本信息都存储在服务器上。客户端通过与服务器的交互来获取和提交更改。例如,CVS和Subversion就是这种类型的版本控制系统。
- 分布式版本控制系统:与集中式版本控制系统不同,分布式版本控制系统没有中央服务器。每个用户都有完整的版本历史,可以独立地进行提交和查看历史记录。Git是最著名的分布式版本控制系统。
1.2Git历史
Git的诞生源于Linux内核开源项目的需求。在1991年至2002年间,Linux内核的维护工作主要集中在提交补丁和保存归档的繁琐事务上。为了管理和维护代码,整个项目组在2002年开始使用一个专有的分布式版本控制系统BitKeeper。然而,到了2005年,开发BitKeeper的商业公司与Linux内核开源社区的合作关系结束,他们收回了Linux内核社区免费使用BitKeeper的权力。这一变化迫使Linux开源社区开发出自己的版本系统。Linus Torvalds和其他Linux内核开发者基于使用BitKeeper时的经验教训,开发出了自己的版本控制系统——Git。Git的设计目标是速度快、简单易用,并且支持非线性开发模式,允许成千上万个并行开发的分支。如今的Git日臻成熟完善,在高度易用的同时,仍然保留着初期设定的目标。它的速度飞快,极其适合管理大项目,有着令人难以置信的非线性分支管理系统。
1.3Git安装
前往网站安装对应系统:https://git-scm.com/downloads
安装完成之后在Git bash或terminal进行配置:
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
配置完成之后可以进入vim编辑模式查看是否配置正确:
git config --global --edit
退出vim编辑的方法:按ESC之后,输入冒号“:”,进入命令模式。输入字母指令后回车以对应模式退出。
:q
//退出
:q!
//退出且不保存(:quit!的缩写)
:wq
//保存并退出
:wq!
//保存并退出即使文件没有写入权限(强制保存退出)
:x
//保存并退出(类似:wq,但是只有在有更改的情况下才保存)
:exit
//保存并退出(和:x相同)
:qa
//退出所有(:quitall的缩写)
:cq
//退出且不保存(即便有错误)
2Git基础命令
2.1获取Git仓库
2.1.1未进行版本控制的本地目录
- 打开Git Bash之后,使用cd跳转到项目所在目录。
在 Linux 上:
cd /home/user/my_project
在 macOS 上:
cd /Users/user/my_project
在 Windows 上:
cd /c/user/my_project
- 初始化新的本地仓库
git init
- 将文件添加至暂存区与提交暂存区文件
git add .
git add LICENSE
git commit -m "initial project version"
2.1.2克隆到本地的仓库
- 克隆远程仓库
git clone [url]
- 执行克隆指令后,会将远程仓库的目录下载到本地路径中,并初始化.git文件夹,从远程仓库拉取下所有数据放入 .git 文件夹,然后从中读取最新版本的文件的拷贝。
- Git支持的数据传输协议包括https:// git:// 以及SSH……
2.2记录更新
工作目录中的文件包括:已跟踪和未跟踪两种状态。
2.2.1检查文件状态
对于工作目录中的文件,可以用git status命令查看哪些文件处于什么状态。
- 如果提示如下则说明已跟踪文件自上次提交后未被更改过。
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
- 此外,这些信息还表明,当前目录下没有出现任何处于未跟踪状态的新文件。该命令还显示了当前所在分支,并告诉你这个分支同远程服务器上对应的分支没有偏离。
- 创建一个之前不存在于仓库的文件,再使用
git status命令,可以从信息中看到新的未跟踪文件。Git不会自动将未跟踪文件纳入跟踪范围,除非使用指令。 - 还可以使用
git status -s或git status --short得到更加简短的输出
2.2.2跟踪新文件
对与未跟踪文件,可以使用git add进行跟踪。以某新建README.md为例。
新建README.md
touch README.md
使用git status查看README.md状态,得到提示如下。
On branch master
Your branch is up-to-date with 'origin/master'.
Untracked files:
(use "git add <file>..." to include in what will be committed)
nothing added to commit but untracked files present (use "git add" to track)
使用git add追踪之后再查看状态,得到提示如下。
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: README
- 如果在Changes to be committed:下面,则说明已经是暂存状态。
- 此时提交,该文件在你运行 git add 时的版本将被留存在后续的历史记录中。
- git add 命令使用文件或目录的路径作为参数;如果参数是目录的路径,该命令将递归地跟踪该目录下的所有文件。
2.2.3暂存已修改的文件
对于修改过的已跟踪文件,同样可以使用git add将它放到暂存空间中。对于一个add到暂存空间中的文件,如果进行再次修改,则需要重新使用git add添加该文件至暂存空间。
2.2.4忽略文件
对于一些不需要跟踪的文件,可以创建.gitignore文件,列出需要忽略的文件的模式。
cat .gitignore
*.[oa]
*~
- 这个例子第一行告诉Git忽略所有以 .o 或 .a 结尾的文件,第二行告诉Git忽略以~结尾的文件。
文件.gitignore的格式规范如下:
-
所有空行或者以 # 开头的行都会被 Git 忽略。
-
可以使用标准的 glob 模式匹配,它会递归地应用在整个工作区中。glob 模式是指 shell 所使用的简化了的正则表达式。
-
匹配模式可以以(/)开头防止递归。
-
匹配模式可以以(/)结尾指定目录。
-
要忽略指定模式以外的文件或目录,可以在模式前加上叹号(!)取反。
Tip GitHub 有针对数十种项目及语言的详细.gitignore文件列表。https://github.com/github/gitignore
2.2.5查看已暂存和未暂存的修改
相较于git status,如果想知道更具体的修改内容,可以使用git diff命令。
- 要查看尚未暂存的文件更新了哪些部分,不加参数直接输入
git diff,此命令比较的是工作目录中当前文件和暂存区域快照之间的差异。 - 要查看已暂存的将要添加到下次提交里的内容,可以用
git diff --staged命令,这条命令将比对已暂存文件与最后一次提交的文件差异。 git diff本身只显示尚未暂存的改动,而不是自上次提交以来所做的所有改动。
2.2.6提交更新
对于需要提交的文件,在添加入暂存区后,运行提交指令git commit。
- 直接运行
git commit会进入编辑器。默认的提交消息包含最后一次运行git status的输出,放在注释行里。 - 也可以在
git commit后添加-m选项。
2.2.7跳过暂存区域
只要在提交的时候,给git commit加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过git add步骤
2.2.8移除文件
用git rm命令可以将某个文件从已跟踪文件中移除,并连带着从工作目录中删除指定文件。
2.2.9移动文件
使用git mv file_from file_to,可以重命名指定文件为指定名称。
2.3查看提交历史
如果想要回顾提交历史,可以使用git log命令。
- 不传入任何参数的默认情况下,git log 会按时间先后顺序列出所有的提交,最近的更新排在最上面。
该指令有些常用选项:
- -p 或 -patch:会显示每次提交所引入的差异(按 补丁 的格式输出),还可以可以限制显示的日志条目数量,例如使用 -2 选项来只显示最近的两次提交。该选项除了显示基本信息之外,还附带了每次提交的变化。
- –stat:可以看到每次提交的简略统计信息,为 git log 附带一系列的总结性信息,在每次提交的下面列出所有被修改过的文件、有多少文件被修改了以及被修改过的文件的哪些行被移除或是添加了。
- –pretty:可以使用不同于默认格式的方式展示提交历史。
2.3.1限制输出长度
- -n(n是具体的任意整数):表示仅显示最近的 n 条提交。
- –since 和 --until:按照时间作限制,例如
git log --since=2.weeks。 - –author:显示指定作者的提交。
- –grep:搜索提交说明中的关键字
2.3.2隐藏合并提交
为了避免显示的合并提交弄乱历史记录,可以为 log 加上 --no-merges 选项。
2.4撤消操作
git commit --amend用于修改最后一次的提交。当执行这个命令后,它会打开一个编辑器来允许我们进行修改提交信息。
2.4.1取消暂存文件
要取消某个文件的暂存状态,可以使用git reset HEAD [filename]指令。
2.4.2撤回对文件的修改
要撤回对某个文件的修改,可以使用git checkout -- <file>...指令。
2.4.3注意
git checkout -- <file>...操作会让指定文件在本地的任何修改都会消失——Git 会用最近提交的版本覆盖掉它, 除非确实清楚不想要对那个文件的本地修改了,否则请不要使用这个命令。
2.5远程仓库的使用
2.5.1查看远程仓库
- 如果要查看已经配置好的远程仓库可以运行
git remote, 它会列出你指定的每一个远程服务器的简写。 - 使用-v选项,会显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL。
2.5.2添加远程仓库
添加远程仓库:除了使用git clone命令克隆远程仓库之外,您还可以使用git remote add命令手动添加一个远程仓库。通过这个命令,您可以指定一个缩写(例如 “pb”)来代替完整的远程仓库 URL。
2.5.3拉取远程数据
使用git fetch命令可以访问指定的远程仓库,并从中拉取所有本地还没有的数据。这个命令不会自动合并或修改当前的工作,它只是将数据下载到本地仓库,以便可以查看和合并。通过使用git fetch pb命令,可以从名为 “pb” 的远程仓库中获取数据。
2.5.4推送到远程仓库
使用git push [远程仓库名] [本地分支名],可以将本地的修改推送到远程仓库。例如,如果要将名为 “main” 的本地分支推送到名为 “origin” 的远程仓库,可以使用如下指令
git push origin main
2.5.5远程仓库的重命名与移除
使用git remote rename [old_name] [new_name],可以修改远程仓库的简写名。
使用git remote remove [name]可以移除指定远程仓库。一旦使用这种方式删除了一个远程仓库,那么所有和这个远程仓库相关的远程跟踪分支以及配置信息也会一起被删除。
2.6打标签
2.6.1列出标签
使用git tag可以列出已有的标签,可选参数有-l活-list。
2.6.2创建附注标签
使用git tag时,添加-a选项,即可创建附注标签。如下例子中,-a 选项指定创建一个附注标签(annotated tag),v1.4 是标签的名字,而 -m “my version 1.4” 选项为这个标签提供了信息或消息。这个消息可以用来描述这个标签背后的原因或意义。 如果没有-m参数为附注标签指定一条信息,Git 会启动编辑器要求你输入信息。
git tag -a v1.4 -m "my version 1.4"
2.6.3创建轻量标签
在Git中,轻量标签是最简单的标签类型,它仅仅是一个指向特定提交的引用。创建轻量标签的命令如下:
git tag <tag-name>
其中,<tag-name>表示要创建的标签名称。例如,要为最新的提交创建标签v1.0,可以执行以下命令:
git tag v1.0
这将创建一个轻量标签。请注意,轻量标签不需要传递参数,直接指定标签名称即可。轻量标签同样可以使用-m添加描述信息。
2.6.4删除标签
可以使用git tag -d命令来删除本地仓库中的标签。例如:
git tag -d <tag-name>
其中,<tag-name>是要删除的标签的名称。执行该命令后,Git将删除本地仓库中的指定标签。
如果需要删除远程仓库中的标签,可以使用git push命令将标签从本地仓库推送到远程仓库,然后使用git push --delete命令从远程仓库中删除标签。例如:
git push origin :refs/tags/<tag-name>
其中,<tag-name>是要删除的标签的名称。执行该命令后,Git将从远程仓库中删除指定标签。
简单实操:将本地文件上传至gitee远程仓库
由于网络问题,无法正常使用github,因此选择使用gitee平台进行操作。
- 创建gitee账号,并完成配置,(下面的用户名和邮箱非真实信息)。通过vim编译器打开config文件,可以看到结果正常。
git config --global user.name "ZhangSan"
git config --global user.email "123456789@qq.com"
- 初始化Git仓库,得到.git文件
git init
- 创建README.md文件和LICENSE文件
touch README.md
touch LICENSE
- 将本地文件全部add进暂存区域并使用status查看状态
git add .
git status
- 返回信息如下:
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: HelloWorld.py
new file: LICENSE
new file: README.md
new file: test.txt
- 提交内容至Git仓库
git commit -m "0.0.1"
- 返回信息如下:
[master (root-commit) 0ba8257] 0.0.1
4 files changed, 2 insertions(+)
create mode 100644 HelloWorld.py
create mode 100644 LICENSE
create mode 100644 README.md
create mode 100644 test.txt
- 添加一个远程仓库(远程仓库在gitee上创建好了)
git remote add helloworld https://gitee.com/xuanbai/gitstudy.git
- 使用
git remote -v查看信息,返回结果如下:
helloworld https://gitee.com/xuanbai/gitstudy.git (fetch)
helloworld https://gitee.com/xuanbai/gitstudy.git (push)
- 将本地仓库上传远程仓库中
git push helloworld "master"
- 返回内容如下:
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 20 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (4/4), 302 bytes | 302.00 KiB/s, done.
Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-6.4]
To https://gitee.com/xuanbai/gitstudy.git
+ e4c8933...0ba8257 master -> master (forced update)
- 去gitee仓库查看内容

成功上传本地文件至目标仓库
1644

被折叠的 条评论
为什么被折叠?



