0


程序员必备之——代码托管工具 git

1.1、git介绍

这是官方给出的git介绍:

  1. 代码托管与合并
  2. 版本控制
  3. 分布式(每一个终端都有一套完整代码)

闭坑:git是分布式版本控制工具,可以进行版本穿梭,但是有一个前提,就是你的修改再版本历史记录中是存在的,即 “该版本被提交到本地仓库或远程仓库” ,只有满足该条件,才会被记录位版本。

每次pull拉取远程仓库的代码时,要先把本地修改提交(commit)到本地仓库

(不commit直接pull,远程库代码会覆盖本地代码的修改,提交到本地库再pull,会把本地修改和远程库代码合并)

每次push推送代码前,也要先把修改提交到本地库,然后pull拉取远程仓库的代码(合并远程库和本地修改),然后再push

(不pull直接push,会覆盖远程库代码,别人的修改提交就会被覆盖)

解析:

git是代码的一套托管工具,它分为两个仓库,首先将你写的代码提交到本地仓库,这个时候只有你可以看,和你一起开发的同事看不到。将本地仓库的代码推到远程仓库(githab、gitee、gitlab等之一),然后你的同事就可以通过一个git的命令拉下你推到远程仓库的代码了。同样,只有你同事将他写的代码推送到远程仓库后,你执行git命令才能把他写的代码拉下来,合并到你的代码里。

这就是代码托管仓库的一部分优势,或许你感觉不到什么,老王举个例子,你们三个前端做一个项目,写一部分就得汇总合并一次代码吧?没有这个托管工具你怎么合并?咋用个小u盘咋copy一下,那得copy多少次,合并起来多困难,这就是代码托管工具的优势,通过几行简单的命令就实现了代码的托管和合并。

git还有一个优势,就是可以回到你提交代码的任意一个历史版本。例如,你写了这三个功能,上传,删除,添加。每写完一个功能就提交一次仓库,本地或者远程仓库都可以/后来又写了半天,发现写不对了,你想回到上传时候的代码,这个时候通过git命令也是可以回去的。

老王叨叨这么好多字,现在大家对git是不是有了一个初步的了解?

为了加深大家的记忆,便于理解,通过画图解析一下:

1.2、git本地安装及配置

1、下载地址: https://git-scm.com/

2、安装,下一步,安装完成

3、安装完成后,打开终端,执行git --version检查是否成功安装

安装成功后,在桌面或文件夹内右击会出现Git Bash Here 选项,点击会打开git命令窗口

4、基本配置

在git设置用户名和邮箱(git命令窗口里不可以使用快捷键复制粘贴,必须使用鼠标右击复制粘贴)

配置用户名:

 git config --global user.name "用户名英文"

配置用户邮箱:

 git config --global user.email "你的邮箱"

基本配置完成。

5、初始化项目

项目的git命令窗口执行 git init 命令,初始化项目,在项目文件夹中出现 .git 文件,项目初始化完成。

1.3、git远程仓库

推荐gitee,国内代码托管仓库

1、网址:http://gitee.com/

2、直接注册

3、注册后配置ssh密钥(仓库权限)

为什么配置密钥?

就是为了解决,git提交代码的时候,不用每次都输入用户名和密码。配置后,可以直接提交。

生成密钥的指令:

 ssh-keygen -t rsa -C "这里输入你的邮箱@xxxxx.com"  

获取密钥:

密钥路径:

密钥文件:

在远程仓库配置公钥

配置完成后,在git窗口输入:

 ssh -T [email protected]

如果返回下面内容,就证明配置成功。

 Hi XXX! You've successfully authenticated, but Gitee.com does not provide shell access.

二、git的命令及使用

2.1、基础命令

将代码推送到暂存区

//注意: add 后面有一个空格

git add .

将暂存区代码推送到本地仓库

//commit 后面有一个空格

git commit -m '本次提交的注释说明'

拉取远程仓库的代码

