当前位置: 首页 > news >正文

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

目录

git工作机制和相关概念

四个重要区域

分支的概念

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

克隆代码

仓库同步

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

1.初始化本地仓库

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

创建关联

查看关联情况

如何解除关联

3.推送代码到远程仓库

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

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

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

3.2在指定本地分支上工作

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

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

(3)进行开发

3.3 提交代码到远程分支

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

git错误记录

git pull因unrelated histories失败

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"文件夹,在命令行进行如下操作。

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仓库地址"

Administrator@hutao MINGW64 /d/projects/test (master)
$ git remote add origin git@gitee.com:hhtaotao/zhuiguang.git

查看关联情况

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

Administrator@hutao MINGW64 /d/projects/test (master)
$ git remote -v
origin  git@gitee.com:hhtaotao/zhuiguang.git (fetch)
origin  git@gitee.com:hhtaotao/zhuiguang.git (push)

如何解除关联

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

Administrator@hutao MINGW64 /d/projects/test (master)
$ git remote rm originAdministrator@hutao MINGW64 /d/projects/test (master)
$ git remote -vAdministrator@hutao MINGW64 /d/projects/test (master)
$

3.推送代码到远程仓库

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

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

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

Administrator@hutao MINGW64 /d/projects/test (master)
$ git branch -aAdministrator@hutao MINGW64 /d/projects/test (master)
$

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

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

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

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/masterAdministrator@hutao MINGW64 /d/projects/test (master)
$ git branch -aremotes/origin/masterAdministrator@hutao MINGW64 /d/projects/test (master)
$

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

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

Administrator@hutao MINGW64 /d/projects/test (master)
$ git branch -aremotes/origin/masterAdministrator@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
* masterremotes/origin/masterAdministrator@hutao MINGW64 /d/projects/test (master)
$

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

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

先git checkout 分支名,然后git pull

3.2在指定本地分支上工作

(1)使用"git branch -a"查看当前所在分支
D:\projects\test>git branch -a
* bran_testdeal_datamasterremotes/origin/bran_testremotes/origin/deal_dataremotes/origin/masterD:\projects\test>

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

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

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

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

示例结果

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"命令查看当前目录下所有文件的变化状态

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

D:\projects\test>git branch -abran_test
* deal_datamasterremotes/origin/bran_testremotes/origin/deal_dataremotes/origin/masterD:\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.cppdeleted:    readme.mdUntracked files:(use "git add <file>..." to include in what will be committed)data.txtno 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这个文件进行提交
D:\projects\test>git add .D:\projects\test>
(3)使用git commit命令从缓存区到本地仓库分支

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

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.txt3 files changed, 2 insertions(+)create mode 100644 data.txtdelete mode 100644 readme.mdD:\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 这个参数

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

示例

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.git02b8e6b..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这个分支的代码,并且提交到远程分支。操作流程一般如下:

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

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 分支

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)上的代码

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命令会弹出一个图形化界面,显示详细的提交信息

示例

D:\projects\test>git log
commit 34c3529e4787ecbd4383607dc499d261f75248de (HEAD -> master, origin/master)
Author: hutao <676178795@qq.com>
Date:   Fri Sep 22 16:24:38 2023 +0800第二次提交,添加了readme文档commit b043a19032795d00e506e3c85f6d6bcc5105e3c5
Author: hutao <676178795@qq.com>
Date:   Fri Sep 22 16:15:31 2023 +0800第一次提交D:\projects\test>

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

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

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

# 将远程仓库的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上的仓库里的所有东西下载到该当前目录下以仓库名命名的一个文件夹里。

D:\projects\test>cd /d D:\testD:\test>git clone git@gitee.com: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

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

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.cppUntracked files:(use "git add <file>..." to include in what will be committed)data.txtno 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进行一些修改

然后

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.cppno changes added to commit (use "git add" and/or "git commit -a")D:\gitspace>git checkout main.cpp
Updated 1 path from the indexD:\gitspace>git status
On branch deal_data
Your branch is up to date with 'origin/deal_data'.nothing to commit, working tree cleanD:\gitspace>

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

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

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

