Git学习笔记-1

本文详细介绍了Git的使用方法。Git记录每个版本,通过三棵树实现工作流程。介绍了快照回滚、修改最后一次提交、删除和重命名文件的操作。还阐述了Git分支的创建、切换、合并与删除,以及checkout和reset命令的区别,帮助开发者更好地使用Git进行版本控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Git记录的是什么

SVN记录的是每一次版本改动的内容

Git则是将每个版本独立保存

 

三棵树:

工作区域        Working Directory
    平时存放项目的地方
暂存区域        Stage(Index)
    临时存放改动(文件-列表信息)
Git仓库       Repository(HEAD)
    存放所有版本数据(HEAD指向最新版本数据)

 

Git工作流程

1.在工作目录中添加、修改文件
2.讲需要进行版本管理的文件放入暂存区域
3.将暂存区域的文件提交到Git仓库

操作:

#git config --global user.name "emm"
#git config --global user.email "3108775859@qq.com"
#git config --list

#git init
Initialized empty Git repository in D:/Git/.git/

**提交**
**添加到暂存区域**
#git add readme.md      
#git add 文件名
**暂存区域的文件提交到Git仓库**
#git commit -m "add a readme file"  
#git commit -m "说明"
    [master (root-commit) b0c07bc] add a readme file
     1 file changed, 1 insertion(+)
     create mode 100644 readme.md

查看状态:

#git status
    On branch master
    nothing to commit, working tree clean

创建LiCENSE之后

#git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

        LICENSE

nothing added to commit but untracked files present (use "git add" to track)
**未跟踪文件**

#git add LICENSE
#git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   LICENSE

**将暂存区域恢复到之前的状态**
#git reset HEAD 
#git status
**文件恢复状态**
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

        LICENSE

nothing added to commit but untracked files present (use "git add" to track)

#git commit -m "add a LICENSE file"
[master 3a7a1f1] add a readme file
 1 file changed, 6 insertions(+)
 create mode 100644 LICENSE

**还原暂存区域的文件**
#git checkout --文件名 

**如果文件添加到暂存区还没有提交的情况下再次修改了,那么需要在添加(add)一次再提交(commit)才能提交最新的版本**

查看历史提交记录

#git log

**SHA-1校检和**

commit 307d9cbebfb7b75b5404287129950333c1acf31f (HEAD -> master)    
Author: emm <3108775859@qq.com>
Date:   Wed Jun 19 22:00:47 2019 +0800

    edit LICENSE

commit 3a7a1f1b9e5af7596fc7458f982658c3f07b939c
Author: emm <3108775859@qq.com>
Date:   Wed Jun 19 21:59:14 2019 +0800

    add a readme file

commit 45923c289434b731c8c954bb0a5983c9a62931f8
Author: emm <3108775859@qq.com>
Date:   Wed Jun 19 21:44:12 2019 +0800

    add a readme file

commit b0c07bc2a8901d20a11aed2113fada013222d9a3
Author: emm <3108775859@qq.com>
Date:   Wed Jun 19 21:33:37 2019 +0800

    add a readme file

add把工作目录中的文件添加到暂存区

commit则是把暂存区里的文件添加到Git仓库

reset把Git指向的版本恢复到暂存区

checkout把暂存区的文件恢复到工作目录

 

快照回滚

**波浪线表示HEAD的上一个快照**
#git reset HEAD~    
#git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   LICENSE

no changes added to commit (use "git add" and/or "git commit -a")

reset命令的选项

#git reset --mixed HEAD~
**——移动HEAD的指向,将其指向上一个快照**
**——将HEAD移动后指向的快照回滚到暂存区域**

 

#git reset --soft HEAD~ 
**——移动HEAD的指向,将其指向上一次快照(撤销)**

 

** --hard 影响三棵树**
#git reset --hard HEAD~
**-移动HEAD的指向,将其指向上一个快照**
**-将HEAD移动后指向的快照回滚到暂存区域**
**-将暂存区域的文件还原到工作目录**
#会将工作目录的最新的文件覆盖掉

命令回滚快照三部曲

1.移动HEAD的指向(--soft)
2.将快照回滚到暂存区域([--mixed],默认)
3.将暂存区域还原到工作目录(--hard)

 

回滚到指定版本(可前可后)
#git reset 版本快照ID号

 

回滚个别文件
git reset 版本快照 文件名/路径

 

查看历史所有 commit ID

#git reflog
3a7a1f1 (HEAD -> master) HEAD@{0}: reset: moving to HEAD~
307d9cb HEAD@{1}: commit: edit LICENSE
3a7a1f1 (HEAD -> master) HEAD@{2}: commit: add a readme file
45923c2 HEAD@{3}: reset: moving to HEAD
45923c2 HEAD@{4}: commit: add a readme file
b0c07bc HEAD@{5}: commit (initial): add a readme file

 

 

比较暂存区域与工作目录

#git diff
**分别存放到两个文件夹**
diff --git a/LICENSE b/LICENSE
**类型和权限**
index bfe3cb4..dfe81cb 100644
**---代表旧文件(暂存区)**
**+++代表新文件(工作目录)**
--- a/LICENSE
+++ b/LICENSE
** -表示旧文件 +表示新文件 开始的行号 开始的行数 连续的行数**
@@ -1,4 +1,4 @@
** +新文件 **
-Copyright (C) 2019 emm
+Copyright (C) 2019 emm