//在拉取远程代码的时候,必须执行上面两步,将你刚写的代码存到本地仓库,如果不执行前面两步,那你刚写的的代码就会被拉下来的代码覆盖
//只有你存到本地仓库了,才不会被覆盖,存到本地仓库再拉取,就会把你的修改和远程库的最新版本合并

git pull

将拉取的最新版本和你的本地仓库的最新修改合并,然后推送到远程库

git push

查看提交详细信息

git log

如图:

查看提交过的历史版本号

git log --online

如图:

版本穿梭,根据版本号,回到历史版本

//回到指定历史版本

git checkout 版本号

//或者 , master 就是回到最近的一次提交的历史版本

git checkout master

回到指定版本

回到最近版本

三、git的分支

使用git分支可以同时展开多条任务线,例如add分支写添加功能代码,delete分支写删除功能,edit写修改功能,同时写多个功能,且互不影响。例如在工作中,你正在写一个add功能,而领导要你紧急添加一个删除功能,这时你就可以先创建一个删除功能的分支,且不会影响你原来在写的功能代码。

git默认master分支,也叫主分支

3.1、常用命令

创建分支命令

git branch 分支名

查看所有分支命令

git branch

//前面带星号的是当前分支

切换分支

git checkout 分支名

** 合并分支**

//把指定分支 合并到 当前分支

git marge 分支名
 // 先把在dev分支写的代码提交到本地仓库
 git add .
 git commit -m '我是dev分支写的代码'
 
 // 切换回要合并的master主分支
 git checkout master
 
 // 拉取远程的代码到master主分支(将同事的代码和你之前提交到远程的代码拉回来)
 git pull
 
 // 将dev分支写的代码合并到master上
 git merge dev
 
 // 合并完之后,将合并的代码和pull拉下来的代码,一起推到远程仓库
 git push

3.2、执行效果图

  1. 创建分支
  2. 将分支上的代码提交到本地库
  3. 切换回主分支,拉取远程库代码
  4. 将分支代码合并到主分支

先创建分支,将分支上的代码提交到本地库

回到主分支,并拉取远程库代码 (这里因为没有远程库,就没有pull)

然后,将分支合并到当前主分支

3.3、合并时有冲突该怎么办?

  1. 修改代码,解决冲突
  2. 重新提交到本地库
  3. push到远程仓库

冲突就是你pull下代码后,将分支合并到主分支时,发现你同事和你修改了同一个地方,就会出现冲突。

我们模拟一下,Dev分支中,你写了13行

你的同事在master分支上,在该文件的第13行也进行了编辑修改

合并Dev分支和master分支时,就会出现冲突

报错翻译

3.4、解决冲突

决定留下谁的代码,或者都留下,或都不保留

做出选择后,需要重新add、commit,将合并的代码推到本地仓库,然后在push,将代码推送到远程。

如果你还要在dev写,那就得把master最新得代码(包括同事的)合并到dev,然后接着在dev开发。

3.5、git分支图解

GIt 的分支之间 是相互不影响的,即使是提交到本地仓库,也是互不影响的,每个分支上的本地仓库都是独立互不影响的,或者说每个本地仓库都是一个单独的分支。

工作中,我们都是多分支工作,一个运行分支,一个开发分支,一个自己的研发分支,

自己在个人研发分支完成功能开发后,合并到开发分支,检测有没有Bug冲突,没有问题再合并到运行分支(主分支)

四、连接远程仓库

4.1、在gitee新建远程仓库

点击加号,点击新建仓库

填写项目信息

创建成功提示

添加远程仓库,并将本地master和远程master关联

4.2、关联远程仓库

本地无仓库

  1. 创建初始化本地仓库
  2. 将所有文件推送到本地库
  3. 关联远程库
  4. 将本地库分支和远程库分支关联

本地有仓库

  1. 关联远程库
  2. 将本地库分支和远程库分支关联

4.3、克隆代码

赋值仓库ssh

新建文件夹,打开该文件夹下终端输入一下命令

git clone ssh地址

五、忽略文件

有时候,我们不想把某些文件纳入版本控制之中,比如依赖包,临时文件等

