Git 掌握,2024年最新程序员必看

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注大数据)
img

正文

(2) 场景二 已经 add ,但没有 commit

(3) 场景三 已经 add ,并且也 commit 了

九、删除文件

十、分支管理

(1) 创建分支

(2) 切换分支

(3) 合并分支

(4) 删除分支

(5) 合并冲突

十一、分支管理策略

(1) master分支

(2) bug分支

(3) 删除临时分支

十二、远程操作

(1) 新建远程仓库

(2) 克隆远程仓库

a. 通过HTTPS克隆

b. 通过SSH克隆

(3) 向远程仓库推送

(4) 拉取远程仓库

十三、配置git

(1) .gitignore忽略特殊文件

(2) 给命令配置别名

十四、标签管理

(1) 理解标签

(2) 创建标签

(3) 操作标签

十五、多人协作

(1) 多人协作

(2) 将内容合并到master

(3) 远程分⽀删除后,本地git branch -a依然能看到的解决办法

十六、企业级开发模型

(1) 系统开发环境

(2) Git分支设计规范

十七、结尾


一、前言

大二上学期,学校开了数据库的课程,让做课程设计,数据库代码,文档等都搞好了,让老师看的时候文档写的不好,让修改,改了之后继续让老师看,来来回回弄了三四次,最后老师说:你把第一次的文档发给我吧。随着版本的不断增多,各自版本的内容是什么我们还知道吗?每个版本有各⾃的内容,但最终会只有⼀份报告需要被我们使⽤。文档是这样的,我们写的代码也是这样的。

如何解决这个问题?---- 版本控制器 Git

文件可能会有很多版本,通过版本控制器可以了解一个文件的历史,以及它发展过程中的系统。说白了,就是可以记录工程中的每一次改动和版本迭代的一个管理系统,也可以多人协同作业。

目前最主流的版本控制器是Git。Git可以控制电脑上的所有格式的文件,例如doc,execl,dwg等。当然,对于开发人员来说,Git最重要的是可以帮助我们管理软件开发项目中的源代码文件。

所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等。版本控制器可以告诉你每次的改动,比如某一行添加了什么,某一行删除了什么。但是图片,视频这些二进制文件,虽然也可以被版本控制器管理,但不能知道文件发生了什么变化,比如图片从120变成了100,图片哪里改变了,版本控制器是不知道的。

二、centos安装Git

输入git之后,如果出现git:command not found就是没有安装git。

sudo yum -y install git可以安装git。

通过git --version可以查看安装git的版本。

三、Git基本操作

(1) 创建Git本地仓库

仓库是进行版本控制的一个文件目录。我们要想对文件进行版本控制,就必须先创建一个仓库出来。

mkdir gitcode

创建仓库 git init,创建之后cd .git就可以进入到创建的本地仓库中了。.git目录是Git来跟踪管理仓库的,不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。

(2) 配置Git

安装Git后首要做的事情是设置你的用户名称和e-mail地址,这是非常重要的。

配置命令为

git config user.name "name"
git config user.email "xxxxx@qq.com"

通过git config -l可以查看是否配置成功


删除配置命令

git config --unset user.name 
git config --unset user.email


git config --global user.name "name"
git config --global user.email "email"
git config -l
    user.name=name
    user.email=email
    core.repositoryformatversion=0
    core.filemode=true
    core.bare=false
    core.logallrefupdates=true

这个–global是一个可选项,如果使用了这个选项,标识这台机器上所有的git仓库都会使用这个配置。如果你希望在不同仓库中使用不同的name或e-mail,可以不要–global选项,但要注意,执行命令的时候必须要在仓库里。


删除对应的配置命令为

git config [--global] --unset user.name
git config [--global] --unset user.email

(3) 认识工作区,暂存区,版本库

在仓库中创建一个ReadMe文件,Git能否管理ReadMe文件??答案是不行的。

⼯作区:是在电脑上你要写代码或⽂件的⽬录。
暂存区:英⽂叫stage或 index。⼀般存放在 .git ⽬录下的index ⽂件(.git/index)中,我们把暂存区有时也叫作索引(index)。
版本库:⼜名仓库,英⽂名repository 。⼯作区有⼀个隐藏⽬录 .git ,它不算⼯作区,是Git的版本库。这个版本库⾥⾯的所有⽂件都可以被Git管理起来,每个⽂件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原” 。

在工作区中进行新增,修改,删除等之类的操作后,修改的工作区内容会写入对象库的一个新的git对象中。将对象管理起来就可以完成对版本的管理。

