文章目录
git是代码版本的管理工具,git是分布式
的版本控制工具
git的工作机制
四个区域
- 工作区 :代码在本地存储的目录位置
- 暂存区 :git可以追踪的代码(工作区可以将代码添加到暂存区(add))——临时存储
- 本地库 :暂存区的代码可以提交到本地库(commit),并生成对应的版本 ——生成历史版本
- 远程库:(远程库:如github)本地区的代码可以提交到远程库(push),并生成对应的版本 ——存储在远端
只有在本地库和远程库才有版本控制
后一个版本是基于前一个版本的,所以1和3版本之间
git基础命令
- 用户签名
git config --global user.name 用户名
设置用户签名
git config --global user.email 邮箱
设置用户签名
这两条命令是为了表示身份,当你提交代码到远程库的时候可以表示你的身份 - 初始化
git init
使本地库关联git(生成.git文件)
git status
查看本地库的git状态,(当前分支,commit,wait commit) - add
git add 文件名
将修改的文件添加到暂存区
git rm --catched 文件名
将文件从暂存区删除
git add .
添加所有修改的文件到暂存区 - commit
git commit -m "本次版本描述信息" 文件名
提交代码到本地库,生成相应的版本号
git commit -a
加了-a,在 commit 的时候,能帮你省一步 git add ,但也只是对修改和删除文件有效, 新文件还是要 git add,不然就是 untracked 状态
git commit --amend -m "新的描述信息"
:在执行了commit
并且还没有执行push
操作的时候可以使用该命令修改之前提交的描述信息。 - 日志
git reflog
查看版本的信息
git log
查看版本的详细信息 - 版本穿梭,重置到之前的版本
git reset --hard 要重置到的版本号
(git log可以获取版本号)
版本不仅可以向前穿越,也可以向后穿越
git的分支和相关命令
不同的分支上存储着不同的代码。
分支存在的意义:线上代码的运行需要维护,维护的过程需要程序员进行代码的改和编写,这种时候不可能将停止线上的运行的代码以供程序员开发。一般是线上产品放在一个分支(多为master分支),程序员则在其他分支开发,当一版产品修改好之后再将开发好后的分支代码合并到master分支上。
远端分支和本地分支
- 分支分为远端分支和本地分支,一般是一一对应的方便进行开发。
即如果远端有一个分支yang,本地就会有一个分支yang。 - master分支是主分支,所有分支的开发一般最终都会合并到主分支中(merge)
工作区分支显示
本地的分支代码可以在编译器中查看,head指针指向那个分支,改编译器就显示的是哪个分支的代码
分支创建、删除、查看命令
git branch 分支名
:创建分支git branch -m 新分支名
:可以修改当前分支的名称git branch -v
:查看所有分支git checkout 分支名
:切换分支git checkout -b 分支名
: 创建并切换到该分支git merge 分支名
:把指定分支合并到当前分支上git branch -D 分支名
删除分支
冲突合并
当两个分支合并的时候可能产生冲突。
冲突产生的原因:
合并分支时,两个分支在同一个文件的同一个位置有两套完全不同的修改。Git无法替我们决定使用哪一个。必须人为决定新代码内容。
当出现冲突的时候,需要:
- 手动解决冲突
- 添加文件到暂存区: git add .
- 执行提交: git commit -m “提示信息”
分支拉取命令
1. 拉取远程分支到本地:
命令是: git pull origin 远程分支名:本地分支名
- 本地分支名可以和远程名不一样
- 如果本地还没有对应的分支的时候直接使用该命令可以将远程分支拉到本地,并创建对应的分支
- 如果本地分支就是使用当前的分支,命令后面的
:本地分支名
可以省略,即git pull origin 远程分支名
- 如果本地分支就是使用当前的分支,并且本地分支和远程分支同命,命令后面的
origin 远程分支名:本地分支名
可以省略,即git pull
eg:拉取远程dev的代码到本地dev分支
git pull origin dev:dev
2. git fetch 单纯的拉取代码
git pull = git fetch + git merge
,严格意义上 git fetch
才是单纯的拉取代码,但是一般情况下拉取代码和合并代码经常一起使用,我们一般直接使用git pull拉取代码。
- 可以使用以下命令将远程分支拉取到本地:
git fetch origin 远程分支名:本地分支名
,这将从远程仓库中拉取指定的远程分支到本地并创建一个本地分支。
eg:要将远程分支develop拉取到本地并创建一个名为dev的本地分支,可以运行以下命令:
git fetch origin develop:dev
3. 建立本地分支和远程分支的联系
git pull 和 git fetch 都将只拉取远程分支的快照,不会自动创建任何本地分支的跟踪分支关系。如果需要将本地分支与远程分支关联起来,可以尝试运行以下命令:
git branch --set-upstream-to=origin/远程分支名 本地分支名
这个命令将本地分支与远程分支建立关联关系,并允许您将更改推送到该远程分支。
也可以在推送的时候建立联系:
git push --set-upstream origin 本地分支名:远程分支名
4. 拉取远程分支同时建立和远程分支的联系
git checkout -b 本地分支名 origin/远程分支名
使用这种方式会在本地仓库新建分支xxx,并自动切换到新建的分支xxx,远程分支的代码也拉取到了本地分支xxx中。采用这种方法建立的本地分支会和远程分支建立映射关系。
5. 强制拉取
添加 -f参数即可:git pull origin 远程分支名:本地分支名 -f
,
git pull -f
是强制拉取远程代码到本地并合并,如果本地修改的代码没有提交会
被覆盖- 但是如果本地代码已经提交,是不会被覆盖的,只会在有冲突的代码部分直接使用远程的代码覆盖本地的代码
- 就是说使用
git pull -f
也没有办法保证本地代码和远程代码完全一致。想要完全一致可以先试用 reset 命令之后再使用git pull。
git pull
对于产生的冲突需要我们手动合并判断
git pull -f
对于产生的冲突直接使用远程的代码覆盖本地的代码
推送本地分支到远程
1. 推送本地分支到远程:
命令是: git push origin 本地分支名:远程分支名
-
本地分支名可以和远程名不一样
-
如果本地分支就是使用当前的分支,命令后面的
:本地分支名
可以省略,即git push origin 远程分支名
-
如果本地分支就是使用当前的分支,并且本地分支和远程分支同命,命令后面的
origin 远程分支名:本地分支名
可以省略,即git push
eg: 推送本地dev到远程dev
git push origin dev:dev
2. 强制推送本地分支到远程:
添加 -f参数即可:git push origin 本地分支名:远程分支名 -f
,本地分支的代码会覆盖该远程分支的内容,也可能会覆盖其他人提交的代码内容。
所以提交遇到冲突的时候我们需要先 git pull
一下,先在本地合并一下其他人的代码,之后再git push
提交代码,尽量不要使用强制推送命令。
远程仓库
提交本地代码到远程仓库
git
拉取远程仓库的代码
1. 复制代码
git clone 远程库地址
:克隆代码
clone会做如下操作:1. 拉取代码。2. 初始化本地仓库。3. 默认创建远程仓库的别名为origin
2.复制代码到指定分支
默认情况下会复制代码仓库的默认分支(一般是master)到本地,本地的分支名和远程的默认分支名对应。
当然我们也可以克隆制定分支到本地:git clone -b 分支名 远程库地址
远程仓库创建别名
当我们第一次将代码提交到远程仓库的时候,我们可以为其创建一个别名方便下次拉取。
git remote -v
:查看当前所有远程地址别名
git remote add 别名 远程地址
:将远程地址添加为别名
创建完别名后当克隆、拉去和提交都可以使用该别名。
git remote rename old_name new_name
:可以修改远程仓库的别名
补充:ssh免密登陆协议
ssh免密登陆协议需要在用户名下生成.ssh
文件。
生成方法:在需要生成的目录下,右键Git Bash Here,输入命令: ssh-keygen -t rsa -C 邮箱地址
-t rsa
:是加密算法
-C 邮箱地址
:描述信息,当前面目登陆协议是为谁准备的。
生成的.ssh
文件夹有公钥和私钥,将公钥进行复制,复制到远程仓库中(不同的仓库位置可能不一样,可以自行查找)
赋值代码的时候远程仓库一般为我们提供两个地址:https地址和ssh地址,之前的克隆都是利用https的地址,如果使用ssh免密登陆之后就可以使用ssh地址进行代码的克隆。
忽略文件
项目提交的时候需要屏蔽一些文件的提交。这些文件一般是与项目的实际功能无关,不参与服务器上部署运行。把它们忽略掉能够屏蔽IDE工具之间的差异。
忽略文件一般是 .gitignore
eg:
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
.DS_Store
dist
dist-ssr
coverage
*.local
/cypress/videos/
/cypress/screenshots/
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?