git使用详情
关于git的基本情况可以参考:
(1)git软件安装及常用配置;;
(2)【linux】05 git。
1 基本概念

2 具体操作
git可视化操作网址:git-school
2.1 本地操作
通过本地创建git 仓库,演示在本地如何管理git 仓库。
git config --global user.name wxx
git config --global user.email 1137247975@qq.com
git config -l

mkdir project
cd project
git init

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

可以看到提示:我们当前在主分支上,并且readme.txt 这个文件还没有被 git 追踪。
git add 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
git reset --hard versionCode
git logp

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

- 修改
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"

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

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 演示和云端的交互

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

git checkout -b dev
git branch

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

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

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

git checkout master

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

- 将
dev 分支的修改合并发到 master 分支上
git merge 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"

此时,查看日志

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

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

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

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

git checkout master
git branch -d dev3

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

git checkout -b dev3
git branch --set-upstream-to=origin/dev3 dev3
git pull

- 将云端分支
dev3 的内容拉取并合并到master 分支上
git checkout master
git pull origin 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
|