所有的对象都会存在这个objects中。

四、添加文件

使用git add 文件名可以将文件添加到暂存区,也可以使用git add . 这个命令是将当前目录下面的所有文件改动到暂存区当中。

在使用git commit 命令将暂存区内容添加到本地仓库中:

提交暂存区全部内容到本地仓库中: git commit -m “message”
提交暂存区的指定⽂件到仓库区: git commit [file1] [file2] … -m “message”

这个 "message"是要提交的细节,也可以说是这次提交版本的一个备注。

使⽤ git log 命令,来查看下历史提交记录

该命令显⽰从最近到最远的提交⽇志,并且可以看到我们commit时的⽇志消息。如果嫌输出信息太多,看得眼花缭乱的,可以试试加上 --pretty=oneline 参数:

这一大串数字是每次提交的commit id(版本号),这个数字是经过加密算法SHA1计算出来的一个非常大的数字,用十六进制表示。

五、查看.git文件

.git/
├── branches
├── COMMIT_EDITMSG
├── config
├── description
├── HEAD
├── hooks
│?? ├── applypatch-msg.sample
│?? ├── commit-msg.sample
│?? ├── post-update.sample
│?? ├── pre-applypatch.sample
│?? ├── pre-commit.sample
│?? ├── prepare-commit-msg.sample
│?? ├── pre-push.sample
│?? ├── pre-rebase.sample
│?? └── update.sample
├── index
├── info
│?? └── exclude
├── logs
│?? ├── HEAD
│?? └── refs
│??     └── heads
│??         └── master
├── objects
│?? ├── 1e
│?? │?? └── d7c1605990be5792ee92e05286efb364b1a79f
│?? ├── 42
│?? │?? └── 8b97b82b6c59cad7488b24e6b618ebbcd819bc
│?? ├── 6f
│?? │?? └── 014900d134c7702d875fe8626fcde0ec46ce83
│?? ├── info
│?? └── pack
└── refs
    ├── heads
    │?? └── master
    └── tags

index 就是我们的暂存区,add后的内容都是添加到这⾥的。
HEAD 就是我们的默认指向master分⽀的指针
objects为Git的对象库,⾥⾯包含了创建的各种版本库对象及内容。当执⾏git add命令时,暂存区的⽬录树被更新,同时⼯作区修改(或新增)的⽂件内容被写⼊到对象库中的⼀个新的对象中,就位于".git/objects"⽬录下.

六、修改文件

Git⽐其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,⽽⾮⽂件。

什么是修改?⽐如你新增了⼀⾏,这就是⼀个修改,删除了⼀⾏,也是⼀个修改,更改了某些字符,
也是⼀个修改,删了⼀些⼜加了⼀些,也是⼀个修改,甚⾄创建⼀个新⽂件,也算⼀个修改。让我们将 ReadMe ⽂件进⾏⼀次修改。

我对ReadMe的文件进行了修改,此时仓库中的ReadMe和我们工作区的ReadMe是不同的,如何查看当前仓库的状态呢? git status 命令用于查看你上次提交之后是否对文件进行再次修改。

上⾯的结果告诉我们,ReadMe 被修改过了,但还没有完成添加与提交 。

我们只知道文件被修改了,并不知道什么地方被修改了。

git diff [file] 命令⽤来显⽰暂存区和⼯作区⽂件的差异,显⽰的格式正是Unix通⽤的diff格式。也可以使⽤ git diff HEAD – [file] 命令来查看版本库和⼯作区⽂件的区别。知道了对ReadMe做了什么修改后,再把它提交到本地仓库就放⼼多了 。


add之后,就没看到no changes added to commit的消息了,接下来继续commit即可。

七、版本回退

前面说过,Git能够管理文件的历史版本,这也是版本控制器的重要能力之一。如果哪天工作出现了问题,可以先回退到上一个版本重新开始,这个时候就需要版本回退的功能了。

执行git reset 命令用于回退版本,可以指定退回某一次提交的版本。当然这个回退只是将版本库中的内容进行回退,工作区或暂存区是否进行回退需要有命令参数来决定。

git reset 命令语法格式为: git reset [–soft | --mixed | --hard] [HEAD]
–mixed 为默认选项,使⽤时可以不⽤带该参数。该参数将暂存区的内容退回为指定提交版本内
容,⼯作区⽂件保持不变。
–soft 参数对于⼯作区和暂存区的内容都不变,只是将版本库回退到某个指定版本。
–hard 参数将暂存区与⼯作区都退回到指定版本。切记⼯作区有未提交的代码时不要⽤这个命令,因为⼯作区会回滚,你没有提交的代码就再也找不回了,所以使⽤该参数前⼀定要慎重

