Git介绍与使用
1. git简介
git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。
git中版本控制是一种用于跟踪和管理代码变更的系统。通过git,开发者可以记录每一次代码的变动,并可以在需要的时候进行版本回退或将代码合并到其他分支上。
1.1 git四个工作区域
workspace:工作区,就是你本地目录,即进行开发改动的地方
Index/Stage:暂存区,位于.git目录下的index文件,暂存区会记录 git add 添加文件的相关信息(文件名、大小),不保存文件实体,通过 id 指向每个文件的实体。使用 git status 可以查看暂存区的状态,暂存区标记了当前工作区中那些内容是被 git 管理的,当完成某个需求或者功能后需要提交代码,第一步就是通过 git add 先提交到暂存区。
Repository:本地仓库,位于自己的本地计算机,本地仓库保存了被提交过的各个版本,比起工作区和暂存区的内容,它更旧一些。首先是 git commit(提交) 同步 index 的目录树到本地仓库,然后通过 git push(推送) 同步本地仓库到远程仓库。
Remote:远程仓库,位于托管代码的服务器,远程仓库的内容能够被分布在多个地点的处于协作关系的本地仓库修改(能被本地修改)。比起本地仓库,远程仓库通常旧一些,因此本地仓库修改完之后需要同步到远程仓库。
1.2 git工作流程
- 在工作区添加、修改文件
- 将修改后的文件add到暂存区
- 将暂存区的文件commit到本地仓库
- 将本地仓库的修改推送到远程仓库
集中式(SVN)和分布式(git)区别
1.中央服务器 在集中式系统中,版本库是集中存放在中央服务器的。分布式系统中,每个人的电脑上都是一个完整的版本库,不依赖于中央服务器。
2. 代码共享 在集中式系统中,工作时要先从中央服务器取得最新的版本,完成工作后,再将自己的文件推送给中央服务器。分布式系统中,开发者可以直接从其他开发者的本地代码库中获取最新版本,并且可以将自己的修改推送到其他开发者的本地代码库。
3. 工作流 集中式系统中,由于代码只存在于中央服务器上,因此开发者需要经常与服务器进行交互。而在分布式系统中,由于每个开发者都具有完整的代码库,因此可以在本地进行大部分操作,只需要与其他开发者进行交互。
4. 分支管理 在集中式系统中,分支通常是在服务器上创建和管理的,开发者需要从服务器拉取分支并进行开发。而在分布式系统中,分支是在本地代码库中创建和管理的,开发者可以轻松地创建、合并和删除分支,不需要中央服务器的参与。
2. git安装
2.1 下载安装git
https://git-scm.com/downloads
https://download.tortoisegit.org/tgit/
按默认选项安装即可。安装完成后,在开始菜单里找到“Git”->“[Git Bash](https://so.csdn.net/so/search?q=Git Bash&spm=1001.2101.3001.7020)”,出现命令行窗口的,就说明Git安装成功!
2.2 设置用户信息
1.全局配置用户姓名
$ git config --global user.name "xxx"2.全局配置邮箱
$ git config --global user.email "xxx@xxx"3.若要配置局部
$ git config --local user.name "xxx"
$ git config --local user.email "xxx@xxx"
因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。
3.git的基本使用
3.1创建版本库(本地仓库)
$ mkdir git_study
$ cd git_study
$ pwd
/d/Work/Git/git_study
初始化仓库,自动生成一个.git的隐藏目录,该目录是git用了跟踪管理版本库的
$ git init
Initialized empty Git repository in D:/Work/study_git/.git/
3.2 文件管理
1. 创建文件
2. 将文件添加到暂存区
$ git add file1.txt
3. 提交文件到本地仓库
$ git commit -m "本次提交的说明"
说明:命令
git add 文件
,可反复多次使用,添加多个文件,最后可使用
git commit -m "描述"
一次性提交
git跟踪并管理的是修改,而非文件。必须经过
add->commit
的顺序,因为工作区的修改不会被提交,只有暂存区的修改才会被提交
查看状态
可以看到文件修改信息
$ git status
查看提交日志
$ git log
# 简化日志的输出
$ git log --pretty=oneline
版本回退
通过日志,可以看出每次提交都会形成一个
commit_id
,使用以下命令可以回退到之前的版本。
$ git reset --hard commit_id
版本回退成功
如果你又不想回退了,想恢复到回退以前,可以使用
git reflog
查看之前的
commit_id
是什么,继续使用版本回退的命令返回过去。
# 恢复到回退之前
$ git reflog
注意:
commit_id
没有必要写全,一般写前五六位即可,
git
会自行判断。
撤销修改
场景1:如果只是工作区写坏了,想丢弃修改,可以使用以下命令
$ git checkout -- file01.txt
注意:
git checkout -- file
命令中的
--
很重要,没有
--
,就变成了“切换到另一个分支”的命令。
场景2:如果工作区文件写坏了,并且
add
到了暂存区,想丢弃修改,可以使用以下命令
# 回到add之前
$ git reset HEAD file01.txt
$ git checkout -- file01.txt
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,可以进行版本回退的方法操作,不过前提是没有推送到远程库。
$ git reset --hard commit_id
删除文件
被删除的文件,之前提交过本地仓库,可以使用以下命令找回来
$ git checkout --<file>
如果要提交删除,删除版本库中的文件
# 告诉git要删除文件了
$ git rm test.txt
# 再次提交
$ git commit -m "remove test.txt"
3.3 分支管理
1. 基本原理
一个仓库本身只有一条分支线。一开始只有一条分支,你的所有提交都会提交到master上,这条线会随着提交的次数增多而越来越长。
如果创建了新的分支,那么会在master的位置新创建一条分支,比如dev,但是分支线还是只有一条。
那么你新的提交就是针对新的分支了,随着提交的增多这条线会越来越长。而master还在原来的位置没有动。
当你将dev和master合并,实际上是将master指针指向当前dev的位置。
2. 创建分支
$ git branch dev # 创建分支
$ git checkout dev # 切换分支# `git checkout`命令加上`-b`参数表示创建并切换,相当于以上两条命令
$ git checkout -b dev
查看当前分支
$ git branch
git branch
命令会列出所有分支,当前分支前面会标一个
*
号。
现在我们就可以在
dev
分支上提交了,而且不会影响到
master
分支。
3. 合并分支
$ git merge dev
4. 删除分支
现在
master
分支和
dev
分支内容一致了,那么
dev
分支的使命也就完成了,可以将其删除,当然你也可以继续在上面工作。
$ git branch -d dev
说明:在实际的工作中,通常会创建多条分支,防止
master
被频繁修改导致出错的现象,确保过程更安全。
5. 解决冲突
冲突发生在合并分支的时候。分支修改文件并提交,此时master同样文件也修改并提交,合并分支会失败,需要手动修改冲突文件的内容。最后重新提交
# 查看分支合并图
$ git log --graph --pretty=oneline --abbrev-commit
6. 分支管理策略
git分支合并时,默认采用
Fast forward
模式,这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用
Fast forward
模式,git会在merge时生成一个新的commit,这样,从分支历史就能看出分支信息。
# --no-ff表示禁用Fast forward模式
$ git merge --no-ff -m "说明" dev
3.4远程仓库
这里使用GitLab作为远程仓库
1. 从gitlab上拉取项目
在自己想要的位置创建文件夹,点击鼠标右键->git bash here
# url为远程仓库项目地址
$ git clone<url># 克隆分支
git clone-b 分支名 <url>
url为下图的地址,建议使用ssh地址,使用https除了速度慢以外,每次推送都必须输入口令
2. 将本地仓库代码提交到远程仓库
$ git push
3. 上传代码出错
# 拉取代码
$ git pull
# 查看所有分支上传情况(找到自己上传的文件,下一个就是最新上传的)
$ git log --all --graph
#回退到该版本
$ git reset --hard + 最新上传版本号
#删除已push的错误代码
$ git push -f
#查看代码是否删除
$ git log -all --graph
git fetch origin只获取远程仓库的最新更新信息,不会自动更新本地工作目录,仅影响.git目录
git pull = git fetch + git merge
4. bug分支
每个bug都可以通过创建临时分支来修复,修复后合并分支,然后即可删除临时分支。
问题:我的dev分支代码还没完成,就创建临时分支,该如何提交
解决:可以通过
stash
把当前现场储藏起来,等恢复现场后再继续工作。
$ git stash
# 假设在master上修复bug,这时就可以在master上创建临时分支
$ git checkout master
$ git switch-c issue-101# 修复bug并提交
$ git add xxx
$ git commit -m "修复bug"# 切换到master,进行合并并删除bug分支
$ git switchmaster
$ git merge --no-ff -m "merge bug" issue-101# bug修复完成,切换回dev继续干活
$ git switchdev
$ git status
# 查看隐藏
$ git stash list# 恢复现场
$ git stash apply
# 或者使用恢复现场并删除stash内容
$ git stash pop
# 如果有多个stash,可以指定恢复哪个stash
$ git stash apply stash@{0}
问题:刚才是在新建的临时分支上修改的bug,但是我当前工作的分支并没有这个修改,如果重新写一遍就是重复造轮子了,怎样让这些修改在dev分支上重放?
这时,我们可以查看之前新建分支上提交的
commit_id
,将他重放到dev上。
说明:在重放之前,需要保持储藏的状态,重放完才可以取消储藏。
$ git cherry-pick commit_id
git给dev分支自动做了一次提交。使用了
cherry-pick
,就不需要在dev分支重复修改bug了。
5. feature分支
实际的工作中,各种新功能是非常多了,但是我们又不希望新的功能将主分支搞乱,这个时候对于新的功能需求,就可以新建一个feature分支,在上面开发,完成后合并,最后删除该feature分支。
$ git switch-c feature
$ git add readme.txt
$ git commit -m "new"
一切顺利的话,就可以切换到dev合并代码了
$ git switch dev
但是这时出了意外,新功能不需要了,那么直接删除feature分支就可以。
$ git branch -D feature
说明:如果我们合并过了,可以使用-d,但是这种没有合并就删除的情况需要使用-D进行强制删除。
6. 标签管理
6.1. 创建标签
# 假设在dev上打标签,先切换到dev分支
$ git switch dev
# 创建标签
$ git tag v1.0# 或创建带有说明的标签 -a:标签名 -m:说明
$ git tag -a v0.1-m "说明"# 默认标签是搭载最新提交的commit上的。如果要对历史某一次提交打标签,需要找到历史的某次提交commit_id,然后打标签。
$ git tag v0.9 指定commit_id
# 查看标签列表
$ git tag
# 查看指定标签详情
$ git show v1.0
6.2. 操作标签
删除本地标签
$ git tag -d v0.1
远程推送标签
$ git push origin v1.0# 一次性推送全部未推送到远程的本地标签
$ git push origin --tags
远程删除标签
# 先删除本地标签
$ git tag -d v1.0# 删除远程标签
$ git push origin:refs/tags/v1.0
3.5 多人协作
1. 查看分支
当从远程仓库克隆时,git自动把本地的master分支和远程的master分支对应起来
$ git remoter -v
2. 推送分支
推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程仓库对应的远程分支上
$ git push origin master
$ git push origin dev
3. 抓取分支
# 建立本地分支和远程分支关系
$ git checkout -b dev origin/dev
如果在
git pull
的过程中有报错
原因是没有指定本地dev分支与远程origin/dev分支的链接,根据提示,设置dev和origin/dev的链接:
$ git branch --set-upstream-to=origin/dev dev
4. git常用命令
回退到某一版本
1、
git clone
- HTTP` 克隆代码
2、
git branch -a
查看所有分支
3、
git checkout +分支名
(切换到自己需要修改的分支)
4、
git log
(查看版本号)
5、
git reset --hard + 版本号
(回退到该版本)
git revert + 版本号
(撤销该版本的提交,其余保留)
git cherry-pick + 版本号
(取消对该版本的撤销)
6、
git push -f
(撤销上一次上传)
git reset --hard HEAD^
(回退到上一版本)
git reset --hard HERD^^
(回退到上上版本)
git reset --hard HEAD ~100
(回退到上100版本)
git fsck --lost-found
回退
合并不同分支
git merge 主分支
(合并分支)
如果出现冲突
git status
(查看哪些文件出现冲突)
打开自己的文件,将需要的保留,其余的都删除
<<<<<HEAD
自己分支的内容
=========
主分支内容
>>>>>主分支名
将<<<<<HEAD,======,>>>>>主分支名 和自己不需要的代码都删除
git add
冲突文件
git commit -m "注释"
git push
(完成合并)
gitlab的一些命令
1、
git add + 文件名
上传本地文件
2、
git branch
查看当前分支名
git branch -a
列出本地分支与远程分支
git branch -d 分支名
删除分支
git branch -D 分支名
删除本地分支
git branch -m 旧分支名 新分支名
修改分支名
3、
git checkout
切换分支
git checkout 分支名
切换到该分支
git checkout -b 分支名
创建并切换到该分支
git checkout -B 分支名
重置分支(删除已存在的分支并重新创建,分支不存在也不会报错)
4、
git checkout
. 撤销本地所有修改的,没有提交的内容,都回到原来的状态
git checkout head 文件名 文件名
撤销1~2个文件的修改
git checkout head *.cpp
撤销所有cpp文件的修改
git checkout head
撤销对所有文件的修改
5、
git commit -m "注释"
将暂存区里的改动提交到本地版本库
git commit -m "注释" -a
提交所有修改
git commit --amend -m "注释1"
修改上一次提交的注释
6、
git diff + 文件名
查看文件修改了什么内容
7、
git init
初始化
8、
git log
查看提交的历史
git log -1
查看最近1次提交记录
git log -2
查看最近2次提交记录
git log -p
查看所有提交记录的变动信息
git log -p <commit id>
查看commit id及其以前的记录
git log --name-only
查看变动的文件名,查看哪些文件发生了变化
git log --name-status
查看文件变动状态,显示增加、修改等对应的字母标识
git log --stat
显示哪个文件发生了改变,以及对应的新增行数、减少行数和变动文件数
git log --graph
提交记录左侧显示虚线作为分割区域
git log --all --graph
显示所有的分支上传情况
9、
git merge 分支名
合并某分支到当前分支
10、
git pull (--rebase)
从远端拉取代码,更新我们的仓库
git pull = git fetch + git merge
git pull --rebase = git fetch + git rebase
git pull = git fetch + git merge
git fetch
是将远程库的最新内容拉取到本地库,用户在检查了以后决定是否合并到工作区中
git merge
是将本地的两个分支合并,如果在分支A中执行git merge B,那就是将分支B中的代码合并到分支A中
git pull
是将远程主机的最新内容拉取到本地后直接合并到工作区中,这样可能会产生冲突,需要手动解决
git pull --rebase = git fetch + git rebase
git rebase
是将提交到某一分支上的所有修改都移至另一分支上,如果在B分支上使用git rebase A就是将B分支上的修改都变基(移到)A分支上
git pull --rebase
是将远程主机的最新内容拉取到本地库后直接变基到工作区中
11、
git push (-u)
提交到远程仓库
12、
git push -f
删除已经push的内容
13、
git reflog
查看所有分支的所有操作记录,包括已经被删除的commit记录和reset操作
14、
get remote
查看远程库的信息,默认为origin
git remote -v
显示更详细的信息
15、
git reset --hard + 版本号
回退到某一版本
16、
git show commit_id
查看某一版本修改了什么内容
17、
git stash
暂存上一次修改,准备切换到其他的分支
git stash pop
还原上一次的修改,将暂存的修改加入到新的分支
18、
git status
文件在暂存区的状态
参考博客
原文链接:https://blog.csdn.net/weixin_45842494/article/details/133826336
原文链接:https://blog.csdn.net/cdns999/article/details/135354894
版权归原作者 懵齐 所有, 如有侵权,请联系我们删除。