这个时候可以利用 .gitgnore 文件,设置忽略规则

  1. .gitgnore 文件的注释文本以 # 开头
  2. 可以使用Linux通配符,例如 : *.txt ,代表 忽略所有以.txt结尾的文件
  3. !感叹号代表例外规则,将不被忽略
  4. 目录后面加 / 分隔符,代表忽略该目录下的子目录(只忽略该目录下的子目录,而不忽略该目录下的文件)
  5. 目录前面加 / 分隔符,代表只忽略该路径下的指定文件
#井号开头,该行为注释内容

*.txt             #忽略所有 .txt 结尾的文件,这样的话此类文件不会被git上传

!zxf.txt         #zxf.txt文件例外,它不会被忽略

/temp             #只忽略该路径下的txt文件

view/             #view路径下的所有文件会被忽略

view/*.txt        #忽略view路径下的所有txt文件,但不包括它子目录下的txt文件

常用规则配置:

bin/: 忽略当前路径下的bin文件夹,该文件夹下的所有内容都会被忽略,不忽略 bin 文件

/bin: 忽略根目录下的bin文件

/*.c: 忽略 cat.c,不忽略 build/cat.c

debug/*.obj: 忽略 debug/io.obj,不忽略 debug/common/io.obj 和 tools/debug/io.obj

**/foo: 忽略/foo, a/foo, a/b/foo等

a/**/b: 忽略a/b, a/x/b, a/x/y/b等

!/bin/run.sh: 不忽略 bin 目录下的 run.sh 文件

*.log: 忽略所有 .log 文件

config.php: 忽略当前路径的 config.php 文件

六、常用指令汇总

window 安装 Git

# 第一步、Git官网下载Git傻瓜式安装,可以打开git bash即为成功。
# 第二步、设置参数
$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"

# 获取config信息
$ git config --list 

# 去掉git add 命令后 出现的一堆CR LF提示信息,其中CR是回车的意思 LF是换行
$ git config --global core.safecrlf false 

# 存储凭证 (可用于输入一次用户密码后,不再输入 有时我们已经用SSH key 绑定关联好了 但是每次git提交的时候 还是需要你输入用户名密码 在这个时候 敲入这个命令 将凭证存储起来 用户名密码就不需要再次输入了)
$ git config --global credential.helper wincred 

# 将commit命令设置别名ci git commit命令将由git ci来代替
$ git config --global alias.ci commit 

创建仓库

# 进入目录,将它变成Git可以管理的仓库
$ git init

文件提交至仓库

# 文件添加至暂存区
$ git add <file>

# 暂存区内容提交至时间线
$ git commit -m <message>

# 直接使用该指令,相当于执行了以上两条指令
$ git commit -am "备注信息" 

查看当前仓库状态

# 时刻掌握仓库当前的状态
$ git status

# 具体指定文件修改(工作区 对比 暂存区)
$ git diff <file>

# 工作区 对比 暂存区 之间的差异
$ git diff

# 查看暂存区和仓库差异
$ git diff --cached

# 查看工作区文件状态
$ ls

# 查看暂存区的状态
$ git ls-files

版本回退

# 查看日志
$ git log

# 日志简洁输出
$ git log --pretty=oneline

# 日志时间线视图形式输出
$ git log --graph

# Git中,用HEAD表示当前版本,上一个版本是HEAD^,上上一个版本是HEAD^^
# 往上100个版本是HEAD~100
$ git reset --hard HEAD^

# 若又想找回怎么办
# 先查找commit id
$ git reflog

# 使用id切换版本
$ git reset --hard commit_id

撤销修改

# 丢弃工作区的修改
$ git checkout -- file

# 已经进入暂存区的修改撤销,重新放入工作区
$ git reset HEAD <file>

# 已经提交至版本库,版本回退
$ git reset --hard commit_id

删除文件

# 一般情况下,在文件管理器或使用rm删除文件。这个时候需要将操作提交至暂存区
$ git rm <file>

# 接着commit
# 还有一种情况是误删,但是版本库中还是保存了旧版本可以恢复
$ git checkout -- file
# git checkout实际上是使用时间线上一个版本中的内容将现工作区替换(用上个版本中的该文件替换该版本中的该文件)