八、撤销修改

(1) 场景一 对于还没有add的代码

在代码git add之后,又新添加了几行代码,发现代码出现问题,需要回退到git add的时候,可以使用

git checkout -- filename来撤销

[sxk@VM-4-13-centos gitcode]$ cat ReadMe 
HELLO WORLD!
[sxk@VM-4-13-centos gitcode]$ vim ReadMe 
[sxk@VM-4-13-centos gitcode]$ cat ReadMe 
HELLO WORLD!
HELLO WORLD!
HELLO WORLD!
[sxk@VM-4-13-centos gitcode]$ git checkout -- ReadMe
[sxk@VM-4-13-centos gitcode]$ cat ReadMe 
HELLO WORLD!
[sxk@VM-4-13-centos gitcode]$ 

(2) 场景二 已经 add ,但没有 commit

已经 add ,但没有 commit ,需要回退版本,可以使用git reset --mixed HEAD,将暂存区回退,在使用场景一中的 git checkout -- filename将工作区中的版本回退。

[sxk@VM-4-13-centos gitcode]$ git reset HEAD ReadMe
[sxk@VM-4-13-centos gitcode]$ git status
# On branch master
nothing to commit, working directory clean
[sxk@VM-4-13-centos gitcode]$ cat ReadMe 
HELLO WORLD!
[sxk@VM-4-13-centos gitcode]$ git checkout -- ReadMe
[sxk@VM-4-13-centos gitcode]$ cat ReadMe 
HELLO WORLD!

(3) 场景三 已经 add ,并且也 commit 了

要担⼼,我们可以 git reset --hard HEAD^ 回退到上⼀个版本!不过,这是有条件的,就是你还没有把⾃⼰的本地版本库推送到远程。还记得Git是分布式版本控制系统吗?我们后⾯会讲到远程版本库,⼀旦推送到远程版本库,就真的惨了……

[sxk@VM-4-13-centos gitcode]$ vim ReadMe 
[sxk@VM-4-13-centos gitcode]$ git add ReadMe
[sxk@VM-4-13-centos gitcode]$ git commit -m "modify"
[master f5a061b] modify
 1 file changed, 1 insertion(+)
[sxk@VM-4-13-centos gitcode]$ git reset --hard HEAD^
HEAD is now at 1ed7c16 add first file
[sxk@VM-4-13-centos gitcode]$ git status
# On branch master
nothing to commit, working directory clean
[sxk@VM-4-13-centos gitcode]$ cat ReadMe 
HELLO WORLD!
[sxk@VM-4-13-centos gitcode]$ 

九、删除文件

使用rm 命令只是把文件从工作区中删除了,但是暂存区和版本库中并没有改变,可以使用git rm filename和git commit -m "message"命令,将文件从暂存区和版本库中也删除

[sxk@VM-4-13-centos gitcode]$ touch test
[sxk@VM-4-13-centos gitcode]$ git add test
[sxk@VM-4-13-centos gitcode]$ git commit -m "del test"
[master e045872] del test
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 test
[sxk@VM-4-13-centos gitcode]$ git rm test
rm 'test'
[sxk@VM-4-13-centos gitcode]$ ll
total 4
-rw-rw-r-- 1 sxk sxk 13 Mar  4 20:38 ReadMe
[sxk@VM-4-13-centos gitcode]$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#	deleted:    test
#
[sxk@VM-4-13-centos gitcode]$ git commit -m "delete test"
[master 00bb8a2] delete test
 1 file changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 test
[sxk@VM-4-13-centos gitcode]$ git status
# On branch master
nothing to commit, working directory clean
[sxk@VM-4-13-centos gitcode]$ 

十、分支管理

在版本回退⾥,你已经知道,每次提交,Git都把它们串成⼀条时间线,这条时间线就可以理解为是⼀个分⽀。截⽌到⽬前,只有⼀条时间线,在Git⾥,这个分⽀叫主分⽀,即master分⽀。

再来理解⼀下HEAD,HEAD 严格来说不是指向提交,⽽是指向master,master才是指向提交的,所以,HEAD 指向的就是当前分⽀。

每次提交,master分⽀都会向前移动⼀步,这样,随着你不断提交,master分⽀的线也越来越⻓,⽽
HEAD只要⼀直指向master分⽀即可指向当前分⽀

