type
status
date
slug
summary
tags
category
icon
password
什么是Git
Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
Git中的基本概念
我们先来理解下Git工作区、暂存区和版本库概念:
- 工作区:就是你在电脑里能看到的目录。
- 暂存区:英文叫stage或index。一般存放在.git目录下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
- 版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
- 远程仓库:就是如Github或者其他平台上发布的代码。
如何使用
配置用户
开始使用之前我们需要配置用户信息:
这里的用户名和邮箱可以乱填,仅仅是区分不使用者的作用。如果去掉 --global 参数只对当前仓库有效。
创建仓库
创建仓库有两种方法,一种是本地文件夹作为一个新的仓库,另一种的将远程仓库克隆到本地作为一个仓库。
创建新仓库
以当前目录仓库作为Git仓库,我们只需要将其初始化:
该命令执行完后会在当前目录生成一个.git目录。
检出仓库
即使用git clone从现有Git仓库中拷贝项目。执行如下命令以创建一个本地仓库的克隆版本:
如果是远端服务器上的仓库,你的命令会是这个样子:
提交与修改
你对文件完成更改之后,便可以将他们提交(把它们添加到暂存区),使用如下命令:
如果文件过多,一个一个修改过于麻烦,也可以一次性提交所有文件:
当多次提交后我们无法记得每次提交都修改了些什么内容,我们可以在提交完后写上一些备注:
这样,我们在之后就可以很方便的了解每次提交都修改了些什么内容,我们可以使用以下操作来查看历史提交记录(包括提交人,提交时间,内容备注):
这个命令还可以添加很多参数来提供更为详细的信息:
参数 | 说明 |
-p | 显示提交的补丁(具体更改内容)。 |
--oneline | 以简洁的一行格式显示提交信息 |
--graph | 以图形化方式显示分支和合并历 |
--decorate | 显示分支和标签指向的提交 |
--author=<作者> | 只显示特定作者的提交 |
--since=<时间> | 只显示指定时间之后的提交 |
--until=<时间> | 只显示指定时间之前的提交。 |
--grep=<模式> | 只显示包含指定模式的提交消息。 |
--no-merges | 不显示合并提交。 |
--stat | 显示简略统计信息,包括修改的文件和行数。 |
--abbrev-commit | 使用短提交哈希值。 |
--pretty=<格式> | 使用自定义的提交信息显示格式。 |
除此之外,我们还可以以列表形式查看指定文件的历史修改记录:
每次提交后都有一个commit id,我们通过历史提交记录可以获取每次的commit id,这个commit id可以帮助我们查看这次提交到底修改了哪些内容:
代码回溯
前面说了可以查看项目的历史版本,这显然不够用,有时候我们还会有回到某一历史版本的需求,下面两条指令均可以完成我们的需要:
分支
Maser分支是由git自动创建的,一般用来保存经过测试的稳定代码,一般不轻易改动,我们用下面这个命令可以查看当前都有哪些分支。
我们可以使用下面这个命令来创建一个新的分支,并切换到新的分支完成新功能的开发:
除非将分支推送到远端仓库,不然别人是看不见这个分支的。
当你切换分支的时候,Git会用该分支的最后提交的快照替换你的工作目录的内容,所以多个分支不需要多个目录。
当我们完成新的开发时,需要将我们创建的分支的代码合并到Master分支上
远程操作
下面是工作区,暂存库和远程仓库三者之间的关系。
本地仓库修改完成后我们可以手动推送到远程仓库:
总结
个人感受
作为一个刚开始学习 Git 的初学者,起初我觉得它有点复杂,尤其是各种命令和概念,比如工作区、暂存区和版本库,让人有些摸不着头脑。不过使用的增加,git其实很有用,甚至可以说是开发中不可缺少的工具。
为什么要用 Git?
在写代码的时候,经常会遇到改了半天发现不如原来的好,甚至不小心把重要的代码删了。这时候如果没有备份,就只能重写,真的是一件让人崩溃的事。而有了 Git,就相当于给每次改动都存了备份,随时可以回到过去的某个版本。这种感觉只能用爽来形容。
分支的作用
在原有代码的基础上开发新功能时,可以开一个新的分支去尝试,这样担心会影响到主分支的稳定代码。等新功能完成并测试好,再把它合并到主分支上。
怎么减少 git 冲突
当不同的人在同一个文件的同一行做了修改时,Git 会让你手动选择保留哪一部分,其实 git 也不知道以谁的为准,所以需要手动来解决这个问题。
关于这个问题,其实可以多进行
git pull
,这是一个减少冲突发生概率的操作。当你要对一行代码进行改动时,先拉取,如果对方改了,是对的就不用改了;如果是错的,改了在退上去也不会触发冲突。我觉得还有一个其他的解决方案就是提 pr,通过合并分支来解决这个问题。
参考文献
- Author:Serendipity
- URL:https://serendipity565.netlify.app//article/Git%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!