Git基础
常用命令
- 创建仓库
命令 | 说明 |
---|---|
git init | 初始化仓库 |
git clone | 克隆远程仓库 |
- 提交与修改
命令 | 说明 |
---|---|
git add | 添加文件到暂存区 |
git status | 查看仓库当前的状态,显示有变更的文件 |
git diff | 比较文件的不同,即暂存区和工作区的差异 |
git commit | 提交暂存区到本地仓库 |
git reset | 回退版本 |
git rm | 将文件从暂存区和工作区中删除 |
git mv | 移动或重命名工作区文件 |
git checkout | 分支切换 |
git switch | 更清晰地切换分支 |
git restore | 恢复或撤销文件的更改 |
- 提交日志
命令 | 说明 |
---|---|
git log | 查看历史提交记录 |
git blame | 以列表形式查看指定文件的修改记录 |
- 远程操作
命令 | 说明 |
---|---|
git remote | 远程仓库操作 |
git fetch | 从远程获取代码库 |
git pull | 下载远程代码并合并 |
git push | 上传远程代码并合并 |
Git工作流程
工作区,暂存区和版本库
在开始学习Git命令之前,需要了解一下工作区,暂存区,版本库这三个概念。工作区、暂存区和版本库是Git版本控制系统中的三个核心概念,它们共同协作,实现了代码的版本管理和控制。
- 工作区(Workspace):这是你在电脑中能直接看到的目录,也就是你进行代码编写、修改的地方。在工作区中,你可以对文件进行增删改查等操作。
- 暂存区(Stage/Index):暂存区是一个中间区域,它位于工作区和版本库之间(存放于
.git/index
)。当你对工作区的文件进行修改后,这些修改并不会直接反映到版本库中,而是先被放入暂存区。你可以使用git add
命令将工作区的文件添加到暂存区。暂存区的作用主要是为了让用户有机会在提交之前再次确认哪些文件需要被版本控制,以及它们的修改内容。
- 版本库(Repository):版本库是Git用来存储所有版本信息的地方,它是一个隐藏目录(默认为.git)。版本库中保存了项目的所有历史记录,包括每一次提交的元数据和文件内容。在版本库中,所有的文件都被以特定的格式存储,以便Git能够高效地管理和追踪文件的变化。
在Git的工作流程中,通常会先在工作区进行代码的编写和修改,然后使用git add
命令将需要提交的文件添加到暂存区,最后使用git commit
命令将暂存区的文件提交到版本库。这样,就完成了一次版本的更新。
文件状态
在工作区的工作目录中,每一个文件的状态不外乎两种状态:已跟踪或未跟踪。
已跟踪文件:是指被纳入了版本控制的文件,在上一次快照中有他们的记录,在工作一段时间后,它们的状态可能是未修改,已修改或者已放入暂存区的。(已跟踪其实就是git add 过的了)。
未跟踪的文件:就是没有被版本控制过的文件。
下图为:文件的状态周期变化
在Git仓库中,文件分为以下几种状态:
Untracked
:未跟踪,这意味着文件存在于文件夹中,但尚未被加入到Git库,因此不会参与版本控制。如果希望这个文件能被Git追踪,可以使用git add命令将其添加到Git仓库。Unmodified
:文件已经入库且未修改,即版本库中的文件快照内容与文件夹中的文件完全一致。这种文件有两种可能的变化:如果文件被修改,它将变为Modified状态;如果文件被从Git库中移除(使用git rm命令),它将回到Untracked状态。Modified
:文件已修改,但尚未进行其他操作。这种文件有两种可能的变化:通过git add命令,可以将文件添加到暂存区(Staged状态),或者通过git checkout命令,可以撤销修改,使文件回到Unmodified状态。Staged
:暂存状态。在这种状态下,文件已经被标记为准备提交,但尚未执行git commit命令。执行git commit后,修改将被同步到Git库中,这时库中的文件和本地文件将再次变得一致。
此外,在提交之前,文件还可能处于以下状态:
Changes not staged for commit
:表示文件已经被修改,但还没有放入暂存区域,也没有生成快照。这些修改可以通过git add命令添加到暂存区,或者通过git checkout命令撤销。Changes to be committed
:表示文件已经在暂存区生成了快照,等待被提交。这时,可以使用git commit -m "注释"命令来提交文件。在这个状态下,文件也可以继续被修改,或者通过git rm --cached 文件名命令,将文件状态还原为Untracked状态。
获取Git仓库 git init
| git clone
获取Git仓库的两种方式:
- 将尚未进行版本控制的本地目录转换为Git仓库。
git init
- 从其他服务器克隆一个已存在的Git仓库。
git clone 仓库地址
# 1. 将未进行版本控制的目录转换为Git仓库
cd /xxx/project
# 初始化git仓库
git init
# 2.克隆现有的仓库
git clone "git仓库地址"
为了方便演示,我在Gitee码云上创建了一个新的仓库,仓库地址是https://gitee.com/zhweb2022/demo-git.git
设置一下远程仓库地址 git remote add origin https://gitee.com/zhweb2022/demo-git.git
查看文件状态 git status
如何查看当前文件的状态?git status
新增文件,使用git status
查看状态,窗口输出README.md文件状态是未跟踪的,即这个文件存在于文件夹中,但是尚未加入到git仓库中。
初始文件内容为:
# Git命令练习
```bash
git init
暂存已修改的文件 git add
使用 git add README.md
将README.md文件提交到本地git仓库中,此时文件状态为changes to be committed
表示当前文件已经在暂存区中生成了快照,等待被提交到远程仓库。
查看已暂存和未暂存的修改 git diff
往README.md文件中添加一些内容,再次查看文件状态git status
,此时会出现两个状态树,一个是我们之前的README.md一个是修改后的README.md,Changes not staged for commit
表示文件已经被修改但是尚未提交到暂存区,README.md的文件状态是modified
表示文件被修改,但尚未执行其他操作。
查看一下,此次README.md文件新增了哪些内容,使用git diff
来查看。
新的README.md的完整内容如下:
# Git命令练习
```bash
git init # 初始化创建仓库
git add 文件名 # 将文件进行版本控制
git status # 查看当前目录的文件状态
我们将README.md的改动进行暂存 git add README.md
,任何文件改动(未跟踪或者已经跟踪但是改动的),每次都需要使用git add 文件名
进行暂存
提交文件更改 git commit
使用git commit -m "README.md"
将README.md文件提交到本地仓库,再次使用git status
进行文件状态查看,可见README.md成功提交到本地仓库。
我们再进行一次改动README.md,并且进行提交
# Git命令练习
```bash
git init # 初始化创建仓库
git add 文件名 # 将文件进行版本控制
git status # 查看当前目录的文件状态
git commit -m "提交描述" # 将当前暂存区中的内容提交到本地仓库中
- 首先,使用
git status
查看了一下当前文件状态 - 然后使用
git add README.md
将文件改动暂存到缓冲区中 - 将暂存区的文件提交到本地仓库,使用
git commit -m "描述"
- 再次查看文件状态
git status
移除文件 git rm
首先,在当前文件夹下新增一个rm_txt.txt文件,然后将其添加到暂存区中,接着提交到本地仓库。
然后我们将rm_txt.txt文件进行移除,使用git rm
命令,并且查看文件状态git status
,发现rm_txt.txt文件已经被删除了,然后我们提交此次的更改。
移动文件-文件重命名 git mv
我们将README.md文件重命名为readme.mdgit mv README.md readme.md
,然后查看一下文件状态git status
,并且更新暂存改动git add readme.md
,最后进行此次的改动提交git commit -m "README.md重命名"
查看提交历史 git log
现在,我们已经提交了多次更改,那么如何查看我们提交的历史记录呢,使用git log
命令即可进行查看,它会按照时间进行显示。
远程仓库的使用【配置和查看】git remote
添加远程仓库的命令 git remote add origin https://gitee.com/zhweb2022/demo-git.git
。
因为我在一开始就已经配置过远程仓库了,那么来查看下当前的远程仓库git remote
和git remote -v
使用git remote
会看到控制台输出 origin
这是因为Git仓库服务器的默认名字就是 origin
.
使用git remote -v
则可以看到读写远程藏剑使用的git及其url.
远程仓库的拉取和推送 git pull
git fetch
& git push
推送
因为我的远程仓库是空的,我就先演示如何推送到远程仓库。
使用命令**git push origin master**
进行推送到远程仓库,这段命令的意思就是将本地仓库中的内容提交到origin服务器的master主分支上。(刚刚已经提到过origin就是Git对远程仓库的默认名称)
推送之后,我们便可以在Gitee码云仓库上看到了。
并且每次提交的改动,也可以看到
拉取
git fetch
从远程仓库中获取数据,拉取到本地,使用git fetch
命令,git fetch
的基本语法是 git fetch [options] [repository] [refspec...]
。其中,[options]
是可选的命令行选项,[repository]
是远程仓库的名称或URL,[refspec...]
用于指定要获取的分支和标签。
首先,我们创建一个新的文件夹demo-git-fetch
用于测试拉取远程仓库的master分支。
先初始化一个本地仓库git init
,然后配置一下远程仓库地址 git remote add origin https://gitee.com/zhweb2022/demo-git.git
远程仓库地址配置完成后就可以使用git fetch
命令进行拉取了
拉取完成之后合并到本地即可 git merge 本地分支名称
git pull
git pull
命令的作用是拉取并合并,等同于 git fetch
+ git merge
补充-撤销操作
在任何阶段,都可能会需要撤销操作。
git commit --amend
提交撤销git reset
回退,撤销文件的的暂存git checkout --<file>
撤销对文件的更改(谨慎使用)
练习一下:我们逐个练习提交撤销,文件暂存撤销,文件更改撤销
① 提交撤销(本质上是利用新的提交覆盖旧的提交)
首先,新建两个文件test1.txt
和test2.txt
,并将test1.txt
提交git commit
,此时test2.txt
尚未提交,所以我们将test2.txt
进行版本控制,然后撤销提交重新提交。
下图是我们使用 git commit --amend
时弹出的信息,我们可以在这里进行编辑重新提交的描述,它会将我们当前暂存区中的全部内容作为新的 changes to be committed
② 文件暂存撤销回退 git reset
新建文件test3.txt,将test3.txt提交到暂存区中,然后撤销回退(哈哈哈,和Ctrl + Z
神似)。
③ 文件更新回退 git checkout -- 文件名
新建文件test4.txt,将其暂存git add test4.txt
,然后更改内容(添加一段文件 ”hello world“),最后撤销git checkout -- test4.txt
test4.txt更新的内容
Git分支管理
一个分支代表一条独立的开发线,使用分支意味着可以从开发主线上分离开来,然后在不影响主线的同时继续工作。
创建分支 git branch (branchname)
切换分支 git checkout (branchname)
:切换分支时,Git会用该分支的最后提交快照替换当前的工作目录的内容,所以多个分支不需要多个目录。
合并分支 git merge
:将多个分支合并到同一个分支,
删除分支 git branch -d (branchname)
查看当前的分支
Tips:当初始化仓库
git init
时,Git会默认创建一个master
分支
使用git branch
命令即可列出当前Git仓库的分支
创建分支
使用git branch branchname
即可手动创建一个新的分支
切换分支
使用命令git checkout (branchname)
就可以切换不同的分支。当我们可以切换分支时,就可以开始搞事情啦!
从控制窗口就可以清楚的看到,当前的操作的分支是哪一个,如下图:
开始搞事情!!!
首先,我们在工作区中新建三个文件,分别是testbranch1.txt``testbranch2.txt``tetsbranch3.txt
我们将新增的三个文件,通通保存到暂存区,然后提交到testbranch1分支上
接着,神奇的一刻发生了,我们重新切换分支到master主分支上git checkout master
,发现我们对testbranch1分支做的操作”好像都没了!“,这其实就是分支的特点,正如疑问所说,操作都在testbranch1分支中保存着。
分支合并
经过上面的操作,我们已经初步了解了分支的概念及使用,那么,如何将刚刚在testbranch分支上保存的操作也添加到master分支上呢?
答案是:合并分支!
使用git merge <branchname>
命令,即可进行分支合并,它可以将任何分支或者是指定的分支合并到当前的分支中去。
试一试:将testbranch1分支的内容合并到master分支中(注意:记得切换到master主分支,再进行操作哦)。
合并冲突
前面虽然也完成了分支的合并,但是真实的情况下,要比这复杂,多个分支都会对共有的文件进行操作,那么多个分支都操作了多次以后,我们如何进行合并这些冲突。
举个栗子:用master分支对testbranch1.txt文件进行更改,然后再切换到testbranch1分支,也对testbranch1.txt文件进行更改,最后在master分支上,进行分支合并。
① master 分支对 testbranch1.txt 文件进行更改
暂存更新内容,然后从master分支上面提交
② 切换到testbranch1分支中
同样我们对testbranch1.txt文件进行操作
此时,两个分支都对testbranch1.txt进行了操作,接下来我们开始合并分支冲突
③ 分支冲突合并
首先切换到master分支git checkout master
,然后我们试着以之前的方式合并一下git merge testbranch1
提一嘴:git中很多基础命令和linux意思功能一致,我就不过多赘述了。
看到提示不慌,我们再看一下testbranch1.txt中的内容。原来,刚刚分支合并也是做了一点事情,它会将不同分支做的操作,输出到有冲突的文件中。
接着我们使用vim
命令进行更改testbranch1.txt
中的内容,只需要将文件改为正确的样子(预期的样子)即可,记得保存 ESC + : 然后 wq
最后,将文件的改动进行暂存git add testbranch1.txt
然后提交到合并分支上git commit -m "分支冲突合并"
即可。
其实,看完上面这张图就明白了,分支冲突和并的本质也是用新的文件内容去覆盖旧的冲突内容,然后将新的内容提交到合并分支上。
Git 标签
Git标签:标签,经常用来记录某个版本或者阶段,用以标识区分。
查看标签
使用git tag
即可查看当前Git仓库的标签
新建标签
标签分为 附注标签和轻量标签两种。
附注标签的创建方式:git tag -a 标签名 -m "详细描述"
轻量标签的创建方式:git tag 标签名
删除标签
删除标签使用命令 git tag -d <tagname>
即可删除标签
练习一下
在练习之前先将我们的仓库进行推送一下,将两个分支都推送到远程仓库。
git push origin master # master分支下
git checkout testbranch1 # 切换分支
git push origin testbranch1 # 推送新的分支到远程仓库
推送完毕,打个标签V1.0
,新增个testTag.txt
,再推送一下吧!