(1) 创建分支

通过 git branch可以查看本地所有分支

[sxk@VM-4-13-centos gitcode]$ git branch
* master

通过 git branch CreateName可以创建新的分支

[sxk@VM-4-13-centos gitcode]$ git branch
  CreateName
* master

(2) 切换分支

如何切换到新建的分支下进行开发呢? 使用 git checkout CreateName可以完成切换

[sxk@VM-4-13-centos gitcode]$ git checkout CreateName 
Switched to branch 'CreateName'
// 在不同分支中对ReadMe进行修改。
[sxk@VM-4-13-centos gitcode]$ cat ReadMe 
HELLO WORLD!
[sxk@VM-4-13-centos gitcode]$ vim ReadMe 
[sxk@VM-4-13-centos gitcode]$ cat ReadMe 
HELLO WORLD!
HELLO WORLD!
HELLO WORLD!
HELLO WORLD!
HELLO WORLD!
------------------------------------------------------------------------------------
// 将文件提交到本地仓库
[sxk@VM-4-13-centos gitcode]$ git add ReadMe
[sxk@VM-4-13-centos gitcode]$ git commit -m "md ReadMe"
[CreateName fa00f51] md ReadMe
 1 file changed, 4 insertions(+)
------------------------------------------------------------------------------------
// 查看文件状态并将分支切换到master
[sxk@VM-4-13-centos gitcode]$ git status
# On branch CreateName
nothing to commit, working directory clean
[sxk@VM-4-13-centos gitcode]$ git branch
* CreateName
  master
[sxk@VM-4-13-centos gitcode]$ git checkout master
Switched to branch 'master'
------------------------------------------------------------------------------------   
// 文件在master分支下的内容
[sxk@VM-4-13-centos gitcode]$ git branch
  CreateName
* master
[sxk@VM-4-13-centos gitcode]$ cat ReadMe 
HELLO WORLD!
------------------------------------------------------------------------------------ 
// 文件在CreateName分支下的内容
[sxk@VM-4-13-centos gitcode]$ git checkout CreateName
Switched to branch 'CreateName'
[sxk@VM-4-13-centos gitcode]$ cat ReadMe 
HELLO WORLD!
HELLO WORLD!
HELLO WORLD!
HELLO WORLD!
HELLO WORLD!

为什么会出现这个现象呢?我们来看看CreateName分⽀和master分⽀指向,发现两者指向的提交是不⼀样的 。

[sxk@VM-4-13-centos gitcode]$ cat .git/refs/heads/CreateName 
fa00f518c0c2baffdd74cde515761de343dcff3d
[sxk@VM-4-13-centos gitcode]$ cat .git/refs/heads/master 
00bb8a2258f62a5afd79c77cf25549fb7a2fa6aa
[sxk@VM-4-13-centos gitcode]$ 

(3) 合并分支

为了在master主分⽀上能看到新的提交,就需要将 CreateName 分⽀合并到 master 分⽀ 。

将分支切换到master分支,并执行 git merge CreateName,就可以将分支合并到master中,然后在查看master中ReadMe的内容,可以发现,内容已经和CreateName分支中的ReadMe内容一样。

[sxk@VM-4-13-centos gitcode]$ git checkout master
Switched to branch 'master'
[sxk@VM-4-13-centos gitcode]$ git merge CreateName 
Updating 00bb8a2..fa00f51
Fast-forward
 ReadMe | 4 ++++
 1 file changed, 4 insertions(+)
[sxk@VM-4-13-centos gitcode]$ cat ReadMe 
HELLO WORLD!
HELLO WORLD!
HELLO WORLD!
HELLO WORLD!
HELLO WORLD!

Fast-forward代表“快进模式”,也就是直接把master指向CreateName的当前提交,所以合并速度⾮常快。当然,也不是每次合并都能Fast-forward。

(4) 删除分支

合并完成后,CreateName分⽀对于我们来说就没⽤了,那么CreateName分⽀就可以被删除掉,注意如果当前正处于某分⽀下,就不能删除当前分⽀。

通过 git branch -d CreateName来删除分支

[sxk@VM-4-13-centos gitcode]$ git checkout CreateName 
Switched to branch 'CreateName'
[sxk@VM-4-13-centos gitcode]$ git branch -d CreateName 
error: Cannot delete the branch 'CreateName' which you are currently on.
[sxk@VM-4-13-centos gitcode]$ git checkout master 
Switched to branch 'master'
[sxk@VM-4-13-centos gitcode]$ git branch -d CreateName 
Deleted branch CreateName (was fa00f51).
[sxk@VM-4-13-centos gitcode]$ 

