git使用详情

git使用详情

关于git的基本情况可以参考:

(1)git软件安装及常用配置;;

(2)【linux】05 git

  • 本文以一个具体项目为例,演示git的常用操作。

1 基本概念

在这里插入图片描述

2 具体操作

git可视化操作网址:git-school

2.1 本地操作

通过本地创建git仓库,演示在本地如何管理git仓库。

  • 配置用户名和密码:
git config --global user.name wxx # 名字可以随便设置
git config --global user.email 1137247975@qq.com # 邮箱最好设置为远程(例如gitlab)中的邮箱
git config -l # 查看配置,其实就是查看 ~/.gitconfig 文件的内容

在这里插入图片描述

  • 创建本地仓库
mkdir project # 创建存放项目的文件夹
cd project
git init # 将当前目录配置成git仓库,信息记录在隐藏的.git文件夹中

在这里插入图片描述

  • 在当前仓库中新建文件readme.txt,并写入 111,之后可以查看代码仓库的状态
vim readme.txt
git status

在这里插入图片描述

可以看到提示:我们当前在主分支上,并且readme.txt这个文件还没有被 git 追踪。

  • readme.txt 添加到暂存区
git add readme.txt

在这里插入图片描述

  • readme.txt 添加到版本库
git commit -m "add readme.txt"

在这里插入图片描述

此时我们版本库中有了第一个版本,如下图(通过git-school演示):

在这里插入图片描述

  • 更改 readme.txt,添加一行 222,并将其添加到上传到暂存区中
vim readme.txt
git status
git add readme.txt

在这里插入图片描述

撤出暂存区修改

  • 如果此时想把 readme.txt 从暂存区撤出,可以有两种方式

方式一:

git restore --staged readme.txt

在这里插入图片描述

方式二:

git add readme.txt # 删除之前需要加入到暂存区
git rm --cached readme.txt

在这里插入图片描述

两者的区别:第二种方式还会让git不去追踪该文件了。建议使用第一种方式。

  • 将当前修改存入版本库
git add readme.txt
git commit -m "add 222"

在这里插入图片描述

此时我们版本库结构如下:

在这里插入图片描述

  • 修改 readme.txt,添加一行333,然后存储到版本库中
vim readme.txt
git add . # .表示当前文件夹中所有文件
git commit -m "add 333"

在这里插入图片描述

此时我们版本库结构如下:

在这里插入图片描述

  • 查看所有历史版本
git log # 显示版本库的详细信息
git log --pretty=oneline # 显示简略信息,一行代表一条历史记录

在这里插入图片描述

  • 切换到之前的版本,例如切换到前一个版本的前一个版本(即版本向前退两次)
git reset --hard HEAD^^
git reset --hard HEAD~~ # 等价于上面的写法

在这里插入图片描述

此时我们版本库结构如下:

在这里插入图片描述

  • 切换到最新任意版本,例如最新版本
git reflog # 查看HEAD跳动的记录
git reset --hard versionCode # 版本号取前7位即可
git logp # 等价于 git log --pretty=oneline,前提:需要在 ~/.gitconfig 中配置别名 `logp=log --pretty=oneline`

在这里插入图片描述

此时我们版本库结构如下:

在这里插入图片描述

  • 修改 readme.txt,添加一行444,并比较工作区和暂存区的区别
vim readme.txt
git diff readme.txt

在这里插入图片描述

撤回工作区相对于暂存区的修改

  • 撤回工作区相对于暂存区的修改
git restore readme.txt

在这里插入图片描述

  • 新建 main.cpp 文件,并将其持久化到版本库中
touch main.cpp
git add .
git commit -m "add main.cpp"

在这里插入图片描述

此时我们版本库结构如下:

在这里插入图片描述

  • 修改 main.cpp,添加一行 111,修改readme.txt,添加一行555,此时只将main.cpp的修改持久化到版本库中
vim main.cpp
vim readme.txt
git add main.cpp
git commit -m "save main.cpp"

在这里插入图片描述

此时我们版本库结构如下:

在这里插入图片描述

  • 回滚 readme.txt 的修改
git restore readme.txt

在这里插入图片描述

  • 创建两个文件 a.txt、b.txt,并加入到版本库中
touch a.txt b.txt
git add .
git commit -m "add a.txt b.txt"

在这里插入图片描述

此时我们版本库结构如下:

在这里插入图片描述

  • 删除刚才创建两个文件 a.txt、b.txt,并加入到版本库中
rm a.txt b.txt
git add .
git commit -m "delete a.txt b.txt"

在这里插入图片描述

此时我们版本库结构如下:

在这里插入图片描述

2.2 云端交互

这里使用 acgit 演示和云端的交互

  • 在 gitlab 上新建 git 仓库

在这里插入图片描述

  • 将本地项目推送到远程
# git remote remove origin # 删除与远程仓库的关联
git remote add origin git@git.acwing.com:wxx/project.git # 本地关联远程
git push -u origin master # 推送本地项目到远程

在这里插入图片描述

刷新页面,可以看到所有的提交历史记录

在这里插入图片描述

  • 删除本地仓库,然后将远程仓库拉去下来
cd
rm -rf project/
git clone git@git.acwing.com:wxx/project.git

在这里插入图片描述

  • 创建并切换到分支dev
git checkout -b dev
git branch # 查看所在分支

在这里插入图片描述

此时我们版本库结构如下:

在这里插入图片描述

  • 修改readme.txt,添加一行666,并持久化到当前分支(注意:工作区、暂存区都只有一个,可以对应多个分支)