D:\gitspace>git status
On branch deal_data
Your branch is up to date with 'origin/deal_data'.nothing to commit, working tree cleanD:\gitspace>git log
commit c1128a7e1ca4a5bc382aafa0c1231cfab04a6b23 (HEAD -> deal_data, origin/deal_data)
Author: hutao <676178795@qq.com>
Date:   Sat Sep 23 16:16:09 2023 +0800首次测试提交commit ae6376e636bac09180f1d21d6646f75175b7bf40
Author: hutao <676178795@qq.com>
Date:   Sat Sep 23 15:06:26 2023 +0800xxxx
D:\gitspace>git reset ae6376e636bac09180f1d21d6646f75175b7bf40
Unstaged changes after reset:
D       README.md
M       main.cpp
D       test.txt
D       yyyy.txtD:\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.mdmodified:   main.cppdeleted:    test.txtdeleted:    yyyy.txtno changes added to commit (use "git add" and/or "git commit -a")D:\gitspace>

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

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

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.mddeleted:    test.txtdeleted:    yyyy.txtno 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.mddelete mode 100644 test.txtdelete mode 100644 yyyy.txtD:\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 cleanD:\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 <676178795@qq.com>
Date:   Sat Sep 23 17:40:19 2023 +0800撤销回退commit ae6376e636bac09180f1d21d6646f75175b7bf40
Author: hutao <676178795@qq.com>
Date:   Sat Sep 23 15:06:26 2023 +0800xxxx

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

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

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

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

git push <仓库名> <分支名> -f 

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

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

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

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

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

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

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

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

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

git错误记录

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

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

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 分支 

git checkout master
git branch -d dev

git pull因unrelated histories失败

错误提示:

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允许提交不关联的历史代码。

git pull origin master --allow-unrelated-histories
git push origin master --allow-unrelated-histories

git中出现”the requested upstream branch ‘origin/master‘ does not exist“问题的解决

报错提示:

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

解决办法:

git pull origin master --allow-unrelated-histories

end

相关文章:

  • 大数据开发语言Scala入门
  • VScode中连接并使用docker容器
  • React基础教程:TodoList案例
  • 【探索Linux】P.34(HTTPS协议)
  • [AIGC] 解题神器:Python中常用的高级数据结构
  • GenICam标准(一)
  • Java基础知识巩固自测(上)
  • 大模型-人类病理学的语言视觉AI助手
  • DataWhale - 吃瓜教程学习笔记(一)
  • mybatis-plus使用拦截器实现sql完整打印
  • 一款经典BUCK DCDC降压芯片TPS5430适合24V转5V转12V及其电路图
  • Python 踩坑记 -- 调优
  • 超拟人大模型:AI心理健康服务的未来
  • QuickLook最强大的C#开源文件预览神器
  • 计算机行业
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • angular组件开发
  • go append函数以及写入
  • HTML5新特性总结
  • KMP算法及优化
  • mysql常用命令汇总
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • Quartz初级教程
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • Vue小说阅读器(仿追书神器)
  • 程序员该如何有效的找工作?
  • 大主子表关联的性能优化方法
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 回流、重绘及其优化
  • 坑!为什么View.startAnimation不起作用?
  • 跨域
  • 两列自适应布局方案整理
  • 项目实战-Api的解决方案
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • ​HTTP与HTTPS:网络通信的安全卫士
  • !!Dom4j 学习笔记
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (13)DroneCAN 适配器节点(一)
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (含笔试题)深度解析数据在内存中的存储
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (一)认识微服务
  • (转)jQuery 基础
  • .NET Core 2.1路线图
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...
  • //TODO 注释的作用
  • /proc/stat文件详解(翻译)
  • [ linux ] linux 命令英文全称及解释
  • [ 转载 ] SharePoint 资料
  • [C++ 从入门到精通] 12.重载运算符、赋值运算符重载、析构函数
  • [CareerCup] 17.8 Contiguous Sequence with Largest Sum 连续子序列之和最大