(5) 合并冲突

在实际合并当中,可能会遇到代码冲突的问题。

# 1.创建新的分支dev1,并切换到分支dev1中把ReadMe文件进行修改,然后commit到本地仓库
[sxk@VM-4-13-centos gitcode]$ git branch dev1
[sxk@VM-4-13-centos gitcode]$ git checkout dev1 
Switched to branch 'dev1'
[sxk@VM-4-13-centos gitcode]$ vim ReadMe 
[sxk@VM-4-13-centos gitcode]$ cat ReadMe 
HELLO WORLD!
HELLO WORLD!
HELLO WORLD!
HELLO WORLD!
HELLO WORLD!
dev1 modify
[sxk@VM-4-13-centos gitcode]$ git add .
[sxk@VM-4-13-centos gitcode]$ git status
# On branch dev1
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#	modified:   ReadMe
#
[sxk@VM-4-13-centos gitcode]$ git commit -m "modify ReadMe: dev1"
[dev1 b472615] modify ReadMe: dev1
 1 file changed, 1 insertion(+)

# 2. 切换到分支master中,修改ReadMe的内容,并commit到本地仓库中
    
[sxk@VM-4-13-centos gitcode]$ git checkout master 
Switched to branch 'master'
[sxk@VM-4-13-centos gitcode]$ cat ReadMe 
HELLO WORLD!
HELLO WORLD!
HELLO WORLD!
HELLO WORLD!
HELLO WORLD!
[sxk@VM-4-13-centos gitcode]$ vim ReadMe 
[sxk@VM-4-13-centos gitcode]$ cat ReadMe 
HELLO WORLD!
HELLO WORLD!
HELLO WORLD!
HELLO WORLD!
HELLO WORLD!
master modify
[sxk@VM-4-13-centos gitcode]$ git add .
[sxk@VM-4-13-centos gitcode]$ git commit -m "modify ReadMe: master"
[master 05bf5ab] modify ReadMe: master
 1 file changed, 1 insertion(+)
[sxk@VM-4-13-centos gitcode]$ git branch
  dev1
* master

# 3. 合并dev1分支到master中,发现会出现冲突问题,并且ReadMe文件中的内容也会出现一些其他内容

[sxk@VM-4-13-centos gitcode]$ git merge dev1
Auto-merging ReadMe
CONFLICT (content): Merge conflict in ReadMe
Automatic merge failed; fix conflicts and then commit the result.
[sxk@VM-4-13-centos gitcode]$ cat ReadMe 
HELLO WORLD!
HELLO WORLD!
HELLO WORLD!
HELLO WORLD!
HELLO WORLD!
<<<<<<< HEAD
master modify
=======
dev1 modify
>>>>>>> dev1
[sxk@VM-4-13-centos gitcode]$ 

此时我们必须要⼿动调整冲突代码,并需要再次提交修正后的结果!!(再次提交很重要,切勿忘
记)

[sxk@VM-4-13-centos gitcode]$ vim ReadMe 
[sxk@VM-4-13-centos gitcode]$ cat ReadMe 
HELLO WORLD!
HELLO WORLD!
HELLO WORLD!
HELLO WORLD!
HELLO WORLD!
master modify
[sxk@VM-4-13-centos gitcode]$ git add .
[sxk@VM-4-13-centos gitcode]$ git commit -m "merge master"
[master 17985b9] merge master
[sxk@VM-4-13-centos gitcode]$ cat ReadMe 
HELLO WORLD!
HELLO WORLD!
HELLO WORLD!
HELLO WORLD!
HELLO WORLD!
master modify
[sxk@VM-4-13-centos gitcode]$ 

最后,不要忘记dev1分⽀使⽤完毕后就可以删除了

十一、分支管理策略

在这种 Fast forward 模式下,删除分⽀后,查看分⽀历史时,会丢掉分⽀信息,看不出来最新提交到底是merge进来的还是正常提交的 。

Git ⽀持我们强制禁⽤ Fast forward 模式,那么就会在 merge 时⽣成⼀个新的 commit ,这样,从分⽀历史上就可以看出分⽀信息。下⾯我们实战⼀下 --no-ff ⽅式的 git merge 。⾸先,创建新的分⽀ dev2 ,并切换⾄新的分⽀。所以在合并分⽀时,加上 --no-ff 参数就可以⽤普通模式合并,合并后的历史有分⽀,能看出来曾经做过合并,⽽ fast forward 合并就看不出来曾经做过合并。
创建一个新的分支,然后修改ReadMe中的内容,add,commit之后,切换分支到master,合并分支的时候使用

