Git 系统学习笔记(二)

简介: 版本控制是一种记录一个或若干个文件内容变化、以便将来查阅特定版本修订情况的系统。

Git 初次接触


查看版本&查看配置

git --version
git config --list
// 查看单独某项配置
git config user.name
复制代码


配置

git config --global user.name "coderLi"
git config --global user.email "coderLi@xxx.com"
复制代码


如果使用了 --global 选项、那么该命令只需要运行一次、因为之后无论你在该系统上做任何事情、Git 都会使用那些信息。

由于 Git 会从多个文件中读取同一配置的变量的不同值。可以通过查询 Git 中该变量的原始值、它会告诉你哪一个配置文件最后设置了该值

git config --show-origin user.name
file:/Users/coderLi/.gitconfig  coderLi
复制代码


获取帮助

git help <verb>
git <verb>--help
man git-<verb>
git add -h
复制代码


Git 基础


  • 配置并初始化一个仓库
  • 开始或停止跟踪文件
  • 暂存或提交更改


获取仓库

获取 Git 仓库通常有两种方式

  • 将尚未进行版本控制的本地目录转为 Git 仓库
  • 从其他服务器克隆一个已存在的 Git 仓库


初始化仓库
cd /Users/user/my-project
git init
复制代码

该命令创建一个名为 .git 的字幕了、这个子目录有你初始化 Git 仓库中所有的必须文件、这些文件是 Git 的仓库骨干。

如果该文件夹下有问价需要进行版本控制、你应该开始追踪这些文件并进行初始提交。

可以通过 git add 命令来制定所需的文件进行追踪、然后执行 git commit

git add *.java
git add readme.md
git commit -m 'initial project version'
复制代码


克隆现有的仓库

这时就要使用 Git clone 命令、如果你对其他 VCS很熟悉、请留意一下你所使用的命令是 “clone” 而不是 “checkout” 。这是 Git 区别于其他吧版本控制系统的一个重要特性、Git 克隆的是 Git仓库服务器上的几乎所有数据、而不是仅仅复制完成你的工作所需要的文件。当执行 git clone 命令时、默认配置下原创 Git 仓库中的每一个文件的每一个版本都将被拉取下来。事实上、如果你的服务器磁盘坏掉了、你通常可以使用任何一个克隆下来的用户端重建服务器上的仓库

# git clone <url>
git clone https://github.com/libgit2/libgit2
复制代码

会在当前目录下创建一个名为 libgit2 的目录、并在这个目录下初始化一个.git 文件夹、从远程仓库拉取下所有数据放入.git 文佳佳、然后从中读取最新版本的文件拷贝。如果你进入到新建的这个libgit2 文件夹中、你会发现所有的项目文件已经在里面了、准备就绪等后续开发和使用。

如果你想自定义本地仓库等名字、可以通过额外参数指定

git clone https://github.com/libgit2/libgit2 mylibgit
复制代码

本地仓库名就变为了 mylibgit


记录每次更新到仓库

工作目录下的每个文件都不外乎这两种状态:

  • 已跟踪、是指那些被纳入了版本控制的文件、在上一次快照中有它们的记录、在工作一段时间之后、它们的状态可能是未修改、已修改或已经放入暂存区。简而言之、已跟踪的文件就是 GIt 已经知道的文件
  • 工作目录中除已跟踪文件外其他的文件都属于未跟踪文件、它们既不存在上一次的快照中、也米有被放入暂存区。初次克隆某个仓库时、工作目录中的所有文件都属于已跟踪文件、并处于未修改状态

网络异常,图片无法展示
|


检测当前文件状态

git status 命令产看哪些文件处于什么状态


跟踪新文件

git add README
复制代码

使用 git add 开始跟踪一个文件、并将其放入到暂存区。如果此时提交、那么该文件在你运行 git add 时的版本将被留存在后续的历史记录中。git add 命令使用文件或目录的路径作为参数、如果参数时目录的路径、该命令将递归地跟踪该目录下的所有文件


暂存已修改的文件

git add 是一个多功能命令、可以用它来跟踪新文件、或者把已跟踪的文件放入暂存区、还能用于合并时把有冲突的文件标为已解决状态。

这个命令可以理解为:精确地将内容添加到下一次提交中。


状态概览

git status 命令输出十分详细、但其用于有些繁琐、使用 git status -s 简化输出方式


忽略文件

一般我们总有一些文件无需纳入 Git 的管理、也不希望它们出现在未跟踪文件列表中。在这种情况下、我们可以创建一个名为.gitignore的文件、列出要忽略的文件的模式。

*.[oa]
*~
复制代码

第一行告诉 Git 忽略所有以.o或.a 结尾的文件。

第二行告诉我们忽略所有名字以~结尾的文件。


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

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

若要查看已暂存的将要添加都下次提交里的内容、可以使用 git diff --staged 命令、git diff --cached