比较两个历史快照

#git diff 快照ID1 快照ID2

比较当前工作目录和Git仓库中的快照

#git diff 快照ID

比较最新提交的快照和当前工作目录的快照

#git diff HEAD

比较暂存区域和Git仓库快照

#git diff --cached [快照ID]

 

修改最后一次提交

在实际开发中,可能会遇到以下两种情景:

——情景1:

版本刚一提交(commit)到仓库,突然想起漏掉两个文件还没有添加(add)。

 

——情景2:

版本刚一提交(commit)到仓库,突然想起版本说明写的不够全面

 

执行带 --amend 选项的 commit 提交命令。Git就会“更正”最近的一次提交。

比如:更正了一个readme,但是不想为了一个readme创建新的版本

#git commit --amend
vim操作
#git commit --amend -m "说明"
不会进入vim操作

 

删除文件

该删除命令只删除工作目录和暂存区域的文件,也就是取消跟踪,在下次提交时不会纳入版本管理。

#git rm 文件名 

 

#Git reset--soft HEAD

强制删除

#git rm -f 文件名

删除暂存区域文件,保留工作区域

#git rm --cached 文件名

 

重命名文件

修改文件名

#git mv 旧文件名 新文件名

 

Git分支

Git采用一种看似异端的形式来处理版本迭代的。

通常的版本控制系统采用增量文件系统的方式来管理版本迭代(新的快照存放的是旧版本修改后的那部分内容)

Git将每个版本都独立存储

创建分支

#git branch 分支名字

--decorate 让log显示指向提交的所有引用 #git log --decorate

切换分支

#git checkout 分支名

--oneline参数 只显示快照的id和说明(一行显示一个快照)

#git log --decorate --oneline

 

 

--graph 图像化显示

--all 所有分支全部显示

#git log --decorate --oneline --graph --all

 

实际开发中的分支

Hotfix

修补程序出现的bug

Master

用来发布

Release

内部发布版(测试完之后发布)

Develop

开发版(开发完之后编译成程序(就是Release))

Feature

相关的功能

 

分支的合并

比如,HEAD在master分支,想把feature分支合并到master

#git merge feature

发生冲突:

两个分支出现同名的文件,但是文件内容却不同

这个时候

#git status

会发现有东西需要修改

GitI在所有有冲突的文件打上标记

以等号(=)为界

合并之后再次提交一次

#git commit -m "说明文本"

创建并切换到分支

#git checkout -b 分支名

-b 创建并切换到分支

Fast-forward

只需要把 HEAD 指向更改

 

删除分支

#git branch -d 分支名

或者

#git branch --delete 分支名

分支的操作是修改指针的指向位置

Git的分支是用指针实现的

 

匿名分支

#git checkout HEAD~

这一段话的意思是,使用了checkout命令,但是没有指定分支名,所以git会创建一个叫做匿名分支(没有名字的分支)的东西,当你切换到别的分支的时候,在这个匿名分支中,所做的所有操作、提交都会被丢弃掉,所以可以使用匿名分支来做一些实验

 

checkout命令

checkout命令有两种功能:

1.从历史快照(或者暂存区域)中拷贝文件到工作目录

当给定某个文件名时,Git会从指定的提交中拷贝文件到暂存区域和工作目录。
比如执行
#git chekout HEAD README.md
命令会将上一个快照这能过的README.md文件复制到工作目录和暂存区域中

如果命令中没有指定具体的快照ID,则姜葱暂存区域恢复指定文件到工作目录
#git checkout README.md

如果恰好有一个分支叫做README.md,那么需要写成

#git checkout --README.md 

2.切换分支

Git的分支其实就是添加一个指向快照的指针,其次我们还知道切换分支除了
1.修改HEAD指针的指向
还会
2.改变暂存区域和工作目录的内容

 

checkout命令和reset命令的区别

 

恢复文件

checkout命令和reset命令都可以用于恢复指定快照的指定文件,并且它们都不会改变HEAD指针的指向

它们的区别是reset命令只讲指定文件恢复到暂存区域(--mixed)

checkout命令是同时覆盖暂存区域和工作目录

注意:

也许你试图使用
#git reset --hard HEAD~ README.md命令让reset同时覆盖目录,但是Git会告诉你这是徒劳的

(此时reset不允许--soft或者--hard选项)

恢复快照

reset命令

是用来“回到过去”的,根据选项的不同,reset命令将移动HEAD指针(--soft)->覆盖暂存区域(--mixed,默认)->覆盖工作目录(--hard)

 

chechout命令

虽说是用于切换分支,但是事实上也是通过移动HEAD指针和覆盖暂存区域、工作目录来实现的

 

他们的区别:

第一个区别是:

对与reset --hard命令来说,checkout命令更安全,因为checkout命令在切换分支前会检查一下当前的工作状态,
如果不是“clean”的话,Git不会允许你这样做,而reset --hard命令则是直接覆盖所有数据。

 

第二个区别是:

更新HEAD指向的方式。
reset命令会移动HEAD所在分支的指向
checkout命令只会移动HEAD自身来指向另一个分支

转载于:https://www.cnblogs.com/pipemm/articles/11056000.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值