git merge --no-ff -m "merge dev" dev命令 -m ""是用来记录信息的。

[sxk@VM-4-13-centos gitcode]$ git merge --no-ff -m "merge dev" dev
Already up-to-date.
[sxk@VM-4-13-centos gitcode]$ cat ReadMe 
HELLO WORLD!
HELLO WORLD!
HELLO WORLD!
HELLO WORLD!
HELLO WORLD!
master modify
我是dev
[sxk@VM-4-13-centos gitcode]$ git log --graph --abbrev-commit 
*   commit cd08c07
|\  Merge: 17985b9 16286a2
| | Author: user <email>
| | Date:   Tue Mar 5 19:29:50 2024 +0800
| | 
| |     A
| |     A
| |     Merge branch 'dev'

(1) master分支

在实际开发中,master分支应该是非常稳定的,也就是仅仅用来发布新版本,平时不能在上面干活,干活都是在dev分支上,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;

你和你的同学在做项目的时候,每个人都有自己的分支,时不时的往dev分支上合并就可以了。

(2) bug分支

假如我们现在正在dev2分⽀上进⾏开发,开发到⼀半,突然发现 master 分⽀上⾯有bug,需要解决。在Git中,每个bug都可以通过⼀个新的临时分⽀来修复,修复后,合并分⽀,然后将临时分⽀
删除。可现在dev2的代码在⼯作区中开发了⼀半,还⽆法提交,怎么办?

git 提供了 git stash命令,可以将当前工作区信息进行存藏,被存藏的内容可以恢复出来。

[sxk@VM-4-13-centos gitcode]$ git checkout -b dev3
Switched to a new branch 'dev3'
[sxk@VM-4-13-centos gitcode]$ vim ReadMe 
[sxk@VM-4-13-centos gitcode]$ git stash
Saved working directory and index state WIP on dev3: cd08c07 A A Merge branch 'dev'
HEAD is now at cd08c07 A

现在就可以区修bug了

[sxk@VM-4-13-centos gitcode]$ git checkout -b fix_bug
Switched to a new branch 'fix_bug'
[sxk@VM-4-13-centos gitcode]$ git checkout master 
Switched to branch 'master'
[sxk@VM-4-13-centos gitcode]$ git merge -m "" fix_bug 
Already up-to-date.
[sxk@VM-4-13-centos gitcode]$ git branch -d fix_bug 
Deleted branch fix_bug (was cd08c07).

在bug修复完成之后,切换到master分支,完成合并,将bug分支删除。

切回dev3分支,通过 git stash list可以看到刚才存藏的工作现场。

[sxk@VM-4-13-centos gitcode]$ git stash list
stash@{0}: WIP on dev3: cd08c07 A A Merge branch 'dev'

使用 git stash pop命令可以在恢复工作区的同时把stash给删除了。

[sxk@VM-4-13-centos gitcode]$ git checkout dev3 
Switched to branch 'dev3'
[sxk@VM-4-13-centos gitcode]$ git stash list
stash@{0}: WIP on dev3: cd08c07 A A Merge branch 'dev'
[sxk@VM-4-13-centos gitcode]$ git stash pop
# On branch dev3
# 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:   ReadMe
#
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (a13b34d28bdb8d5374b115c2f1dc817ac040fc9b)
[sxk@VM-4-13-centos gitcode]$ 


再次查看的时候,就没有现场可以恢复了。
[sxk@VM-4-13-centos gitcode]$ git stash list
[sxk@VM-4-13-centos gitcode]$ 

另外,恢复现场也可以采⽤ git stash apply 恢复,但是恢复后,stash内容并不删除,你需要⽤ git stash drop 来删除;你可以多次stash,恢复的时候,先⽤ git stash list 查看,然后恢复指定的stash,⽤命令git stash apply stash@{0}


注意一个细节,我们让dev3进行的存藏,然后去修复master的bug,在解决bug之后,将bug分支和master分支进行了合并,但是,dev3中的master内容并不是解决完bug之后的master内容,在dev3中是看不到修复bug的相关代码的。

