【git使用三】git工作机制与命令用法

目录

git工作机制和相关概念

四个重要区域

分支的概念

上传代码到远程分支的基本流程

克隆代码

仓库同步

开发者如何提交代码到远程仓库分支

1.初始化本地仓库

2.关联本地仓库和远程仓库

创建关联

查看关联情况

如何解除关联

3.推送代码到远程仓库

3.1先下拉远程分支代码合并到本地分支

[(1)使用"git branch -a"查看所有分支和当前所在分支](#(1)使用"git branch -a"查看所有分支和当前所在分支)

[(2)使用"git fetch"拉取远程仓库所有分支来更新本地仓库](#(2)使用"git fetch"拉取远程仓库所有分支来更新本地仓库)

3.2在指定本地分支上工作

[(1)使用"git branch -a"查看当前所在分支](#(1)使用"git branch -a"查看当前所在分支)

[(2)使用"git checkout"切换到要工作的本地仓库分支](#(2)使用"git checkout"切换到要工作的本地仓库分支)

(3)进行开发

[3.3 提交代码到远程分支](#3.3 提交代码到远程分支)

[(1)使用"git status"命令查看当前目录下所有文件的变化状态](#(1)使用"git status"命令查看当前目录下所有文件的变化状态)

[(2)使用"git add ."命令提交文件到缓存区](#(2)使用"git add ."命令提交文件到缓存区)

[(3)使用git commit命令从缓存区到本地仓库分支](#(3)使用git commit命令从缓存区到本地仓库分支)

[(4)使用"git push"命令从本地仓库到远程仓库上面](#(4)使用"git push"命令从本地仓库到远程仓库上面)

Git如何提交本地代码到远程分支

git代码分支合并(pull->merge->push)

第一种:合并全部分支到master

第二种:合并指定分支到master

第三种:合并master到指定分支

开发者如何查看全部提交历史

[开发者如何克隆仓库:git clone](#开发者如何克隆仓库:git clone)

[开发者如何进行git版本回退:git reset](#开发者如何进行git版本回退:git reset)

第一种:回退到当前版本(放弃所有修改)

第二种:放弃某一个文件的修改

第三种:回退到某一版本但保存自该版本起的修改

第四种:回退到某一版本并且放弃自该版本起的所有修改

第五种:回退远程仓库的版本

第六种:如何以当前版本为基础,回退指定个commit

第七种:如何回退到和远程版本一样

git错误记录

[git pull因unrelated histories失败](#git pull因unrelated histories失败)

[git中出现"the requested upstream branch 'origin/master' does not exist"问题的解决](#git中出现”the requested upstream branch ‘origin/master‘ does not exist“问题的解决)


git工作机制和相关概念

四个重要区域

  1. 工作区:工作项目所在目录,就是写开发者写代码的地方,比如可以是"D:/projects/test"。
  2. 缓存区:在".git"文件夹下的某个位置,".git"文件夹后面会讲怎么创建,通常是创建在工作区下,比如工作区为"D:/projects/test",则".git"目录创建在"D:/projects/test/.git"。缓存区在".git"目录下具体哪个位置你不需要关心,只需要知道有这个区域就好,后面会讲这个区域扮演的角色。
  3. 本地仓库:在".git"目录下的某个位置,有的也称呼为"版本库","仓库区"。本地仓库在".git"目录下具体哪个位置你不需要关心,只需要知道有这个区域就好,后面会讲这个区域扮演的角色。
  4. 远程仓库:gitee上的仓库

分支的概念

是基于仓库而言的。通常创建好一个仓库后,默认自带master这个分支,我们还可以创建多个分支。通常工作模式都是创建多个分支,不同分支对项目进行不同的新开发或者修改,测试通过以后,然后合并到master分支。

不同的分支就是在进行不同的代码版本管理,每个分支有一个自己的代码版本,master分支也有一个代码版本,通常项目运行的代码版本以master为准。分支代码合并到master的意思就是将master这个分支的代码版本更新到分支最新版本。

通常远程仓库有多个分支,往往取决于开发任务如何划分,开发者的本地仓库通常也可以存在多个分支,取决开发需求,本地分支和远程分支之间需要建立"追踪"关系,如何创建后面会讲,在本地分支将代码等开发完成后,就可以提交到具有关联关系的远程分支。

当存在多个开发者时,每个开发者有一个本地仓库,如果多个开发者需要提交代码到同一个远程分支,往往不建议直接提交,而是先下拉远程分支的代码合并到本地分支,然后进行代码开发,开发完成后再进行提交。

分支深度掌握可以参考:【git使用四】git分支理解与操作(详解)-CSDN博客

上传代码到远程分支的基本流程

当自己的项目代码有所更新时,需要上传代码等文件到远程仓库的某个分支,流程大致是:本地工作目录 -> 缓存区 -> 本地仓库某个分支 -> 对应的远程仓库某个分支。如何一步步传递后面会讲。通常本地仓库的各个分支与远程仓库的各个分支需要建立"追踪"关系,才能进行上传,如何建立"追踪"关系后面会讲。

克隆代码

克隆代码就是下载代码的意思,当别人上传了新的代码或其它文件到远程仓库某个分支时,自己需要下载下来查看,或者自己在另一台主机上,想查看仓库的项目代码,就可以从gitee上的仓库直接下载代码到本地某个目录了,这个动作叫clone,具体怎么操作后面会讲。

仓库同步

有两种情况:

  • 一是用远程仓库更新本地仓库,比如对于远程仓库,有其他的开发者上传了新的文件,远程仓库是新的一个版本,但自己电脑的本地仓库还是上一个版本,因此需要用远程仓库更新本地仓库。
  • 二是用本地仓库更新远程仓库,比如本地项目目录的代码有所变化后,上传到缓存区,再到本地仓库,此时本地仓库更新了,但是远程仓库还是上一个版本,因此需要用本地仓库更新远程仓库。

开发者如何提交代码到远程仓库分支

1.初始化本地仓库

同步远程仓库之前,需要在本地工作区初始化创建一个本地仓库,进而与Gitee上的仓库建立联系。比如我们这里的工作目录是"D:/projects/test"文件夹,在命令行进行如下操作。

bash 复制代码
cd /d D:/projects/test
git init

我们在初始化项目时,在工作区目录运行此命令,会在更目录生成一个.git文件夹。表示这个项目已经被git接管。如果不想被git接管,直接删除.git文件夹即可。那样这个项目就和git没一点关系了。缓存区和本地仓库等都在.git目录下,具体在.git目录下的哪个位置,可以不用过多关心。

2.关联本地仓库和远程仓库

创建关联

将本地仓库与Gitee的仓库关联起来,在你的工作目录处("D:/projects/test")右键打开git bash,输入"git remote add 给远程仓库取的名字 远程SSH仓库地址",比如这里给远程仓库取名为origin,可以用"git remote add origin 远程SSH仓库地址"

bash 复制代码
Administrator@hutao MINGW64 /d/projects/test (master)
$ git remote add origin [email protected]:hhtaotao/zhuiguang.git

查看关联情况

使用git remote -v 查看是否关联(每一行两项信息,左边是远程仓库的名字,右边是远程仓库的SSH地址)

bash 复制代码
Administrator@hutao MINGW64 /d/projects/test (master)
$ git remote -v
origin  [email protected]:hhtaotao/zhuiguang.git (fetch)
origin  [email protected]:hhtaotao/zhuiguang.git (push)

如何解除关联

git remote rm 之前给仓库取的名字。比如

bash 复制代码
Administrator@hutao MINGW64 /d/projects/test (master)
$ git remote rm origin

Administrator@hutao MINGW64 /d/projects/test (master)
$ git remote -v

Administrator@hutao MINGW64 /d/projects/test (master)
$

3.推送代码到远程仓库

3.1先下拉远程分支代码合并到本地分支

(1)使用"git branch -a"查看所有分支和当前所在分支

"git branch -a"命令,可以看到本地仓库和远程仓库的所有分支,并且知道当前工作所在的本地分支是哪个。

bash 复制代码
Administrator@hutao MINGW64 /d/projects/test (master)
$ git branch -a

Administrator@hutao MINGW64 /d/projects/test (master)
$

从上面结果显示来看,是空的,这是因为还没有拉取远程仓库所有分支来更新本地仓库。

(2)使用"git fetch"拉取远程仓库所有分支来更新本地仓库

"git branch -a"命令不仅会显示本地仓库的所有分支,而且还会显示远程仓库的所有分支,但是从刚才的结果中,并没有看到所有远程分支,需要使用"git fetch"拉取远程仓库所有分支来更新本地仓库,这样就会知道有哪些远程分支,并且在本地仓库建立同名分支与之关联。

bash 复制代码
Administrator@hutao MINGW64 /d/projects/test (master)
$ git fetch
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (4/4), 1.80 KiB | 131.00 KiB/s, done.
From gitee.com:hhtaotao/zhuiguang
 * [new branch]      master     -> origin/master

Administrator@hutao MINGW64 /d/projects/test (master)
$ git branch -a
  remotes/origin/master

Administrator@hutao MINGW64 /d/projects/test (master)
$

从git fetch的结果来看,识别到了远程仓库的分支origin/master,并且自动建立了同名的本地分支与之关联。

但是进一步从git branch -a的结果来看,并没有显示本地分支名称,但是本地仓库确实是有master这个分支的,这个是显示bug,需要切换切换一下分支再查看就出来了。切换分支的命令是"git checkout 分支名称"。从下面的结果可以看到本地分支名称为master,远程仓库分支名称为remotes/origin/master,其中origin为我们刚才关联远程仓库为远程仓库取的名字。

bash 复制代码
Administrator@hutao MINGW64 /d/projects/test (master)
$ git branch -a
  remotes/origin/master

Administrator@hutao MINGW64 /d/projects/test (master)
$ git checkout master
Already on 'master'
branch 'master' set up to track 'origin/master'.

Administrator@hutao MINGW64 /d/projects/test (master)
$ git branch -a
* master
  remotes/origin/master

Administrator@hutao MINGW64 /d/projects/test (master)
$

使用"git fetch"后,将会把远程仓库里的代码更新到本地仓库,切换分支后,本地工作目录里的文件将为该分支的代码版本。

另外也可以只拉取指定远程仓库分支来更新本地分支

bash 复制代码
先git checkout 分支名,然后git pull

3.2在指定本地分支上工作

(1)使用"git branch -a"查看当前所在分支
bash 复制代码
D:\projects\test>git branch -a
* bran_test
  deal_data
  master
  remotes/origin/bran_test
  remotes/origin/deal_data
  remotes/origin/master

D:\projects\test>

从结果可以看到,当前工作所在的本地分支是bran_test,但是我们现在想在deal_data这个分支上进行开发,因此需要切换分支。

(2)使用"git checkout"切换到要工作的本地仓库分支

假设我们要工作的分支名称是deal_data,使用如下命令切换分支

bash 复制代码
# 切换分支
git checkout deal_data

# 如果本地仓库没有该分支,则需要创建再切换,该命令的作用是创建并切换本地分支
git checkout -b deal_data

示例结果

bash 复制代码
D:\projects\test>git checkout deal_data
Switched to branch 'deal_data'
Your branch is up to date with 'origin/deal_data'.

D:\projects\test>

注意切换分支后工作区的内容会自动变为相应分支的文件内容。比如我这里处于bran_test分支时,工作区的文件是这样的

切换到deal_data分支后,工作区的文件就变成了deal_data分支对应的文件内容

(3)进行开发

切换到deal_data分支后,工作区的文件就变成了deal_data分支对应的文件内容

我们修改main.cpp这个文件内容,然后删除readme.md,然后新建一个data.txt文件

3.3 提交代码到远程分支

(1)使用"git status"命令查看当前目录下所有文件的变化状态

查看在你上次提交之后是否有对文件进行再次修改等信息

bash 复制代码
D:\projects\test>git branch -a
  bran_test
* deal_data
  master
  remotes/origin/bran_test
  remotes/origin/deal_data
  remotes/origin/master

D:\projects\test>git status
On branch deal_data
Your branch is up to date with 'origin/deal_data'.

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)
        modified:   main.cpp
        deleted:    readme.md

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        data.txt

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

D:\projects\test>

从上面结果可以看到我们刚才所做的全部操作

(2)使用"git add ."命令提交文件到缓存区
  • "git add ." 这里的点是将所有文件进行提交
  • "git add main.cpp" 只将main.cpp这个文件进行提交
bash 复制代码
D:\projects\test>git add .

D:\projects\test>
(3)使用git commit命令从缓存区到本地仓库分支

-m 参数用来说明自己为什么要上传,一般显示版本更新信息,方便以后自己查阅

bash 复制代码
D:\projects\test>git commit -m "版本v1.0.3 删除readme.md 修改main.cpp 新增data.txt"
[deal_data dc173a9] 版本v1.0.3 删除readme.md 修改main.cpp 新增data.txt
 3 files changed, 2 insertions(+)
 create mode 100644 data.txt
 delete mode 100644 readme.md

D:\projects\test>

每次提交都对应一个commitID,像上面结果这里就是dc173a9,也可以通过"git log"查看提交历史,来查看对应的commitID。

(4)使用"git push"命令从本地仓库到远程仓库上面

git push语法格式:git push [远程库名] [本地分支名] [远程分支名]

  • 省略远程分支名时,比如"git push 远程库名 本地分支名",默认向具有关联关系的远程分支提交
  • 省略远程分支名和本地分支名时,比如"git push 远程库名",默认将当前所在分支向具有关联关系的远程分支提交
  • 省略远程库名、远程分支名和本地分支名时,比如"git push",默认将当前所在分支向具有唯一关联关系的远程分支提交,如果当前分支与多个远程仓库的分支具有关联关系,则使用"git push"会被拒绝

现在我们位于本地仓库的deal_data这个分支上(可以使用git branch -a查看所在分支,使用"git checkout 分支名称"切换分支)

如果是第一次从本地仓库的deal_data这个分支提交到远程仓库的deal_data分支,用以下命令,其中参数-u的作用是用来设置本地分支与远程分支之间的关联关系,如果已经设置过可以不用加 -u 这个参数:

bash 复制代码
# 首次提交
git push -u origin deal_data

# 非首次提交,不在需要加  -u
git push origin deal_data

# 强制提交:强制提交可能会把之前的commit注释信息,不会改变修改的代码,慎用)。都是提交到master分支
git push -f deal_data

示例

bash 复制代码
D:\projects\test>git push -u origin deal_data
Enumerating objects: 6, done.
Counting objects: 100% (6/6), done.
Delta compression using up to 16 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 375 bytes | 375.00 KiB/s, done.
Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-6.4]
To gitee.com:hutao_gitee/zhongtian.git
   02b8e6b..dc173a9  deal_data -> deal_data
branch 'deal_data' set up to track 'origin/deal_data'.

D:\projects\test>

提交后上gitee上查看仓库对应分支的变化,可以看到已经更新为最新版本

Git如何提交本地代码到远程分支

假设正在使用 Git 管理一个名为 "my_project" 的项目,假设要修改feature_branch这个分支的代码,并且提交到远程分支。操作流程一般如下:

先拉取远程分支来更新本地分支,因为可能你的本地仓库该分支所指向的提交版本可能不是最新的版本,要保证自己是在最新版本基础上进行修改

bash 复制代码
git checkout feature_branch
git pull

然后修改后的代码如果通过了测试,想提交到名为 "feature_branch" 的远程分支。可以按照以下步骤提交修改后的代码:

  1. 首先,使用 git branch 命令检查当前所在的分支。如果不在 "feature_branch" 分支上,可以使用 git checkout feature_branch 命令切换到该分支。

  2. 然后,使用 git add <file_name> 命令将修改后的文件添加到暂存区。例如,如果修改了 "main.py" 文件,可以使用 git add main.py 命令将其添加到暂存区。 如果想添加所有修改的文件,可以使用 git add . 命令。

  3. 接下来,使用 git commit -m "commit message" 命令提交修改并添加提交信息,将提交到本地仓库分支。例如,可以使用 git commit -m "Update main.py" 命令提交修改,并在提交信息中描述所做的更改。

  4. 最后,使用 git push origin feature_branch 命令将修改后的代码推送到名为 "feature_branch" 的远程分支。这将把的本地分支与远程分支同步。如果是第一次推送到该分支,需要使用 git push -u origin feature_branch 命令来设置 "feature_branch" 分支的跟踪关系。

git代码分支合并(pull->merge->push)

第一种:合并全部分支到master

Git 合并分支到 master 分支的步骤如下:

  1. 首先使用"git branch"命令查看本地和远程所有分支名称
  2. 然后将所有分支代码和master拉取到本地:
    1. 切换到 master 分支:git checkout master
    2. 拉取远程 master 分支最新版本:git pull origin master
    3. 使用分支代码:先git checkout 分支,然后git pull
    4. 重复将所有分支代码拉取完毕
  3. 合并所有分支到master
    1. 切换到需要合并的分支:git checkout master
    2. 将需要合并的分支合并到当前分支即 master :git merge 分支名称
    3. 重复将所有分支代码合并完毕
  4. 提交合并:
    1. git push origin master

如果在合并分支过程中出现冲突,需要手动解决冲突并重新提交。

第二种:合并指定分支到master

开发分支(dev)上的代码达到上线标准后,合并到 master 分支

bash 复制代码
git checkout dev
git pull
git checkout master
git pull
# merge  --no-ff参数,表示禁用Fast forward;
# 可以保存之前的分支历史。能够更好的查看merge历史,以及branch状态.
# 保证版本提交、分支结构清晰
git merge --no-ff  dev
git push -u origin master

当master 分支为保护分支时,执行git push -u origin master会提示远程服务器拒绝,此时需要在浏览器登录远程仓库地址进行远程仓库merge操作。

第三种:合并master到指定分支

当master代码改动,需要更新开发分支(dev)上的代码

bash 复制代码
git checkout master 
git pull 
git checkout dev
# merge  --no-ff参数,表示禁用Fast forward;
# 可以保存之前的分支历史。能够更好的查看merge历史,以及branch状态.
# 保证版本提交、分支结构清晰
git merge --no-ff  master
git push -u origin dev

开发者如何查看全部提交历史

  • 第一种:使用"git log"命令
  • 第二种:gitk --all 执行gitk --all命令会弹出一个图形化界面,显示详细的提交信息

示例

bash 复制代码
D:\projects\test>git log
commit 34c3529e4787ecbd4383607dc499d261f75248de (HEAD -> master, origin/master)
Author: hutao <[email protected]>
Date:   Fri Sep 22 16:24:38 2023 +0800

    第二次提交,添加了readme文档

commit b043a19032795d00e506e3c85f6d6bcc5105e3c5
Author: hutao <[email protected]>
Date:   Fri Sep 22 16:15:31 2023 +0800

    第一次提交

D:\projects\test>

开发者如何克隆仓库:git clone

克隆仓库的含义:下载仓库某个分支全部内容到本地某个目录下,不建议下载到git所在的工作区。

比如要下载自己或别人的仓库到本地工作区。语法格式

bash 复制代码
# 将远程仓库的branch_name的内容全部下载到当前所在目录
git clone -b branch_name repository_url

# 不指定参数-b branch_name时默认是从master克隆到本地当前所在目录
git clone url

举个例子,下载远程仓库master分支下的所有内容到"D:\test"目录下。在当前目录("D:\test")中右击打开git bush,输入git clone 远程SSH仓库地址(同上),这样就能将Gitee上的仓库里的所有东西下载到该当前目录下以仓库名命名的一个文件夹里。

bash 复制代码
D:\projects\test>cd /d D:\test

D:\test>git clone [email protected]:hutao_gitee/zhongtian.git
Cloning into 'zhongtian'...
remote: Enumerating objects: 34, done.
remote: Counting objects: 100% (34/34), done.
remote: Compressing objects: 100% (22/22), done.
Receiving objects: 100% (34/34), done.delta 0), pack-reused 0Receiving objects:   2% (1/34)

Resolving deltas: 100% (3/3), done.

D:\test>

然后就可以看到"D:\test"下多了个文件夹zhuiguang,其中zhuiguang为远程仓库的名字

开发者如何进行git版本回退:git reset

官网参考链接:如何进行版本回退 | Gitee 产品文档

第一种:回退到当前版本(放弃所有修改)

场景描述:我们在本地工作目录下进行了一些文件的操作,添加到了缓存区(必须要有这步),下一步就是提交到了本地仓库的某个分支,然后提交到远程仓库某个分支进行更新,但是突然不想提交到本地仓库了,同时也要放弃对文件的操作,即让工作目录回到原来的状态,可以使用"git reset --hard"命令。

比如我这里工作目录为"D:\gitspace",目前处于deal_data这个开发分支上,内容如下

我先修改了main.cpp文件,然后创建了data.txt

然后使用命令撤销这些操作

bash 复制代码
D:\gitspace>git status
On branch deal_data
Your branch is up to date with 'origin/deal_data'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   main.cpp

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        data.txt

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

D:\gitspace>git add .

D:\gitspace>git reset --hard
HEAD is now at c1128a7 首次测试提交

D:\gitspace>

再次查看"D:\gitspace",可以看到恢复到原来的状态了

第二种:放弃某一个文件的修改

场景:我们对工作目录下的main.cpp做了大量的修改,但是突然不想要这些修改,手动还原是很麻烦的,可能还无法还原。

放弃对指定文件的修改:git checkout 文件名

操作如下:

先对main.cpp进行一些修改

然后

bash 复制代码
D:\gitspace>git status
On branch deal_data
Your branch is up to date with 'origin/deal_data'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   main.cpp

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

D:\gitspace>git checkout main.cpp
Updated 1 path from the index

D:\gitspace>git status
On branch deal_data
Your branch is up to date with 'origin/deal_data'.

nothing to commit, working tree clean

D:\gitspace>

然后此时再次查看main.cpp内容,可以发现已经是原来的内容了

第三种:回退到某一版本但保存自该版本起的修改

使用"git reset 版本号",版本号也被称做commitID,如下面"commit c1128a7e1ca4a5bc382aafa0c1231cfab04a6b23"中的c1128a7e1ca4a5bc382aafa0c1231cfab04a6b23就是commitID

bash 复制代码
D:\gitspace>git status
On branch deal_data
Your branch is up to date with 'origin/deal_data'.

nothing to commit, working tree clean

D:\gitspace>git log
commit c1128a7e1ca4a5bc382aafa0c1231cfab04a6b23 (HEAD -> deal_data, origin/deal_data)
Author: hutao <[email protected]>
Date:   Sat Sep 23 16:16:09 2023 +0800

    首次测试提交

commit ae6376e636bac09180f1d21d6646f75175b7bf40
Author: hutao <[email protected]>
Date:   Sat Sep 23 15:06:26 2023 +0800

    xxxx
D:\gitspace>git reset ae6376e636bac09180f1d21d6646f75175b7bf40
Unstaged changes after reset:
D       README.md
M       main.cpp
D       test.txt
D       yyyy.txt

D:\gitspace>git status
On branch deal_data
Your branch is behind 'origin/deal_data' by 1 commit, and can be fast-forwarded.
  (use "git pull" to update your local branch)

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:    README.md
        modified:   main.cpp
        deleted:    test.txt
        deleted:    yyyy.txt

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

D:\gitspace>

从上面最后的git status的结果来看,其显示了所有版本的修改。

如果此时不想回退版本了,这里可以使用git add、git commit使得本地仓库分支变为之前的最新版本。

bash 复制代码
D:\gitspace>git status
On branch deal_data
Your branch is behind 'origin/deal_data' by 1 commit, and can be fast-forwarded.
  (use "git pull" to update your local branch)

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:    README.md
        deleted:    test.txt
        deleted:    yyyy.txt

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

D:\gitspace>git add .

D:\gitspace>git commit -m "撤销回退"
[deal_data a4ddafc] 撤销回退
 3 files changed, 4 deletions(-)
 delete mode 100644 README.md
 delete mode 100644 test.txt
 delete mode 100644 yyyy.txt

D:\gitspace>git status
On branch deal_data
Your branch and 'origin/deal_data' have diverged,
and have 1 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

nothing to commit, working tree clean

D:\gitspace>git checkout deal_data
Already on 'deal_data'
Your branch and 'origin/deal_data' have diverged,
and have 1 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

D:\gitspace>git log
commit a4ddafcd5a7aac84e2ffece17f6c795618bcba13 (HEAD -> deal_data)
Author: hutao <[email protected]>
Date:   Sat Sep 23 17:40:19 2023 +0800

    撤销回退

commit ae6376e636bac09180f1d21d6646f75175b7bf40
Author: hutao <[email protected]>
Date:   Sat Sep 23 15:06:26 2023 +0800

    xxxx

第四种:回退到某一版本并且放弃自该版本起的所有修改

和第三种类似,只是回退时使用"git reset --hard 版本号"

第五种:回退远程仓库的版本

先在本地切换到远程仓库要回退的分支对应的本地分支,然后本地回退至你需要的版本,然后执行如下命令:

bash 复制代码
git push <仓库名> <分支名> -f 

必须要加参数-f 进行强制更新,不然会因为本地版本比远程版本落后的原因而被拒绝。

这些操作的本质就是先将本地仓库回到某个旧版本,然后用旧版本更新远程仓库。

第六种:如何以当前版本为基础,回退指定个commit

首先,确认你当前的版本需要回退多少个版本,然后计算出你要回退的版本数量,执行如下命令

bash 复制代码
git reset HEAD~X //X代表你要回退的版本数量,是数字!!!!

需要注意的是,如果你是合并过分支,那么被合并分支带过来的commit并不会被计入回退数量中,而是只计算一个,所以如果需要一次回退多个commit,不建议使用这种方法

第七种:如何回退到和远程版本一样

有时候,本地项目开发过程中发生错误修改需要放弃全部修改时,可以以远程分支作为回退点,将本地仓库退回到与远程分支一样,执行的命令如下

bash 复制代码
git reset --hard origin/master // origin代表你远程仓库的名字,master代表分支名

git错误记录

在当前分支下删除该分支报错

使用 Git 操作 版本库 , 删除分支时 , 报如下错误 :

bash 复制代码
D:\Git\git-learning-course>git branch -d dev
error: Cannot delete branch 'dev' checked out at 'D:/Git/git-learning-course'

原因:当前的分支是 dev,如果要删除 dev 分支 , 不能在 dev 分支下删除分支本身

解决方案: 需要切换到 master 分支上 , 然后再删除 dev 分支

bash 复制代码
git checkout master
git branch -d dev

git pull因unrelated histories失败

错误提示:

bash 复制代码
git pull
fatal: refusing to merge unrelated histories

可能原因:

  • 1.有一个包含一些提交的新 Git 存储库。然后,您尝试从现有的远程仓库中提取。合并变得不兼容,因为分支和远程拉取的历史不同。当你试图合并两个完全不相关的分支时,Git 看到了这种情况,它不知道该怎么做。
  • 2.目录有问题.git。它可能在某些时候被意外删除或损坏。如果您克隆或清理了项目,则可能会发生这种情况。此处发生错误是因为 Git 没有有关本地项目历史的必要信息。
  • 3.当您尝试从远程仓库推送或拉取数据时,分支位于不同的HEAD位置,并且由于缺乏共性而无法匹配。

我出现的问题是,远程的代码没有先clone到本地,所以不兼容。

解决办法:

在git pull和git push命令中添加--allow-unrelated-histories

让git允许提交不关联的历史代码。

bash 复制代码
git pull origin master --allow-unrelated-histories
git push origin master --allow-unrelated-histories

git中出现"the requested upstream branch 'origin/master' does not exist"问题的解决

报错提示:

bash 复制代码
D:\gitspace>git branch --set-upstream-to=origin/deal_data deal_data
fatal: the requested upstream branch 'origin/deal_data' does not exist

解决办法:

bash 复制代码
git pull origin master --allow-unrelated-histories

end

相关推荐
仍然探索未知中3 小时前
Git分支管理
git
小妖6664 小时前
windows11 安装好后右键没有 git bash 命令
git
只做开心事4 小时前
Git 多人协作
git
freejackman4 小时前
Git从入门到精通
git·gitee·gitlab·github
兔子坨坨7 小时前
pycharm连接github(详细步骤)
windows·git·学习·pycharm·github
大大小小聪明14 小时前
Git合并多个提交方法详解
git·github
Baoing_21 小时前
Git 项目切换到新的远程仓库地址
git
暴躁哥1 天前
Git 版本控制系统入门指南
git
diving deep1 天前
IDEA中git对于指定文件进行版本控制
git
趁你还年轻_1 天前
记录一次git提交失败解决方案
git