需要注意的是、git diff 本身只现实尚未暂存的改动、而不是自上次提交以来所做的所有改动。所以如果你一下子暂存了所有更新过的文件、运行 git diff 后却什么也没有、就是这个原因。


提交更新

现在暂存区已经准备就绪、可以提交了。

git commit -m 'information'
复制代码


跳过使用暂存区

尽管使用暂存区域的方式可以精心准备要提交的细节、但有时候这么做显得繁琐、Git 提供了一个跳过使用暂存区域的方式、只要在提交时、在 git commit 加上 -a 选项、Git 就会自动把所有已经追踪过的文件暂存起来一并提交、从而逃过 git add 步骤。


移除文件

从 Git 中移除某个文件、就必须从暂存区中移除、然后提交。git rm 命令可以完成此项工作、并连带从工作目录中删除置顶文件、这样以后就不会出现在未跟踪文件清单中了。

$ls 
DijkstraJourneyGeneratorTest.java cassandra       redis
Generic.java        ehcache         repository
$git rm Generic.java
$git status
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
  deleted:    Generic.java
复制代码


如果只是单纯的在工作目录中删除文件、而没有对齐进行提交、是不能在 Git 中删除该文件的

$ls
DijkstraJourneyGeneratorTest.java cassandra       redis
Generic.java        ehcache         repository
$rm Generic.java
$git status
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
  deleted:    Generic.java
复制代码


这个时候你还是要执行 git rm Generic.java 来将这个删除添加到暂存区

如果要删除已经放到暂存区的文件、则必须使用强制删除项 -f

$ vi Generic.java 
$ git add Generic.java 
复制代码


第一步我们修改了 Generic.java 这个文件、然后将其放入到暂存区、但是这个时候我们想删除这个 Generic.java 文件并且想将此次提交到暂存区的版本也删除掉

$git rm -f Generic.java
$git status
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
  deleted:    Generic.java
复制代码


这个时候、我们工作目录下也删除了 Generic.java 的问价、并且刚刚修改Generic.java的版本也在暂存区中删除了。


移动文件

git mv file_from file_to
复制代码
$git mv Generic.java Generic01.java
$git status
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
  renamed:    Generic.java -> Generic01.java
复制代码


其实运行 git mv就相当于运行了下面三条命了

$mv Generic.java Generic01.java
$git rm Generic.java
$git add Generic01.java
复制代码


查看提交历史

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

git log 有很多选项帮助你搜寻你所要查找的提交、其中最有用的就是 -p/-patch 选项、它会显示每次提交所引入的差异(按补丁格式显示)。

也可以限制显示日志的条目数量、例如使用 -2 显示最近的两次提交。


撤销操作

在任何一个阶段、你都有可能想要撤销某些操作。有时候我们提交完了才发现漏掉了几个文件没有添加、或者提交信息写错了、此时、可以使用带有 --amend 选项来提交命令重新提交

git commit -m 'renew' -amend
复制代码

这个命令会将暂存区中的文件提交、如果自上次提交以来你还未做任何修改、那么快照将会保持不变、而你修改的只是提交信息。

最终只会有一个提交、而第二次提交将会代替第一次提交的结果。 第一次的提交就像从未存在过一、它并不会出现在仓库的历史中。


取消暂存的文件

git add -A
git status
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
  .....
  .....
复制代码


我们可以使用该命令将暂存区的版本删除掉

git restore --staged xxx.java
复制代码


撤销对文件的修改

同样也是使用 git restore xxx.java


撤销commit

当我们想撤回一个本地的 commit 的时候、怎么办

可以使用 git reset HEAD^ 这样就可以成功撤销你的 commit

head^ 等同于 head~1 表示git 仓库的上一个版本
如果你提交了两个 commit 都想撤回、可以使用 head~2 表示
复制代码

还可以在这个命令中加上选项参数

  • --mixed 不删除工作空间改动代码、撤销 commit 并且撤销 git add 操作、默认使用就是这个参数
  • --soft 不删除工作空间改动代码、撤销 commit、但是不撤销 git add
  • --hard 删除工作空间改动代码、撤销 commit、撤销 git add 相当于回到上一次commit状态

blog.csdn.net/w958796636/…


git checkout

git checkout 最常见的用法莫过于对工作分支的切换了

git checkout branchName
# 该命令会将当前工作分支切换到 branchName中
复制代码


也可以通过下面的命令在新分支创建的同时切换分支

git checkout -b newBranch
复制代码


该命令相当于

git branch newBranch
git checkout newBranch
复制代码


该命令完整语法为

git checkout -b new-branch-name copy-branch
复制代码


该命令的主要关联目标其实是.git文件夹下的HEAD文件、HEAD文件记录了当前HEAD的信息

扩展用法

git checkout yyy.java
git checkout origin/master xxx.java
复制代码


该命令主要用于检出某一个指定文件。如果不填写 commit id、则默认从暂存区检出该文件、如果暂存区为空、则该文件会回滚到最近一次提交状态

也可以指定从远程分支中checkout某个文件