我们的最终⽬的是要让 master 合并 dev2 分⽀的,那么正常情况下我们切回 master 分⽀直接合并即可,但这样其实是有⼀定⻛险的。是因为在合并分⽀时可能会有冲突,⽽代码冲突需要我们⼿动解决(在 master 上解决)。我们⽆法保证对于冲突问题可以正确地⼀次性解决掉,因为在实际的项⽬中,代码冲突不只⼀两⾏那么简单,有可能⼏⼗上百⾏,甚⾄更多,解决的过程中难免⼿误出错,导致错误的代码被合并到 master 上。此时的状态为:

解决这个问题的⼀个好的建议就是:最好在⾃⼰的分⽀上合并下 master ,再让 master 去合并dev ,这样做的⽬的是有冲突可以在本地分⽀解决并进⾏测试,⽽不影响 master 。此时的状态为

(3) 删除临时分支

在开发的过程中,会有新功能要添加进来。添加一个新功能的时候,会先新建一个分支,在这个分支上面开发,完成后在合并,最后删除这个分支。

如果这个在这个分支上开发了一半,突然就不需要继续开发了,这个分支就要销毁了,留着没啥用了。这个时候,传统的 git branch -d命令删除分支的方法是不行的。

把小d换成D就可以强制删除了。

[sxk@VM-4-13-centos gitcode]$ git checkout -b dev4
M	ReadMe
Switched to a new branch 'dev4'
[sxk@VM-4-13-centos gitcode]$ vim ReadMe 
[sxk@VM-4-13-centos gitcode]$ git add .
[sxk@VM-4-13-centos gitcode]$ git commit -m "dev4"
[dev4 d7b27ca] dev4
 1 file changed, 2 insertions(+)
[sxk@VM-4-13-centos gitcode]$ git checkout master 
Switched to branch 'master'
[sxk@VM-4-13-centos gitcode]$ git branch -d dev4
error: The branch 'dev4' is not fully merged.
If you are sure you want to delete it, run 'git branch -D dev4'.
[sxk@VM-4-13-centos gitcode]$ git branch -D dev4
Deleted branch dev4 (was d7b27ca).

十二、远程操作

前面所说的所有内容,都是在本地,也就是我们自己的计算机上,但是我们的git其实是分布式版本控制系统。同一个git仓库,可以分部到不同的机器上。我们可以将Git仓库托管到github或者gitee上,就可以免费获得git远程仓库。github是国外的网站,速度可能会比较慢。

(1) 新建远程仓库

点 New repository可以创建仓库。

这里我选的是public

这样就可以简单的创建一个远程仓库了。


如果你写了一个项目并且公开了,那么别人在阅读你的代码的时候发现问题了,这个时候别人就可以在lssues中提出问题。


在实际的开发中,并不会直接让代码和master分支进行合并,而是会PR(Pull Requests)拉去一个请求,来帮助自己和别人协作编写代码,然后由管理员同意了,才可以进行merge。

(2) 克隆远程仓库

a. 通过HTTPS克隆

克隆/下载远端仓库到本地,需要使⽤ git clone 命令,后⾯跟上我们的远端仓库的链接

[sxk@VM-4-13-centos storage]$ git clone https://github.com/HaiFanNeon/remote-github.git
Cloning into 'remote-github'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
[sxk@VM-4-13-centos storage]$ ls
gitcode  remote-github
[sxk@VM-4-13-centos storage]$ 

如果你是第一次clone的话,需要输入你github或者gitee的用户和密码。

[sxk@VM-4-13-centos remote-github]$ ls -al
total 16
drwxrwxr-x 3 sxk sxk 4096 Mar  6 18:52 .
drwxrwxr-x 4 sxk sxk 4096 Mar  6 18:51 ..
drwxrwxr-x 8 sxk sxk 4096 Mar  6 18:52 .git
-rw-rw-r-- 1 sxk sxk   30 Mar  6 18:52 README.md

这个仓库里面有创建远程仓库时候选择的 add a README file选项自动创建的README文件。

b. 通过SSH克隆

SSH协议是采用的公钥加密和解密的过程,所以我们需要先添加一个public key,将本地服务器上的public key添加到github中。

[sxk@VM-4-13-centos storage]$ git clone git@github.com:HaiFanNeon/remote-github.git
Cloning into 'remote-github'...
The authenticity of host 'github.com' can't be established.
Are you sure you want to continue connecting (yes/no)? y
Please type 'yes' or 'no': yes
Warning: Permanently added 'github.com' (ECDSA) to the list of known hosts.
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
[sxk@VM-4-13-centos storage]$ 

