Git常规应用
关联博客
https://blog.csdn.net/lingxiao16888/article/details/142672273?spm=1001.2014.3001.5502
1,前文
Git是分布式版本控制系统,没有中央服务器,每个人的电脑就是一个完整的版本库,工作的时候不需要联网了,因为版本都在自己电脑上。协同的方法是这样的:比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
git流程图
git文件组成图
-
Directory:使用Git管理的一个目录,也就是一个仓库,包含了工作空间和git的管理空间。
-
WorkSpace:需要通过git进行版本管理的目录和文件,这些目录和文件组成了工作空间。
-
.git:存放Git管理信息的目录,初始化仓库的时候自动创建
-
Index/Stage:暂存区,或者称之为待提交区,在提交进入Local Repository之前,可以将所有的变更放入暂存区
-
Local repository:本地仓库,一个存放在本地的版本库;HEAD存放当前的开发分支(branch)
-
Stash:隐藏,是一个工作状态的保存栈,用于保存和回复workspace中的临时状态
Git本地有三个工作区域:工作目录(Working Directory),暂存区(Stage/Index),资源库(repository或Git Directory)。如果加上远程的Git仓库(Remote Directory)既可以分为四个区域。Workspace:工作区,平时存在项目代码的地方Index/Stage:暂存区,用于临时存放改动,事实上它只是个文件,保存即将提交到文件列表信息Repository:仓库区(本地仓库),存放数据的位置,这里有提交的所有版本的数据,其中Head指向最新放入仓库的版本Remote:远程仓库,托管代码的服务器。
2,基本linux命令
1,cd:改变目录2,cd ..:回退到上一个目录,直接cd是进入默认目录3, cd ~/:切换到默认主目录指的是C:\Users\administrator4,ls(ll):都是列出当前目录中的所有文件,只不过ll列出的内容更为详细,ls -a :查看当前目录下所有的文件,包含隐藏的文件5,pwd:显示当前所在的目录路径。6,touch:新建一个文件如touch index.js就是在当前目录下新建一个index.js文件7 ,echo "这是文件2" >> file2.txt:创建文件file2.txt 并编辑内容为“这是文件2”8,rm:删除一个文件,rm index.js 就是将当前目录下的index.js删除9,mkdir:新建一个目录,即新建一个文件夹10,rm-r:删除一个文件夹,rm -r src 删除文件夹src11,mv:移动文件,mv index.js src index.js是需要移动的文件,src是目标文件夹12,reset:初始化终端/清屏13,history:查看命令历史14,cat :查看文件内容,cat filename 查看fileName内容15,help:帮助16,exit:退出14,#:注释
3,Git安装与常用命令
本教程中的git命令
都在Git Bash
中演示,将使用Linux
一些基本的基本命令.
在linux中Ctrl+C是关闭,不是复制,若要复制只需左键拖选需要复制的文本,在需要粘贴的地方按下滚轮即可。
3.1,基础操作
3.1.1,环境配置命令
1,查看配置 git config -l,git config --system --list:查看系统(system级别)配置。git config --global --list:查看全局用户(global级别)配置,例如查看全局用户与emailgit config --local --list:查看当前(local级别)配置Git相关的配置文件路径:1,D:\Program Files\Git\etc\目录下gitconfig文件:git安装目录下的config --system 系统级 2,C:\Users\administrator\目录下的.gitconfig文件: 当前登录用户的配置 --global级别3,位于.git 目录下的config文件保存了当前配置---Local级别优先级:System < global < local2,添加配置(必须配置不配置无法推送,该记录保存至C:\Users\administrator\目录下的.gitconfig文件)git config --global user.name zhangsangit config --global user.email 1234567@163.com3,删除配置git config [--global|--system|--local] --unset section.key#例如,删除当前用户git config --global --unset user.name
3.1.2,基本配置
-
打开Git Bash
-
设置用户信息
#用户邮箱账号不一定需要必须真实存在 # git config --global section.key value git config --global user.name "itcast" git config --global user.email "123@163.com" #查看配置信息 git config --global user.name git config --global user.email
3.1.3, 为常用指令配置别名(可选)
有些常用的指令参数非常多,每次使用需要输入多个参数,这样可以通过使用别名进行简化输入。
- 打开用户目录,创建
.bashrc
文件
部分window系统不允许用户创建点好尅头的文件,可以打开gitBash
执行touch ~/.bashrc
.注意~表示是用户的基本目录即C:\Users\administor
- 在
.bashrc
文件中输入如下内容:
#用于输出git提交日志
alias git-log='git log --pretty=oneline -all --graph --abbrev-commit'
#用于输出当前目录所有文件及基本信息
alias ll='ls -al'
- 打开
gitBash
,执行source ~/.bashrc
3.1.4,忽略文件
有些时候不想将某些文件纳入版本控制中,比如数据库文件,临时文件,设计文件等,可通过创建.gitignore文件解决。在主目录下建立".gitignore"文件,此文件有如下规则
1,忽略文件中空行或以#开始的行
2,可以使用linux通配符。例如*代表任意多个字符,?代表一个字符,[abc]代表可选字符范围,大括号{string1,string2}代表可选的字符串等
3,如果名称的最前面有一个!,表示例外规则,将不被忽略。
4,如果名称的最前面是一个路径分隔符/,表示要忽略的文件在此目录下,而子目录的文件不忽略
5,如果名称的最后面是一个路径分隔符/,表示要忽略的是此目录下该名称的子目录,而非文件(默认文件或文件都忽略)
3.1.5,解决GitBash乱码问题
-
打开GitBash执行下面命令
git config --global core.quotepath false
-
$(git_home)/etc/bash.bashrc
文件最后加入下面两行#实际上就是D:\Program Files\Git\etc\bash.bashrc文件 export LANG="zh-CN.UTF-8" export LC-ALL="zh-CN.UTF-8"
3.2,获取本地仓库
要使用Git对我们的代码进行版本控制,首先需要获得本地仓库
-
在电脑任意位置创建一个空目录(例如test)作为本地Git仓库。
-
进入这个目录,点击右键打开Git bash窗口。
-
执行命令
git init
#在当前目录中初始化创建一个空的git仓库 git init # 新建一个project-name目录,将其初始化git代码库 $ git init [project-name]
-
如果创建成功了可在文件夹下看到隐藏的
.git
目录。
3.3, 基本操作指令
git工作目录下对于文件的修改(增加,删除,更新)会存在几个状态,这些修改的状态随着我们执行git命令而发生变化 (本地仓库中除了.git文件夹及其内容其他的文件都属于工作目录)。
本章节主要讲解如何使用命令控制这些状态之间的转换:
3.3.1,文件状态管理与操作
Untracked:未跟踪,此文件在文件夹,但并没有加入Git库,不参与版本控制,通过Git add 状态变为 Staged,使用git rm --cached filename 移除跟踪(本质是将文件从暂存区删除但是保留工作区)Unmodify:文件已入库,未修改,即版本中的快照与文件夹中一致。这种文件有两个去处,如果它被修改状态就变为Modified。如果使用git rm 则移除版本状态变为UntrackedModidy:文件已修改,仅仅是修改,并没有进行其他操作,这个文件有两个去处,通过git add可进入 暂存 staged状态,使用Git checkout 则丢弃修改返回unmodity状态,这个Git checkout 即从仓库取出文件,覆盖当前修改,Staged:暂存状态,执行git commit 则将修改同步到库中,这是库中的文件和本地文件又变为一致,文件为Unmodify状态,执行git reset HEAD filename 取消暂存,文件状态为Modifyed
3.3.1.1,git add (工作区->暂存区)
#添加执行的文件
git add fileName
#可使用通配符 例如git add *.txt 表示将该目录下的所有txt提交到暂存区,
#例如git add . 将该目录的文件提交到暂存区,其中.表示当前目录
git add .
3.3.1.2, git commit (暂存区->本地仓库)
- 作用:提交暂存区内容到本地仓库的当前分支
- 命令形式:
git commit -m"注释内容"
3.3.1.3, 修改最后一次提交
git commit --amend
* 作用:修改最后一次提交,将最后一次的提交信息载入到编辑器中供你修改。 当保存并关闭编辑器后,编辑器会将更新后的提交信息写入新提交中,它会成为新的最后一次提交。新的改进后的提交将 **替换** 掉旧有的最后一次提交。
3.3.1.4, 工作区与暂存区同时删除文件
git rm filename :例如git rm file2.txt,删除文件file2.txt,删除后需要git commit
3.3.1.5, 删除暂存区保留工作区文件(即取消git对该文件的跟踪)
git rm --cached filename
3.3.1.6, 取消暂存区文件
git restore --staged filename
3.3.2,查看修改的状态
- 作用:查看修改的状态(暂存区,工作区)
- 命令形式:
git status
3.3.3,查看提交的日志
在配置别名git log
就包含了这些参数,所以后续可以直接使用指令git log
- 作用:查看提交的记录
- 命令形式:
git log [options]
- options
- –all:显示所有的分支
- –pretty=oneline:将提交信息显示为一行。
- –abbrev-commit:使得输出的
commitid
更简短 - –graph:以图的形式显示。
键入q键退出日志界面
- options
3.3.4,版本回退,还原
3.3.4.1,临时切换至某个历史版本或分支git checkout commitId
命令形式:git checkout commitId
作用:临时切换至某个历史版本或分支,其核心是"检出"操作,不修改分支历史。执行后会进入"分离HEAD"状态,此时工作目录内容会更新为指定提交的内容,但当前分支指针不会移动。
checkout
不会改变分支的提交历史,仅临时查看历史版本,适合测试旧代码或查看历史状态。若在分离HEAD状态下做了新提交,需显式创建新分支保存,否则切换分支时这些提交可能丢失。
# 查询当前log
$ git-log
* e515bb0 (HEAD -> master, origin/master) A 用户提交file01.txt修改
* 22680bb A用户在master分支上添加了file01.txt文件
* 404e9be 初始化创建仓库$ touch file02.txt
$ vi file02.txt
$ git add .
$ git commit -m '用户A 在master上创建file02.txt'
$ ls
README.md file01.txt file02.txt#注意这里的HEAD指向02eafc5
lizhigang@lzg-PC MINGW64 ~/Desktop/test (master)
$ git-log
* 02eafc5 (HEAD -> master) 用户A 在master上创建file02.txt
* e515bb0 (origin/master) A 用户提交file01.txt修改
* 22680bb A用户在master分支上添加了file01.txt文件
* 404e9be 初始化创建仓库# checkout:临时切换到历史版本 22680bb
$ git checkout 22680bb
Note: switching to '22680bb'.# 经过checkout commitId 后HARD指向22680bb,git log记录保留
$ git-log
* 02eafc5 (master) 用户A 在master上创建file02.txt
* e515bb0 (origin/master) A 用户提交file01.txt修改
* 22680bb (HEAD) A用户在master分支上添加了file01.txt文件
* 404e9be 初始化创建仓库# 在22680bb出创建分支develop
$ git branch develop
$ git branch
* (HEAD detached at 22680bb)developmaster#切换到分支develop
$ git checkout develop
Switched to branch 'develop'
$ ls
README.md file01.txt
$ git-log
* 02eafc5 (master) 用户A 在master上创建file02.txt
* e515bb0 (origin/master) A 用户提交file01.txt修改
* 22680bb (HEAD -> develop) A用户在master分支上添加了file01.txt文件
* 404e9be 初始化创建仓库# 在develop分支上新增文件file03.txt
$ touch file03.txt
$ git add .
$ git commit -m '用户A develop上添加file03.txt'
[develop c48169e] 用户A develop上添加file03.txt1 file changed, 0 insertions(+), 0 deletions(-)create mode 100644 file03.txt# 查询新增后的log
lizhigang@lzg-PC MINGW64 ~/Desktop/test (develop)
$ git-log
* c48169e (HEAD -> develop) 用户A develop上添加file03.txt
| * 02eafc5 (master) 用户A 在master上创建file02.txt
| * e515bb0 (origin/master) A 用户提交file01.txt修改
|/
* 22680bb A用户在master分支上添加了file01.txt文件
* 404e9be 初始化创建仓库
3.3.4.2, 直接重置分支指针到指定提交 git reset commitId
-
作用:属于"历史重写"操作,会永久丢弃后续提交。它会强制将工作区、暂存区和分支指针全部回退到目标提交状态,直接删除目标提交之后的所有提交记录,导致历史被重写。
-
命令形式:
git reset --hard commitId
git reset
:回退 有三个参数参数
soft
: 回退到某一个版本,保留工作区与暂存区。
hard
:回退到某一个版本,不保留工作区也不保存暂存区。
mixed
:回退到某一个版本,只保存工作区内容不保存暂存区内容
使用例子:git reset soft 版本Id
commitID
可以使用git log
或者git-log
查看(git-log
是别名,详情参考:为常用指令配置别名)
-
如何查看已经删除的记录?
git reflog
- 这个指令可以查看已经删除的记录,键入q退出日志界面
3.3.4.3,版本还原 git revert commitId
- 命令:
git revert commitId
- 描述:对选中版本提交的命令进行取反操作,即恢复到该版本提交前的初始值,影响的是此次提交的文件,而非所有文件,如果此次提交的文件在后面的提交中进行了修改,则需要手动解决冲突。
当使用git revert撤销包含文件创建的提交时,该命令会通过生成一个新的提交来反向操作原始提交的变更。具体处理方式如下:对于新增的文件: git revert会将该文件从工作区中删除,并在新生成的撤销提交中记录这一删除操作。例如,如果原始提交创建了文件newfile.txt,revert操作会生成一个删除该文件的提交,但不会修改历史记录。保留历史完整 与git reset不同,git revert不会移除原始提交,而是通过新增提交来抵消其变更。因此,历史记录中会保留文件创建和删除的完整轨迹,适合团队协作场景2。冲突处理: 如果被revert的提交创建的文件在后续提交中被修改过,可能会引发冲突,此时需要手动解决冲突后再完成revert操作。
3.3.5,日志清理
-
仅清理松散对象或优化存储,但不会删除提交历史
-
时间范围限定
使用git log --since="YYYY-MM-DD" --until="YYYY-MM-DD"
可以限定查询日志的时间范围,例如清理2019年1月1日之前的日志。 -
引用日志清理(仅清理松散对象或优化存储,但不会删除提交历史)
通过git reflog expire --expire=30.days
可以清理30天前的引用日志记录。若需查看所有操作历史以回滚误操作,可使用git reflog
并结合git reset HEAD@{n}
重置到指定提交。 -
垃圾回收(仅清理松散对象或优化存储,但不会删除提交历史)
执行git gc
命令会清理无用的对象(如已删除的分支、标签等),从而减小仓库体积。若需彻底清理未被跟踪的文件,可使用git clean -f -d
(强制删除未跟踪文件和目录),但需谨慎操作。 -
提交历史重构
若需合并多个提交(squash),可通过交互式变基实现:- 使用
git log --oneline
定位目标提交哈希; - 执行
git rebase -i HEAD~n
(n为提交数量),将后续提交标记为squash
; - 解决冲突后完成历史重构。
- 使用
-
-
创建全新仓库(最干净)
#-rf是rm命令的组合,具体含义如下#-r(或-R)表示递归删除,用于删除目录及其包含的所有子目录和文件#-f表示强制删除(force),不提示确认且忽略不存在的文件rm -rf .git # 删除本地.git目录git init # 重新初始化git add .git commit -m "Initial commit"
3.3.6,添加文件至忽略列表
一般有些文件不需要纳入git管理,也不需要他们总出现在未跟踪列表。通常都是些自动生成的文件或者日志,或者编译生成的临时文件。在这种情况下,可以在工作目录中创建一个名为.gitignore
的文件(文件名固定),列出需要忽略的文件,如以下示例:
有些时候不想将某些文件纳入版本控制中,比如数据库文件,临时文件,设计文件等,可通过创建.gitignore文件解决。在主目录下建立".gitignore"文件,此文件有如下规则
1,忽略文件中空行或以#开始的行
2,可以使用linux通配符。例如*代表任意多个字符,?代表一个字符,[abc]代表可选字符范围,大括号{string1,string2}代表可选的字符串等
3,如果名称的最前面有一个!,表示例外规则,将不被忽略。
4,如果名称的最前面是一个路径分隔符/,表示要忽略的文件在此目录下,而子目录的文件不忽略
5,如果名称的最后面是一个路径分隔符/,表示要忽略的是此目录下该名称的子目录,而非文件(默认文件或文件都忽略)
3.3.7,使用vi编辑器编辑文件
- 作用:在GitBash中直接编辑文件
- 进入Vi编辑器:
vi fileName
:使用vi编辑器对fileName进行编辑
#使用vi编辑器打开.gitignore文件vi .gitignore
- 退出Vi编辑器。
- 保存并退出
- 按ESC键:确保退出编辑模式返回命令模式。
- 输入
:wq
:保存修改并退出编辑器==(注意:wq
中的冒号不可省略)==.
- 不保存强制退出
- 按ESC键:切换至命令模式
- 输入
:q!
:放弃所有修改并强制退出
- 仅保存不退出
- 按ESC键
- 输入
:w
:保存文件但保持编辑器打开
- 保存并退出
3.4.8,文件的管理
3.4 ,分支
几乎所有的版本控制系统都以某种形式支持分支,使用分支意味着可以帮工作从开发主线上分离出来进行重大bug修复,开发新功能,避免影响开发主线。
3.4.1,查看本地分支
- 命令:
git branch
3.4.2,创建分支
- 命令:
git branch 分支名
3.4.3,切换分支(checkout)
- 命令:
git checkout 分支名
还可以切换到一个不存在的分支(新建并切换) - 命令:
git checkout -b 分支名
3.4.4,合并分支
一个分支上的提交可以合并到另一分支
命令:git merge 分支名称
3.4.5,删除分支
不能删除当前分支,只能删除其他分支
- 命令:
git branch -d b1
:删除分支b1,需要进行各种检查,例如删除未合并的分支将报错。 - 命令:
git branch -D b1
:不进行检测强制删除分支b1
3.4.6,解决冲突
当两个分支上对文件的修改可能会存在冲突,例如同时修改了同一文件的同一行,这个时候就需要手动解决冲突,解决冲突的步骤如下:
- 处理文件中冲突的地方。
- 将解决完冲突的文件加入暂存区(add)
- 提交到仓库(commit)
冲突部分的内容处理如下所示:
#在master分支上修改.gitignore文件如下:
master上修改
#在master分支上进行git add ,git commit
#git checkout到dev分支
#在dev分支上修改.gitignore文件如下(注意与master分支上修改的位置相同):
dev上修改
#在dev分支上进行git add ,git commit
#切换到master分支
#在master分支上进行git merge dev 分支合并
#提示自动合并冲突###1,处理文件中冲突的地方。
#打开.gitignore文件显示:
<<<<<<< HEAD
master上修改
=======
dev上修改
>>>>>>>dev
##处理办法
#手动处理.gitignore为需要的内容
master上修改ok###2,将解决完冲突的文件加入暂存区(add)
git add . ###3,提交到仓库(commit)
git commit -m "msg"
3.4.7,开发中分支的使用原则与流程
在开发中,一般有如下分支使用原则与流程:
-
master
(生产)分支
线上分支,主分支,中小规模项目作为线上运行的应用对应的分支 -
develop
(开发)分支
是从master创建的分支,一般作为开发部分的主要开发分支,如果没有其他并行开发不同期上线要求,都可以在此版本上进行开发,阶段开发完成后,需要时合并到哦master分支,准备上线。 -
feature/***
分支
从develop创建的分支,一般是同期并行开发,分支上的研发任务完成后合并到develop分支 -
hotfix/***
分支
从master派生的分支,一般作为线上bug修复使用,修复完成后需要合并到master,test,develop分支。 -
还有一些分支,例如
test
分支(用于代码测试)、pre
分支(预上线分支)等等。
4,Git远程仓库
4.1,常用的托管服务【远程仓库】
Git存在两种仓库即本地仓库和远程仓库,其中比较常见的远程仓库有GitHub
,GitLab
,码云
等。
github
(地址:https://github.com)是一个面向开源及私有软件项目的托管平台,因为只支持Git
作为唯一的版本库格式进行托管,故名gitHub
。
码云
(地址:https://about.gitee.com)是国内的一个代码托管平台,由于服务器在国内,所以相对于GitHub
,码云的速度更快。
GitLab
(地址:https://about.gitlab.com)是一个用于仓库管理系统开源项目,使用git作为代码管理工具,并在此基础上搭建起来的web服务,一般用于企业、学校内部网络搭建的git私服。
4.2,注册码云创建远程仓库配置SSH公钥
Gitee 提供了基于 SSH 协议的 Git 服务,在使用 SSH 协议访问仓库之前,需要先配置好仓库的 SSH 公钥。
Windows 用户建议使用 Windows PowerShell 或者 Git Bash,在 命令提示符 下无
cat
和ls
命令。
- 通过命令
ssh-keygen
生成 SSH Key:
ssh-keygen -t ed25519 -C "Gitee SSH Key"
-t
key 类型-C
注释
输出,如:
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/git/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/git/.ssh/id_ed25519
Your public key has been saved in /home/git/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:ohDd0OK5WG2dx4gST/j35HjvlJlGHvihyY+Msl6IC8I Gitee SSH Key
The key's randomart image is:
+--[ED25519 256]--+
| .o |
| .+oo |
| ...O.o + |
| .= * = +. |
| .o +..S*. + |
|. ...o o..+* * |
|.E. o . ..+.O |
| . . ... o =. |
| ..oo. o.o |
+----[SHA256]-----+
- 中间通过三次回车键确定
生成的秘钥文件保存在C:\Users\当前用户\.ssh
- 查看生成的 SSH 公钥和私钥:
ls ~/.ssh/
输出:
id_ed25519 id_ed25519.pub
- 私钥文件
id_ed25519
- 公钥文件
id_ed25519.pub
- 读取公钥文件
~/.ssh/id_ed25519.pub
:
cat ~/.ssh/id_ed25519.pub
输出,如:
ssh-ed25519 AAAA***5B Gitee SSH Key
复制终端输出的公钥。
添加部署公钥
复制生成后的 ssh key,通过仓库主页 「管理」->「部署公钥管理」->「添加部署公钥」 ,将生成的公钥添加到仓库中。
通过 ssh -T
测试时,输出 Anonymous:
$ ssh -T git@gitee.com
Hi Anonymous! You've successfully authenticated, but GITEE.COM does not provide shell access.
添加成功后,就可以使用 SSH 协议对仓库进行拉取。
4.3,操作远程仓库
4.3.1,添加远程仓库
此操作是先初始化本地库,然后与已创建的远程库进行对接。
-
命令:
git remote add <远端名称> <仓库路径>
-
远端名称,默认是
origin
,取决于远端服务器设置 -
仓库路径:从远端服务器获取此url
-
例如:
git remote add origin git@gitee.com:lingxiao1681/heima-commune-git.git
-
4.3.2,查看远程仓库
- 命令:
git remote
4.3.3,创建远程分支
要在Git中新增远程分支,需要先在本地创建分支然后推送到远程仓库。
- 创建并切换到新本地分支
git checkout -b 新分支名
- 推送本地分支到远程仓库
git push origin 新分支名:远程新分支名
- 验证分支是否创建成功
git branch -a # 查看所有分支(含远程)
4.3.4,删除远程分支
-
查看远程分支
使用命令查看所有远程分支列表,确认要删除的分支名称:
git branch -r
-
删除单个远程分支
#通过`git push`命令删除指定远程分支,两种等效写法: git push origin --delete 分支名 #或简写: git push origin :分支名` #例如删除`feature/login`分支: git push origin --delete feature/logi
-
删除多个远程分支
可一次性删除多个分支:git push origin --delete 分支1 分支2
-
清理本地缓存
删除远程分支后,需清理本地残留的远程分支记录:git remote prune origin #或使用: git fetch --prune
-
注意事项
- 删除操作不可逆,需确认分支已合并或无用
- 需具备远程仓库的写入权限
- 本地分支需单独删除(
git branch -d
)
4.3.5,推送到远程仓库
- 命令:
git push [-f] [--set-upsteam][远端名称][本地分支名][:远端分支名]
- 如果远端分支名与本地分支名相同,则可以只写本地分支
git push origin master
- -f 表示强制覆盖
--set-upstream
推送到远端的同时建立起和远端分支的关联关系。git push origin --set-upstream 远端名称 本地分支名:远端分支名
- 如果当前分支已经与远端分支管理(进行了上一步的
--set-upstream
),则可以省略分支名与远端名git push
: 将master
分支推送到已关联的远端分支。
- 如果远端分支名与本地分支名相同,则可以只写本地分支
4.3.6,本地分支与远程分支之间的关系
- 查看所有分支(本地+远程):
git branch -a
- 查看远程分支:
git branch -r
- 查看关联关系可以使用
git branch -vv
命令。
4.3.7,从远程仓库克隆
- 命令:
git clone <仓库路径> [本地目录]
- 本地目录可以省略,会自动生成一个目录
- 克隆默认只会克隆master分支,没有其他分支
4.3.8,从远程仓库抓取和拉取
远程分支和本地分支一样,我们可以进行merge
操作,只是需要先把远程仓库的更新都下载到本地,再进行操作。
-
抓取命令:
git fetch [remote name] [branch name]
- 抓取指令就是将仓库的更新分支都抓取到本地,不会进行合并。
- 如果不指定远端名称和分支名,则抓取所有分支。
- 清理无效远程分支引用
若远程分支已删除但本地仍存在残留引用,使用git fetch --prune
或git remote prune origin
清除无效的远程跟踪分支
-
拉取命令:
git pull [remote name] [branch name]
- 拉取指令就是将远端仓库的的修改拉到本地并自动进行合并,等同于fetch+merge
等同于#抓取远程分支 git fetch origin master git checkout master *合并远程分支 git merge origin/master
- 如果不指定远端名称和分支名,则拉取所有并更新当前分支
- 拉取指令就是将远端仓库的的修改拉到本地并自动进行合并,等同于fetch+merge
4.3.9,合并两个没有共同的提交历史的分支
-
使用
--allow-unrelated-histories
选项
在git pull
或git merge
命令中显式添加该参数,强制允许合并不相关历史记录:git pull origin 分支名 --allow-unrelated-histories
此操作会创建一个新的合并提交,将两个独立的历史连接起来。
-
分步操作(推荐)
若需更谨慎处理:git fetch origin # 先获取远程分支内容 git merge origin/分支名 --allow-unrelated-histories # 手动合并
合并后需解决可能的文件冲突并提交。
4.3.10,解决合并冲突
在一段时间,A,B用户修改了同一个文件,且修改了同一行位置的代码,此时会发生合并冲突。
A用户在本地修改代码后优先推送到代码仓库,此时B用户在本地修订代码,提交到本地仓库后,也需要推送到远程仓库,此时B用户晚于A用户,故需要先拉取远程仓库的提交,经过合并后才能推送到远端分支。
示例如下:- 创建file01.txt文件并推送到远程仓库。
$ touch file01.txt #在master分支上创建file01.txt文件
$ ls #显示当前目录下的文件与文件夹
README.md file01.txt
$ git add . #将file01.txt 添加到暂存区
$ git commit -m '在master分支上添加了file01.txt文件'
[master 22680bb] 在master分支上添加了file01.txt文件1 file changed, 0 insertions(+), 0 deletions(-)create mode 100644 file01.txt
$ git-log
* 22680bb (HEAD -> master) 在master分支上添加了file01.txt文件
* 404e9be (origin/master) 初始化创建仓库
$ git push origin --all #推送到远端仓库
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 2 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 365 bytes | 121.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [1.1.5]
remote: Set trace flag c54043a0
To gitee.com:lingxiao1681/heima-commune-git.git404e9be..22680bb master -> master
- 用户B克隆远程仓库。
#用户B 克隆远程仓库并创建文件夹myfile
$ git clone git@gitee.com:lingxiao1681/heima-commune-git.git myfile
Cloning into 'myfile'...
remote: Enumerating objects: 7, done.
remote: Counting objects: 100% (7/7), done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 7 (delta 1), reused 0 (delta 0), pack-reused 0 (from 0)
Receiving objects: 100% (7/7), done.
Resolving deltas: 100% (1/1), done.$ git-log
* 22680bb (HEAD -> master, origin/master, origin/HEAD) A用户在master分支上添加了file01.txt文件
* 404e9be 初始化创建仓库#查看克隆获取的文件
$ ls
README.md file01.txt
-
用户A修改文件file01.txt并推送到远程仓库
#用户A修改文件 $ vi file01.txt #用户A将修改的文件保存至本地仓库 $ git add . warning: in the working copy of 'file01.txt', LF will be replaced by CRLF the next time Git touches it $ git commit -m 'A 用户提交file01.txt修改' [master e515bb0] A 用户提交file01.txt修改1 file changed, 1 insertion(+) $ git-log * e515bb0 (HEAD -> master) A 用户提交file01.txt修改 * 22680bb (origin/master) A用户在master分支上添加了file01.txt文件 * 404e9be 初始化创建仓库#用户A将变动推送到远程仓库 $ git push origin master:master #A 用户将修改推送到远程仓库 Enumerating objects: 5, done. Counting objects: 100% (5/5), done. Delta compression using up to 2 threads Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 307 bytes | 307.00 KiB/s, done. Total 3 (delta 1), reused 0 (delta 0), pack-reused 0 remote: Powered by GITEE.COM [1.1.5] remote: Set trace flag 584901ad To gitee.com:lingxiao1681/heima-commune-git.git22680bb..e515bb0 master -> master$ git-log * e515bb0 (HEAD -> master, origin/master) A 用户提交file01.txt修改 * 22680bb A用户在master分支上添加了file01.txt文件 * 404e9be 初始化创建仓库
-
用户B修改文件file01.txt
# 用户B对 file01.txt进行修改 $ vi file01.txt # 用户B 将修改后的file01.txt保存至本地仓库 $ git add . warning: in the working copy of 'file01.txt', LF will be replaced by CRLF the next time Git touches it $ git commit -m 'B用户提交file01.txt修改' [master 2f17404] B用户提交file01.txt修改1 file changed, 1 insertion(+)# 用户B 查询本地仓库文件与目录 $ ls README.md file01.txt$ git-log * 2f17404 (HEAD -> master) B用户提交file01.txt修改 * 22680bb (origin/master, origin/HEAD) A用户在master分支上添加了file01.txt文件 * 404e9be 初始化创建仓库
-
用户B推送文件file01.txt到远程仓库,发生合并异常。
# 用户B抓取远程分支 $ git fetch origin remote: Enumerating objects: 5, done. remote: Counting objects: 100% (5/5), done. remote: Compressing objects: 100% (2/2), done. remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0 (from 0) Unpacking objects: 100% (3/3), 287 bytes | 16.00 KiB/s, done. From gitee.com:lingxiao1681/heima-commune-git22680bb..e515bb0 master -> origin/master$ git-log * 2f17404 (HEAD -> master) B用户提交file01.txt修改 | * e515bb0 (origin/master, origin/HEAD) A 用户提交file01.txt修改 |/ * 22680bb A用户在master分支上添加了file01.txt文件 * 404e9be 初始化创建仓库# 用户B合并远程分支origin/master,提示发生冲突异常 $ git merge origin/master #合并远程分支 Auto-merging file01.txt CONFLICT (content): Merge conflict in file01.txt Automatic merge failed; fix conflicts and then commit the result.$ git-log * 2f17404 (HEAD -> master) B用户提交file01.txt修改 | * e515bb0 (origin/master, origin/HEAD) A 用户提交file01.txt修改 |/ * 22680bb A用户在master分支上添加了file01.txt文件 * 404e9be 初始化创建仓库
-
用户B解决冲突。
#用户B手动修改冲突的file01.txt文件,修改后提交到本地仓库 $ git add . $ git commit -m '抓取合并' [master 7371297] 抓取合并$ git-log * 7371297 (HEAD -> master) 抓取合并 |\ | * e515bb0 (origin/master, origin/HEAD) A 用户提交file01.txt修改 * | 2f17404 B用户提交file01.txt修改 |/ * 22680bb A用户在master分支上添加了file01.txt文件 * 404e9be 初始化创建仓库#用户B 合并成功后,再对远程仓库的进行推送。 $ git push origin master:master #完成推送 Enumerating objects: 10, done. Counting objects: 100% (10/10), done. Delta compression using up to 2 threads Compressing objects: 100% (5/5), done. Writing objects: 100% (6/6), 642 bytes | 214.00 KiB/s, done. Total 6 (delta 2), reused 0 (delta 0), pack-reused 0 remote: Powered by GITEE.COM [1.1.5] remote: Set trace flag e045e9b2 To gitee.com:lingxiao1681/heima-commune-git.gite515bb0..7371297 master -> master
5,VS2019与Git
5.1,添加GitHub扩展组件
5.2,配置VisualStudio
5.2.1,切换窗口布局
-
保存当前VS窗口布局。
-
调用布局,进行布局切换。
5.2.2,设置新选项卡插入现有选项卡的位置
5.2.3,设置字型
5.2.4,配置快捷键
指定后,在VS代码编辑窗口只需要按钮Alt+上箭头即可快速切换到上一个方法。
5.2.5,导入导出VisualStudio设置
若想将已配置的VS设置快速配置到另一台PC VS,可使用设置文件导入导出功能,实现对VS的快速设置(例如字体,快捷键的等)。
- 承载当前VS所有配置的文件。
2,导出VS部分设置。
-
选择导入和导出选项
-
选择导出选定的环境设置
-
这里示例选项设置导出(设置字体颜色,快捷键等)
-
设置导出文件的名称与保存位置
- 选择导入选定的环境配置
-
选择需要导入的配置文件
笔记链接
git笔记(Markdown整理)