vim readme.txt
git add .
git commit -m "add 666"

在这里插入图片描述

此时我们版本库结构如下:

在这里插入图片描述

  • 切换到 master 分支
git checkout master

在这里插入图片描述

此时我们版本库结构如下:

在这里插入图片描述

本地分支合并

  • dev 分支的修改合并发到 master 分支上
git merge dev

在这里插入图片描述

此时我们版本库结构如下:

在这里插入图片描述

删除本地分支

  • 删除 dev 分支
git branch -d dev

在这里插入图片描述

此时我们版本库结构如下:

在这里插入图片描述

  • 测试分支合并产生冲突的情况,新建分支 dev2,切换到该分支,修改readme.txt,添加一行777,并持久化到当前分支
git checkout -b dev2
vim readme.txt
git add .
git commit -m "add 777"

在这里插入图片描述

此时我们版本库结构如下:

在这里插入图片描述

  • 切换到 master 分支,然后修改readme.txt,添加一行888,并持久化到当前分支
git checkout master
vim readme.txt
git add .
git commit -m "add 888"

在这里插入图片描述

此时我们版本库结构如下:

在这里插入图片描述

  • dev2 分支的修改合并发到 master 分支上
git merge dev2

在这里插入图片描述

通过命令 git status 可以看到两个分支修改了同一个文件

在这里插入图片描述

可以看到,自动合并失败,需要手动修复冲突,通过 vim 打开 readme.txt 文件修复,文件内容如下:

在这里插入图片描述

这里 <<<<<<< HEAD======= 中间的内容是当前分支的内容,=======>>>>>>> dev2 是待合并到当前分支的内容。这里根据自己想要的情况进行修改即可,例如修改如下:

在这里插入图片描述

之后进行持久化即可

git add .
git commit -m "fix conflicts"

在这里插入图片描述

此时,查看日志

在这里插入图片描述

此时我们版本库结构如下:

在这里插入图片描述

  • 删除 dev2 分支,并查看日志
git branch -d dev2
git logp

在这里插入图片描述

此时我们版本库结构如下:

在这里插入图片描述

  • 将本地版本提交到云端
git push

在这里插入图片描述

可以看到云端更新了记录

在这里插入图片描述

  • 测试将分支推送到远端:新建分支 dev3,切换到该分支,修改readme.txt,添加一行999,并持久化到当前分支
git checkout -b dev3
vim readme.txt
git add .
git commit -m "add 999"
git push --set-upstream origin dev3

在这里插入图片描述

可以看到云端已经有这个分支了

在这里插入图片描述

此时我们版本库结构如下:

在这里插入图片描述

  • 删除本地dev3分支
git checkout master # 切换到 master 分支
git branch -d dev3 # 删除本地分支

在这里插入图片描述

此时我们版本库结构如下:

在这里插入图片描述

拉取云端分支

  • 将云端的dev3分支下载到本地dev3分支
git checkout -b dev3 # 创建并进入 dev3 分支
git branch --set-upstream-to=origin/dev3 dev3 # 将远程分支绑定到本地分支
git pull # 拉取云端分支dev3的内容

在这里插入图片描述

  • 将云端分支dev3的内容拉取并合并到master分支上
git checkout master # 切换到 master 分支
git pull origin dev3 # 将云端 dev3 分支合并到本地 master 分支

在这里插入图片描述

删除云端分支

  • 删除云端分支dev3
git push -d origin dev3

在这里插入图片描述


  • 将工作区和暂存区修改存储到栈中(此时工作区和暂存区就没内容了,相当于剪切):修改readme.txt,添加一行aaa,添加到暂存区;再次修改readme.txt,添加一行bbb
vim readme.txt
git add readme.txt
vim readme.txt
git stash # 修改存入栈中
git stash list # 查看栈中所有元素

在这里插入图片描述

  • 弹出栈顶的修改(暂存区的修改会丢失)
git stash pop

在这里插入图片描述

附录

git commit -m "add readme.txt"
git commit -m "add 222"
git commit -m "add 333"
git commit -m "add main.cpp"
git commit -m "save main.cpp"
git commit -m "add a.txt b.txt"
git commit -m "delete a.txt b.txt"
git checkout -b dev
git commit -m "add 666"
git checkout master
git merge dev
git branch -d dev
git checkout -b dev2
git commit -m "add 777"
git checkout master
git commit -m "add 888"
git merge dev2
git branch -d dev2
git checkout -b dev3
git commit -m "add 999"
git checkout master
git branch -d dev3
  • git判断分支冲突原理:Git判断分支冲突原理

    • (1)找到两个commit的最近公共祖先ancestor

    • (2)判断是否发生冲突:

    • (2.1)只有一条分支进行了修改,此时判断没有发生冲突;

    • (2.2)两条分支都进行了修改,但是没有修改ancestor的同一行,则没有发生冲突;

    • (2.3)两条分支都进行了修改,并且修改ancestor的同一行,则发生了冲突。

注意:假如ancestor只有三行,分支dev1在第一行和第二行中间加了10行,分支dev2在第二行和第三行中间加了18行,则进行合并的时候不会发生冲突。

  • 如果两个人开发同一个分支,向云端分支上传的时候可能会造成冲突,此时的做法是:
git pull # 拉取云端代码,会显示冲突

之后处理完冲突后再提交到云端即可

git add .
git commit -m "fix conflicts"
git push

直接拉取某个分支

  • 拉取远程仓库的dev分支
git clone -b dev git@git.acwing.com:wxx/project.git
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值