git工作机制、仓库克隆、开发和上传代码详解

目录

一、git工作机制和相关概念

四个重要区域

分支

克隆代码

仓库同步

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

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

特别说明

0.创建远程仓库和搭建本地环境

1.初始化本地仓库

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

创建关联

查看关联情况

如何解除关联

3.推送代码到远程仓库

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

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

(2)使用"git pull"将本地仓库版本更新到远程仓库最新版本

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因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分支理解与操作(详解)-CSDN博客

克隆代码

就是把远程仓库上该项目的全部内容下载到本地。

仓库同步

有两种情况:

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

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

克隆仓库的含义:下载仓库某个分支全部内容到本地某个目录下

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

# 将远程仓库的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:\test

D:\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为远程仓库的名字

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

特别说明

以下的第0步、第1步、第2步不是每次都需要,是属于基础配置。比如通过克隆得到的项目文件夹,其目录下会有一个.git文件夹,其已经配置好了相关信息。右键打开git bash here

然后从下面的第3步操作。

如果是从零开始配置,从下面的第0步操作。

基础配置配好以后或者不需要变动的情况,以后每次只需要在.git文件夹所在的目录,鼠标右键git bash here,然后从下面的第3步操作开始即可。

0.创建远程仓库和搭建本地环境

git远程仓库创建与本地环境配置_gitee创建仓库-CSDN博客

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 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"命令,可以看到本地仓库和远程仓库的所有分支,并且知道当前工作所在的本地分支是哪个。

git branch -a

如果什么都没显示,可以先用git fetch,再用git branch -a看看

git fetch
git branch -a

(2)使用"git pull"将本地仓库版本更新到远程仓库最新版本

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

# 切换到指定分支,比如master
git checkout master

# 拉取最新代码到本地
git pull

3.2在指定本地分支上工作

(1)使用"git branch -a"查看当前所在分支
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,使用如下命令切换分支

# 切换分支
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 -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>

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

工作区内容发生变化以后,此时使用git status可以看到文件的修改,还可以看到此时这些改动属于"Untracked files"。

(2)使用"git add ."命令提交文件到缓存区
  • "git add ." 这里的点是将所有文件进行提交
  • "git add main.cpp" 只将main.cpp这个文件进行提交
  • 你可以使用git add -p(或git add --patch)命令。这个命令会启动一个交互式会话,让你逐个查看文件的修改,并选择性地添加这些修改到暂存区。这样,你就可以只提交文件的部分修改,而不是整个文件的所有修改。
  • 在对工作区进行内容修改后,可以分批次多次调用git add 命令
D:\projects\test>git add .

D:\projects\test>

git add后会将文件的修改添加到暂存区中,此时使用git status可以看到这些变化,在 git status 的输出中,这些文件会被列为"Changes to be committed"。

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

git commit 命令后会真正创建一个提交,这个命令会打开文本编辑器(除非你使用了 -m 选项直接在命令行中提供提交信息),让你输入关于这次提交的说明,可以输入多行内容。完成提交信息的编辑后,保存并退出编辑器的步骤会因所使用的编辑器而异,一般是Vi/Vim编辑器,按下Esc键退出编辑模式,然后输入:wq就能保存并退出。

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 这个参数

# 首次提交
git push -u origin deal_data

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

# 强制提交:强制提交可能会把之前的commit注释信息,不会改变修改的代码,慎用)。
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.git
   02b8e6b..dc173a9  deal_data -> deal_data
branch 'deal_data' set up to track 'origin/deal_data'.

D:\projects\test>

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

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

  • 第一种:使用"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错误记录

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

使用 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

  • 10
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值