git使用详情
- 参考自:linux基础课
关于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-school 输入的命令
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