对Git更深入了解与学习
- 0. 前言
- 0.1 工作区与暂存区
- 1. git remote update origin
- 2. git push origin --delete 分支名 删除远端分支
- 3. git remote
- 4. git fetch
- 5. git status
- 5.1 git status 直观理解
- 5.2 暂存与暂存取消 (git restore)
- 5.3 push之后
- 6. git reset详解 (版本回退方法之一)
- 6.1 git reset --soft HEAD^
- 6.2 git reset --hard 撤销
- 6.2.1 例子1 ` git reset --hard HEAD~1`
- 6.2.2 例子2 `git reset --hard <commit-hash>`
- 6.3 后悔药
- 7. git diff 代码比较
- 8. git revert (版本回退方法之一)
- 9. git stash 工作目录中的修改保存到一个临时的存储区域中
- 10.代码合并 `git merge --no-ff`
- 11. git cherry-pick
0. 前言
官方文档https://git-scm.com/book/zh/v2/Git-分支-分支简介
0.1 工作区与暂存区
1.工作区(Working Directory)
工作区就是你在电脑里能看到的目录,比如我的learngit
文件夹就是一个工作区:
2.版本库(Repository)
工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)
的暂存区,还有Git为我们自动创建的第一个分支master
,以及指向master
的一个指针叫HEAD
。
把文件往Git版本库里添加的时候,是分两步执行的:
- 第一步是用
git add
把文件添加进去,实际上就是把文件修改添加到暂存区; - 第二步是用
git commit
提交更改,实际上就是把暂存区的所有内容提交到当前分支。
参考:https://www.liaoxuefeng.com/wiki/896043488029600/897271968352576
1. git remote update origin
git remote update origin
它的作用是更新本地仓库中远端仓库 origin 的引用。这个命令会从远程仓库 origin 中获取最新的版本信息,让后将信息更新到本地仓库,但它并不会修改你的工作目录或当前分支。
在开发中这个命令主要就是远端新建分支,本地拉取新分支,会在本地建一个与远端名字一样的分支,并进行关联。
我在远端拉取了一个新分支test1(源自master)
,但是本地执行git branch -r
时并没有该分支,执行git remote update origin
后,新分支就出现了。
2. git push origin --delete 分支名 删除远端分支
删除远端分支之后,本地的分支并不会被删除。
fanzhen@fanzhendembp-2 straw % git push origin --delete test1
remote: Powered by GITEE.COM [GNK-6.4]
To https://gitee.com/Blue_Pepsi_Cola/straw.git- [deleted] test1
fanzhen@fanzhendembp-2 straw % git branch -rorigin/HEAD -> origin/masterorigin/devorigin/master
fanzhen@fanzhendembp-2 straw % git branchdevmaster
* test1-- 删除本地分支命令
git branch -d test1
3. git remote
git remote
:列出当前配置的远程仓库的简称。git remote -v
:以详细模式列出当前配置的远程仓库的简称及其对应的 URL。git remote add <name> <url>
:添加一个新的远程仓库,并指定它的简称和 URL。git remote rm <name>
:移除指定简称的远程仓库。git remote rename <old-name> <new-name>
:将指定的远程仓库简称重命名为新的名称。git remote set-url <name> <new-url>
:修改指定远程仓库简称的 URL。
4. git fetch
git fetch
从远端仓库下载最新的提交记录和文件,并将这些更新存储在本地仓库中,但不会自动合并或修改你的工作目录。
git fetch + git merge == git pull
我在master中直接修改如下图1
然后进行 git fetch
在进行 git merge 注意:如果只进行git fetch
代码只会进入到本地仓库但不会改变工作目录!
5. git status
5.1 git status 直观理解
git status
是一个用于查看当前工作目录状态的 Git 命令,它会显示工作目录和暂存区的状态信息,告诉你哪些文件被修改了、哪些文件已经被暂存了、哪些文件还没有被跟踪等等。
5.2 暂存与暂存取消 (git restore)
暂存前代码的变动
暂存的代码文件通过命令git restore –staged <file>
来取消
fanzhen@fanzhendembp-2 straw % git git restore --staged pom.xml
取消暂存之后,代码会变动会原来的位置
5.3 push之后
6. git reset详解 (版本回退方法之一)
git reset
是 Git 中用于移动 HEAD 指针和分支引用的命令,它可以用来撤销提交、修改分支的位置,或者将文件从暂存区移动回工作目录等操作。
6.1 git reset --soft HEAD^
git reset --soft HEAD^
该命令的作用是撤销已经commit且没有push的代码
详解:git reset --soft HEAD^
命令的含义是将当前分支的 HEAD 指向前一个提交(即父提交),但不会修改工作区和暂存区的内容。这个命令通常用于撤销上一次提交并将修改保留在工作区和暂存区中,以便你可以对上一次提交的内容进行修改后再次提交。
执行这个命令后,你会发现 HEAD 指向了前一个提交,但工作区和暂存区的内容并没有改变。这意味着你可以在这个状态下对文件进行修改,并将这些修改重新提交到仓库中。
6.2 git reset --hard 撤销
git reset --hard
的作用是将当前分支的 HEAD 指针重置到指定的提交(commit),并且将暂存区和工作目录都重置为指定提交的状态,这样就可以撤销之前的提交和修改。
6.2.1 例子1 git reset --hard HEAD~1
git reset --hard HEAD~1git push -f
对下面代码进行了修改,在第41行的位置增加了一段代码,这时可以从第二个图看到,已经新增了一条记录fix:测试1,这时我使用命令 git reset --hard HEAD~1
,可以看到HEAD指向了fix: 测试3,接着我执行git push -f
,可以看到master
中的fix:测试1已消失。
6.2.2 例子2 git reset --hard <commit-hash>
git reset --hard <commit-hash>
重置到指定提交。要注意使用git reset --hard
命令会丢弃工作目录和暂存区中未提交的修改。
还是同一个位置,我增加了代码,并push这时我通过git reset --hard cb10754a
,其中cb10754a
为fix: 测试3的code,并且执行git push -f
,在第四个图中版本回退了。
6.3 后悔药
我们通过命令git reset --hard <commit-hash>
回退到了指定版本,但是这个版本之后的代码却消失了。但是我们又想回到某个版本(回退版本之后发的代码版本),这时就需要用到命令 git reflog
就可以查看历史commit-hash
这时我们执行命令git reset --hard 07f65b9
,然后在强制push,可以看到图三的结果。
7. git diff 代码比较
git diff
是 Git 中用于查看文件修改的命令,它可以显示工作目录、暂存区和提交历史之间的差异。
git diff 命令可以用来比较不同提交、不同分支或者不同版本之间的文件差异。
git diff
比较工作目录和暂存区的差异git diff HEAD
比较工作目录和最新提交(HEAD)的差异git diff --staged
比较暂存区和最新提交(HEAD)的差异git diff <commit1> <commit2>
比较两个提交之间的差异
比较工作目录和暂存区的差异
比较两个提交之间的差异其中第一个07f65b92
相较于cb10754a
多了图2的代码。这里显示的是被比较的代码。
反过来的结果
8. git revert (版本回退方法之一)
git revert
命令用于撤销之前的提交,它会创建一个新的提交来撤销指定提交的更改,而不是直接修改历史记录。这意味着 git revert 不会改变历史记录,而是在历史记录上添加新的提交来撤销之前的更改。
1.首先通过下面命令同步远端代码,将远端代码覆盖本地,使得本地与远端代码保持一致。
git fetch origin 作用是从远程仓库 origin 中获取最新的提交记录,并将这些提交记录下载到本地仓库,但并不会自动合并或修改当前工作目录中的文件。
git reset --hard origin/master 命令将本地分支重置为远程分支的最新状态。这将会丢弃本地所有的修改.
2.修改代码并提交
3.执行git revert 43af9965
常用的git revert
命令
- 撤销单个提交:
git revert <commit-hash>
- 撤销多个提交:
git revert <commit1> <commit2> ...
9. git stash 工作目录中的修改保存到一个临时的存储区域中
git stash
命令的作用是将当前的工作目录中的修改(包括已经暂存但尚未提交的修改)保存到一个临时的存储区域中。
常用于以下情况:
- 暂时切换到其他分支工作
- 临时保存工作状态:当你需要处理一些紧急任务或者突发情况,但又不想提交当前的修改时,可以使用
git stash
临时保存工作状态,等处理完紧急情况后再回到这些修改。 - 清理工作目录 :当你的工作目录中有一些临时的修改或者实验性的代码,但不想将它们提交到版本库中时,可以使用
git stash
将这些修改暂时存储起来,以便稍后再使用。
举个例子,我当前代码有修改,直接切换分支会报错,切换失败。这时我们执行git stash
(图3),可以看到切换分支成功。但我们再次切换回来,返现修改的代码不见了(图4),这时我们要执行命令 git stash pop
,代码也就回来了(图5)
10.代码合并 git merge --no-ff
git merge --no-ff dev
dev是被合并的分支,即当前在master分支输入此命令,会将dev分支的代码合并到master
效果
11. git cherry-pick
git cherry-pick
命令的作用是选择一个或多个提交,并将这些提交的更改应用到当前分支上。这个命令通常用于从一个分支上选择某个提交并将其应用到另一个分支上,或者在当前分支上将某些提交重新应用一遍。
我们master分支的git记录如图1所示,而dev分支的记录如图2所示。在dev分支上执行git cherry-pick 33f2c010
这个33f2c010
在master上是对README.md
文件的第一行增加1字段(图3)。
在命令执行后看到图4与图5,发现master上的提交到了dev
当然如果一次通过多个提交可以使用git cherry-pick <commit-hash1> <commit-hash2> ...
命令