创建远程仓库

# 第一步创建SSH Key。
$ ssh-keygen -t rsa -C "[email protected]"
#然后可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个文件就是SSH Key的密钥对,一个是私钥,一个是公钥。
# 第二步,登录网站,添加上自己的公钥密钥

添加远程仓库(本地已有仓库)

# 首先在Github建立空的远程仓库,接着将本地仓库与之关联
# origin的名称可以更改,是本地仓库终端操作时,保存的远程仓库的本地命名
$ git remote add origin [email protected]:michaelliao/example.git

# 本地仓库所有内容推送
# 实际上是将当前分支master推送,第一次需加-u参数,将本地的master与远程的新的master相关联
# 以后不需要再添加-u参数,直接git push 推送即可
$ git push -u origin master

# 本地修改提交
$ git push origin master

# 查看远程库信息
$ git remote -v

# 根据远程库名字删除远程库
$ git remote rm name

# 更新仓库(比如检测不到新建分支时)
$ git remote update origin

从远程库克隆(本地无仓库)

# 现有远程库,我们本地从零开发
# 没有本地库,直接从远程库克隆本地库
$ git clone [email protected]:michaelliao/gitskills.git

# 克隆指定分支
$ git clone -b 分支名 [email protected]:michaelliao/gitskills.git

创建与合并分支

# 创建并切换到一个叫dev的新分支
# 加上-b,表示创建并切换。相当于以下两部
$ git checkout -b dev

# 创建dev分支
$ git branch dev

# 切换到dev分支
$ git checkout dev

# 查看分支情况
$ git branch

# 若dev上做了很多工作,现在dev合并到master
$ git checkout master
$ git merge dev

# 合并后dev的工作就全部保存至master,可以放心删除
$ git branch -d dev

# swich,新的分支操作命令。
# 创建并切换
$ git switch -c dev

# 切换至master
$ git switch master

# 普通模式下合并分支,不加参数,Git会自动使用Fast forward模式合并,删除分支后,不会保留此处合并分支的信息。普通模式则会生成一个commit
$ git merge --no-ff -m "merge with no-ff" <branch>

# 删除分支
$ git branch -d 分支名

# 查看远程所有分支
$ git branch -r

# 合并某个或某些提交到指定分支
# 拉取最新代码
$ git pull    
# 查看提交信息,复制要合并的commit id
$ git log    
# 切换要合并到的分支
$ git checkout branch    
# 将A提交合并到当前分支
$ git cherry-pick A    
# 将A和B提交合并到当前分支
$ git cherry-pick A B 
# 将A至B的所有提交合并到当前分支,不包含A
$ git cherry-pick A..B 
# 将A至B的所有提交合并到当前分支,包含A
$ git cherry-pick A^..B 

Bug分支

# 遇到bug,先保存当前工作现场 (因为当前工作未完成,不能提交,但是不提交又不能切换分支)
$ git stash
# 现在工作区将是最开始那样,干净的。

# 可以去改bug了。
# 确定在哪个分支上面修复Bug,假设在master上面修复
$ git checkout master
$ git checkout -b issue-101
......
# 修复完成,合并分支
$ git merge --no-ff -m "merged bug fix 101" issue-101
$ git branch -d issue-101
# bug修改结束了

# 回到之前的分支
$ git switch dev
# 查询之前储存的现场
$ git stash list
# 第一种恢复,stash需删除命令
$ git stash apply
$ git stash drop
# 第二种,恢复并删除
$ git stash pop
# 可以多次stash,然后恢复指定的
$ git stash apply stash@{0}
# 现在的bug是在master上面修复的,别的分支
$ git cherry-pick <commit>
#复制一个特定的提交至当前分支
标签: git

本文转载自: https://blog.csdn.net/m0_62348004/article/details/127361022
版权归原作者 轻风~~ 所有, 如有侵权,请联系我们删除。

“程序员必备之——代码托管工具 git”的评论:

还没有评论