www.jianshu.com/p/cad4d2ec4…

远程仓库的使用

查看你已经配置的远程仓库服务器、可以使用 git remote 命令、它会列出你指定的每一个远程服务器的简写。如果你已经克隆了自己的仓库、那么至少应该能看到origin、这是 Git 给你克隆仓库服务器的默认名字

git remote
# 显示对应的 url
git remote -v
复制代码

添加远程仓库可以使用 git remote add  

从远程仓库中抓取和拉取
  • git fetch 命令只会将数据下载到你的本地仓库--它并不会自动合并或修改你当前的工作空间、当准备好时你必须手动将其合并
  • git pull 通常会从最初克隆的服务器上抓取数据并自动尝试合并到当前所在的分支

推送到远程分支

git push origin master
复制代码

可以使用命令查看远程仓库的情况

git remote show orign
复制代码

网络异常,图片无法展示
|


打标签

Git 可以给仓库历史中的某个提交打上标签、以示重视。Git 支持两种标签、一种是轻量级标签、一种是附注标签。

轻量级标签很想一个不会改变的分支--它只是某一个特定提交的饮用

而附注标签是存储在 Git 参考中的一个完整对象、它是可以被检验的、其中包含打标签的行吗、电子邮件地址、日期时间、还有标签信息。

通常会建议创建附注标签。

  • 列出标签 git tag -l
  • 创建标签 git tag tagName / git tag -a tagName -m 'message about tag'。加上 -a 创建的是附注标签、不加上的是一个轻量级标签
  • 展示某个标签内容 git show tagName
  • 删除标签 git tag -d tagName

默认情况下、git push 命令并不会传送标签到远程仓库服务器上。在创建万标签后你必须显示地将标签推送到服务器上、这个过程就行你共享远程分支一样。git push orign tagName

目录
相关文章
|
7月前
|
Shell Linux 开发工具
Git入门(windows系统)
Git入门(windows系统)
74 1
|
1月前
|
Linux 网络安全 开发工具
Git学习笔记(一):基础与应用
本文档详细介绍了如何将本地项目关联到Gitee上的空仓库并上传代码,以及如何验证本机与Git服务器的SSH连接。同时,还概述了Git的基本概念、安装步骤、初始配置、常见命令及如何配置多个SSH-Key,适用于初学者快速上手Git操作。
108 51
Git学习笔记(一):基础与应用
|
4月前
|
敏捷开发 存储 开发工具
版本控制系统的选择:Git与SVN的比较
【8月更文挑战第14天】Git和SVN都是优秀的版本控制系统,它们各自具有独特的优势和适用场景。在选择版本控制系统时,需要根据具体的项目需求、团队特点和开发模式来综合考量。对于需要分布式团队协作、高效处理大型项目或采用敏捷开发模式的团队来说,Git是一个更好的选择。而对于传统团队、集中式开发或简单项目来说,SVN可能更加合适。无论选择哪种版本控制系统,都应该充分利用其提供的工具和功能来提高代码质量和开发效率。
|
1月前
|
数据可视化 开发工具 git
如何解决 Git 版本控制系统中冲突的问题?
在Git版本控制系统中,冲突是指在合并或拉取操作时,两个或多个开发者对同一文件的同一部分进行了不同的修改,导致Git无法自动确定应该采用哪种修改。
35 1
|
6月前
|
缓存 开发工具 git
windows系统通过git上传代码
windows系统通过git上传代码
47 1
|
4月前
|
安全 Linux 开发工具
Git学习笔记
这篇文章是一份Git学习笔记,涵盖了Git的基本命令、工作流程、项目搭建、文件状态管理,以及如何使用码云和IDEA进行版本控制操作。
Git学习笔记
|
7月前
|
Shell 网络安全 开发工具
Git学习笔记
Git学习笔记
140 1
Git学习笔记
|
4月前
|
开发工具 git
【Mac 系统】解决git clone速度慢
本文提供了解决Mac系统上使用git clone时速度慢的问题的方法。
167 0
|
5月前
|
存储 安全 开发工具
Git学习笔记 三个区域、文件状态、分支、常用命令
理解并掌握这些概念和命令,对于有效地使用Git来管理项目源代码是至关重要的。Git的强大功能支持了复杂的开发工作流程,而良好的Git实践能够极大地提高团队的协作效率。随着实践的增多,对于Git更深层次的功能和最佳实践的理解也会随之增长,进一步加强你作为一个软件开发者的能力。
77 0
|
6月前
|
Linux 持续交付 开发工具
版本控制系统的选择:Git vs. Mercurial
【6月更文挑战第20天】Git vs. Mercurial: 两者都是流行的DVCS,Git由Linus Torvalds创建,以其速度和复杂分支管理著称,适合大型项目和有经验的开发者。Mercurial,由Matt Mackall开发,以其简洁命令行和易用性吸引初学者。Git社区更大,扩展更丰富,而Mercurial在某些场景下可能更直观。选择取决于项目需求、团队经验和偏好。