在没有配置public key的情况下强行clone就会出现报错。


第⼀步:创建SSH Key。在⽤⼾主⽬录下,看看有没有.ssh⽬录,如果有,再看看这个⽬录下有没有
id_rsa 和 id_rsa.pub 这两个⽂件,如果已经有了,可直接跳到下⼀步。如果没有,需要创建
SSH Key:

[sxk@VM-4-13-centos .ssh]$ ssh-keygen -t rsa -C "email" // 这里的邮箱要跟你的github或者gitee中的邮箱相对应
Generating public/private rsa key pair.
Enter file in which to save the key (/home/sxk/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/sxk/.ssh/id_rsa.
Your public key has been saved in /home/sxk/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:+6hLrOOna4IrASg/tkF8Jd4jlfpUIDU7awZMxCbla3M haifan0312@163.com
The key's randomart image is:
+---[RSA 2048]----+    |
+----[SHA256]-----+

把id_rsa.pub中的密钥拷贝到github或者gitee中

[sxk@VM-4-13-centos storage]$ git clone git@github.com:HaiFanNeon/remote-github.git
Cloning into 'remote-github'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.
[sxk@VM-4-13-centos storage]$ 

当我们在使用ssh进行clone的时候就可以完成了。


如果有多个⼈协作开发,GitHub/Gitee允许添加多个公钥,只要把每个⼈的电脑上的Key都添加到GitHub/Gitee,就可以在每台电脑上往GitHub/Gitee上提交推送了 。

(3) 向远程仓库推送

本地已经 clone 成功远程仓库后,我们便可以向仓库中提交内容(git push命令)

git push <远程主机名> <本地分⽀名>:<远程分⽀名>
如果本地分⽀名与远程分⽀名相同,则可以省略冒号:
git push <远程主机名> <本地分⽀名>

sxk@VM-4-13-centos storage]$ 先进入到remote目录下面^C
[sxk@VM-4-13-centos storage]$ cd remote-github/
[sxk@VM-4-13-centos remote-github]$ ls
README.md
[sxk@VM-4-13-centos remote-github]$ touch hello_world.cc
[sxk@VM-4-13-centos remote-github]$ vim hello_world.cc 
[sxk@VM-4-13-centos remote-github]$ 写了一个helloworld的代码^C
[sxk@VM-4-13-centos remote-github]$ 现在将这个代码推送到远程仓库^C
[sxk@VM-4-13-centos remote-github]$ git config -l
user.name=name
user.email=email
name和email要和github/gitee中的name和email对应
[sxk@VM-4-13-centos remote-github]$  git add .
[sxk@VM-4-13-centos remote-github]$ git commit -m "create hello_world.cc"
[main 3914558] create hello_world.cc
 1 file changed, 7 insertions(+)
 create mode 100644 hello_world.cc
[sxk@VM-4-13-centos remote-github]$ git push origin(是往远程推送的) main(推送的是本地的main分支):main(推送到远程分支main中,如果远程分支和本地分支一样,可以省略远程分支 不写)^C
[sxk@VM-4-13-centos remote-github]$ git push origin main 
Counting objects: 4, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 372 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: To git@github.com:HaiFanNeon/remote-github.git
   9bdd187..3914558  main -> main
[sxk@VM-4-13-centos remote-github]$ 

这就推送成功了。

(4) 拉取远程仓库

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

的name和email对应



[sxk@VM-4-13-centos remote-github]$ git add .
[sxk@VM-4-13-centos remote-github]$ git commit -m “create hello_world.cc”
[main 3914558] create hello_world.cc
1 file changed, 7 insertions(+)
create mode 100644 hello_world.cc
[sxk@VM-4-13-centos remote-github]$ git push origin(是往远程推送的) main(推送的是本地的main分支):main(推送到远程分支main中,如果远程分支和本地分支一样,可以省略远程分支 不写)^C
[sxk@VM-4-13-centos remote-github]$ git push origin main
Counting objects: 4, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 372 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: To git@github.com:HaiFanNeon/remote-github.git
9bdd187…3914558 main -> main
[sxk@VM-4-13-centos remote-github]$



![](https://img-blog.csdnimg.cn/img_convert/98632b0f038014cc86e36ce025238fbb.png)



![](https://img-blog.csdnimg.cn/img_convert/08b01da68992d496fd53d3b713556dba.png)


这就推送成功了。



### (4) 拉取远程仓库





**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)**
[外链图片转存中...(img-QOyoeqgd-1713286869663)]

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值