git基础及协同开发
教程来源:https://www.bilibili.com/video/BV1tz411i7t1?p=1
2.使用git
2.1.初始化
进入需要被管理的文件夹,右键点击Git Bash Here
git init
1
2
3
4
5
Administrator@IT-20191111ZDGI MINGW64 /d/hh/workspace/git/code_dev
$ git init
Initialized empty Git repository in D:/hh/workspace/git/code_dev/.git/- 出现了.git的文件夹,表示git已经开始管理当前文件夹了
- 所有的配置、版本信息,都会存储在.git文件夹中
- 出现了.git的文件夹,表示git已经开始管理当前文件夹了
git status
检测当前文件夹下,文件的状态
1
2
3
4
5
6
7
8
9
10
11
12
13Administrator@IT-20191111ZDGI MINGW64 /d/hh/workspace/git/code_dev (master)
$ git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
git.md
index.txt1
nothing added to commit but untracked files present (use "git add" to track)如果又新增了一个文件,再执行
git status
,也是可以检测到的
2.2.管理文件
git add
管理文件
git add git.md
表示管理
git.md
这个文件,其他的不管1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17Administrator@IT-20191111ZDGI MINGW64 /d/hh/workspace/git/code_dev (master)
$ git add git.md
Administrator@IT-20191111ZDGI MINGW64 /d/hh/workspace/git/code_dev (master)
$ git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: git.md
Untracked files:
(use "git add <file>..." to include in what will be committed)
index.txt1再执行
git status
,只提示index.txt1
未被管理(已管理的文件,绿色显示;未被管理的文件,红色显示)
git add .
- 管理当前文件夹下的所有文件
2.3.生成版本
git commit -m 'version1'
1
2
3
4
5
6Administrator@IT-20191111ZDGI MINGW64 /d/hh/workspace/git/code_dev (master)
$ git commit -m 'version1'
[master (root-commit) 3b08830] version1
2 files changed, 79 insertions(+)
create mode 100644 git.md
create mode 100644 index.txt1再执行
git status
1
2
3
4Administrator@IT-20191111ZDGI MINGW64 /d/hh/workspace/git/code_dev (master)
$ git status
On branch master
nothing to commit, working tree clean
git log
查看版本控制记录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20Administrator@IT-20191111ZDGI MINGW64 /d/hh/workspace/git/code_dev (master)
$ git log
commit b29cdcd1e80198c462e866f2ccbf218a2598a64b (HEAD -> master)
Author: 666 <1314520@qq.com>
Date: Tue Oct 19 14:40:53 2021 +0800
v2
commit 0dbd95e75cbb238f270f6a271a0329c39195f53d
Author: 666 <1314520@qq.com>
Date: Tue Oct 19 14:38:36 2021 +0800
version1
commit 3b08830cbfe98f1e382841f13ce2f2ba294bd43e
Author: 666 <1314520@qq.com>
Date: Tue Oct 19 14:36:45 2021 +0800
version1
2.4.命令总结
git init
git status
git add
git commit
git log
三种状态的变化
- 红色:新增的文件/修改的文件 –>
git add .
- 绿色:git已经管理起来 –>
git commit -m '描述信息'
- 生成版本
- 红色:新增的文件/修改的文件 –>
2.5.使用注意点
配置个人信息
生成版本前,如果是第一次使用git的时候,会报错
按照提示,输入用户名和邮箱即可
1 | git config --global user.email "test@email.com" |
3.git三大区域
- 工作区
- 正在工作的文件夹
- 有两种文件状态
- 已管理
- 新的文件/修改的文件
- git自动检测文件状态
- 暂存区
- 通过
git add .
将文件提交到暂存区 - 如果不要了,这一步操作是可以回滚的
- 通过
- 版本库
图示:
3.1.回滚
git reset
1 | Administrator@IT-20191111ZDGI MINGW64 /d/hh/workspace/git/code_dev (master) |
git reset --hard 版本号
1 | Administrator@IT-20191111ZDGI MINGW64 /d/hh/workspace/git/code_dev (master) |
查看文件夹,yuefan功能创建的文件,已经没有了,文件夹版本回滚了shipin功能刚提交时的版本
此时git log
只有到shipin的版本记录
1 | Administrator@IT-20191111ZDGI MINGW64 /d/hh/workspace/git/code_dev (master) |
这个时候,如果又想回滚到yuefan功能的版本,git log
无法解决问题
需要使用如下命令:
git reflog
1 | Administrator@IT-20191111ZDGI MINGW64 /d/hh/workspace/git/code_dev (master) |
上述的08e2cda HEAD@{1}: commit: yuefan
最前面,就是yuefan功能的版本号
回滚到yuefan功能
1 | git reset --hard 08e2cda |
1 | Administrator@IT-20191111ZDGI MINGW64 /d/hh/workspace/git/code_dev (master) |
git log
查看,回到了当初yuefan
功能的版本
1 | Administrator@IT-20191111ZDGI MINGW64 /d/hh/workspace/git/code_dev (master) |
3.2.命令及作用总结
4.初识分支
4.1.紧急修复线上bug思路
会创建一个新的分支,修复后合并到master里面
4.2.基于分支修复线上bug具体过程
git branch
查看当前所处的分支
1
2
3Administrator@IT-20191111ZDGI MINGW64 /d/hh/workspace/git/code_dev (master)
$ git branch
* master当前是处在master分支上
git branch dev
- 创建
dev
分支- 这个dev分支,是基于当前的master分支的
- 功能更新到了yuefan
- 现在在新的分支上,开发商城功能
- 创建
git checkout dev
从
master分支
切换到dev
分支相当于切换了一个新的环境,在
dev
分支上写代码,是不影响master
分支的1
2
3
4Administrator@IT-20191111ZDGI MINGW64 /d/hh/workspace/git/code_dev (master)
$ git checkout dev
Switched to branch 'dev'切换之后,新增文件,并用
git status
查看状态1
2
3
4
5
6
7
8
9Administrator@IT-20191111ZDGI MINGW64 /d/hh/workspace/git/code_dev (dev)
$ git status
On branch dev
Untracked files:
(use "git add <file>..." to include in what will be committed)
tmall.txt1
nothing added to commit but untracked files present (use "git add" to track)这个时候再提交到暂存区,都是在
dev
分支进行操作的
master出现了bug
切换回master分支
1
2
3
4Administrator@IT-20191111ZDGI MINGW64 /d/hh/workspace/git/code_dev (dev)
$ git checkout master
Switched to branch 'master'此时文件夹里,包含商城功能的
tmall.txt1
,已经没有了,因为当前分支是master
,商城功能是在dev
分支上开发的可以再切换到
dev
分支验证下,文件又回到商城功能的版本了(分支和分支之间,做了代码隔离)
git branch bug
在
master
分支上,创建名称为bug
的分支跳转到bug分支:
git checkout bug
,在yuefan功能上修改1
2
3
4
5
6
7
8
9
10
11
12
13
14Administrator@IT-20191111ZDGI MINGW64 /d/hh/workspace/git/code_dev (master)
$ git checkout bug
Switched to branch 'bug'
Administrator@IT-20191111ZDGI MINGW64 /d/hh/workspace/git/code_dev (bug)
$ git add .
Administrator@IT-20191111ZDGI MINGW64 /d/hh/workspace/git/code_dev (bug)
$ git commit -m 'bug_modify_c5'
[bug aa7250e] bug_modify_c5
2 files changed, 2 insertions(+), 1 deletion(-)
delete mode 100644 yuefan.txt1
create mode 100644 yuefan_modify_bug.txt1bug修复完毕,但此时是在
bug
分支上修复的bug,master
分支上还没有修复- 一般线上运行的分支,都是
master
分支 - 子分支上修复完bug之后,需要合并到
master
上
- 一般线上运行的分支,都是
git merge 分支名称
切换回
master
分支git merge bug
1
2
3
4
5
6
7
8
9
10
11
12
13
14Administrator@IT-20191111ZDGI MINGW64 /d/hh/workspace/git/code_dev (bug)
$ git checkout master
Switched to branch 'master'
Administrator@IT-20191111ZDGI MINGW64 /d/hh/workspace/git/code_dev (master)
$ git merge bug
Updating 08e2cda..aa7250e
Fast-forward
yuefan.txt1 | 1 -
yuefan_modify_bug.txt1 | 2 ++
2 files changed, 2 insertions(+), 1 deletion(-)
delete mode 100644 yuefan.txt1
create mode 100644 yuefan_modify_bug.txt1
git branch -d bug
删除
bug
分支修复完bug后,
bug
分支已经没用了1
2
3
4Administrator@IT-20191111ZDGI MINGW64 /d/hh/workspace/git/code_dev (master)
$ git branch -d bug
Deleted branch bug (was aa7250e).
bug修复完之后,可以切换到
dev
分支,继续开发商城功能了dev
分支,是从一开始的master上分下来的,bug还没有修复呢- 这个暂时不用管
就专注于新功能的开发
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22Administrator@IT-20191111ZDGI MINGW64 /d/hh/workspace/git/code_dev (master)
$ git checkout dev
Switched to branch 'dev'
Administrator@IT-20191111ZDGI MINGW64 /d/hh/workspace/git/code_dev (dev)
$ git status
On branch dev
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: tmall.txt1
no changes added to commit (use "git add" and/or "git commit -a")
Administrator@IT-20191111ZDGI MINGW64 /d/hh/workspace/git/code_dev (dev)
$ git add .
Administrator@IT-20191111ZDGI MINGW64 /d/hh/workspace/git/code_dev (dev)
$ git commit -m "mall_version_complete"
[dev caf51f0] mall_version_complete
1 file changed, 2 insertions(+), 1 deletion(-)新功能开发完毕后,进入
master
分支,合并dev
分支sd
此时会报冲突:
1
2
3
4
5
6
7
8Merge branch 'dev'
# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
~
4.3.分支命令总结
查看分支
1
git branch
创建分支
1
git branch 分支名称
切换分支
1
git checkout 分支名称
分支合并(可能产生冲突)
1
2
3git merge 要合并的分支
注意:切换分支再合并删除分支
1
git branch -d 分支名称
4.4.git开发工作流
写代码,都在dev
分支上写
5.github/gitee做代码托管
5.1.创建仓库
以gitee为例,新建仓库后,会有以下提示:
简易的命令行入门教程:
Git 全局设置:
1 | git config --global user.name "莫回首" |
创建 git 仓库:
1 | mkdir code_sai |
已有仓库?
1 | cd existing_git_repo |
5.2.推送代码
在windows按照上述流程并推送
1 | Administrator@IT-20191111ZDGI MINGW64 /d/hh/workspace/git/code_sai |
此时打开:https://gitee.com/mindcons/code_sai
可以看到刚刚推送的文件了
5.3.推送分支
此时只有master分支,我们推送一下dev分支
1 | // 切换到master分支 |
5.4.克隆代码
此时到了另外一个地方了,需要接着写代码,第一次需要把代码克隆下来
此时我们在code_sai意外的另外的地方,新建一个文件夹,模拟在其他地方(家里)
1 | Administrator@IT-20191111ZDGI MINGW64 /d/hh/workspace/git/new_place |
克隆下来之后,进入到code_sai,就可以进行任何想做的操作了
比如说,我们可以看到之前的提交记录:
1 | Administrator@IT-20191111ZDGI MINGW64 /d/hh/workspace/git/new_place/code_sai (master) |
另外,这里默认显示的是master分支,我们用git branch
虽然只看到了master分支
但dev分支也是都克隆下来的,可以直接进行切换
1 | Administrator@IT-20191111ZDGI MINGW64 /d/hh/workspace/git/new_place/code_sai (master) |
5.5.代码托管命令总结
给远程仓库起别名
1
2git remore add origin(别名) 仓库地址
// 别名只用添加一遍向远程推送代码
1
git push -u origin 分支
克隆远程仓库
1
git clone 远程仓库地址(内部已经实现 git remote add origin 远程仓库地址)
克隆之后可以切换分支
1
git checkout 分支
6.两地开发
6.1.master分支合并到dev
我们给master加一个c7.txt1表示更新到版本7,修复了bug,此时dev是一个在版本6分出去的,要继续开发的话,需要在dev分支上,合并master
1 | Administrator@IT-20191111ZDGI MINGW64 /d/hh/workspace/git/code_sai (master) |
merge的时候,会让你输入个备注,输入必要信息,保存退出即可,先按一下esc
,然后输入:wq
,回车
这是一个vim编辑器
我们通过git log
,可以看到在dev
分支中,也是有c7的版本提交记录的
我们在dev
分支上,开发了一个新功能,假设是a1.py
然后快下班了,下班之前,要把dev分支提交
1 | Administrator@IT-20191111ZDGI MINGW64 /d/hh/workspace/git/code_sai (dev) |
6.2.回家拉代码,写完后提交
这个时候回家,2小时后,到家后继续敲代码
我们之前克隆过了
第一步,先把家里面的代码更新一下,不用做git clone
,只要更新
git pull origin dev
切换到dev
分支后,从远程拉代码下来
1 | Administrator@IT-20191111ZDGI MINGW64 /d/hh/workspace/git/new_place/code_sai (dev) |
写到两点,在家里写了a2.py
,然后推送到仓库
1 | Administrator@IT-20191111ZDGI MINGW64 /d/hh/workspace/git/new_place/code_sai (dev) |
6.3.到公司后拉代码,写完后提交
同理,第二天上班到公司后,第一件事不是写代码,而是把远程仓库的代码拉下来:
重复上面的即可
6.4.开发完毕
如果要上线,需要把dev分支,合并到master分支即可
此时dev开发了最后的功能,即将上线
1 | Administrator@IT-20191111ZDGI MINGW64 /d/hh/workspace/git/code_sai (dev) |
在master分支合并dev
1 | Administrator@IT-20191111ZDGI MINGW64 /d/hh/workspace/git/code_sai (master) |
最后也可以把master分支合并到dev,并推送,让两者的代码保持一致
1 | Administrator@IT-20191111ZDGI MINGW64 /d/hh/workspace/git/code_sai (master) |
6.5.忘推送代码了
在公司写了功能,commit了但是忘记push了
回到家写了另外的功能,然后push
第二天在公司pull的时候,会提示有冲突:
1 | Administrator@IT-20191111ZDGI MINGW64 /d/hh/workspace/git/code_sai (dev) |
查看产生冲突的文件,这个时候需要我们手动解决冲突(该保留的保留,该删的删)
然后继续开发,开发完后提交代码:
1 | Administrator@IT-20191111ZDGI MINGW64 /d/hh/workspace/git/code_sai (dev|MERGING) |
6.6.命令补充
git pull origin dev
等同于git fetch origin dev
git merge origin/dev
图示:16集18:00
7.rebase应用场景
目的:让代码提交记录变得简洁
7.1.应用场景一
7.1.1.提交记录合并
假设总共提交了4次版本,可以用git log
查看
git rebase -i
版本号- 合并当前版本至目的版本之前的所有版本号
git rebase -i HEAD~3
- 合并当前版本,距离最近的3条记录
把第二行和第三行的
pick
修改为s
,表示希望当前的版本,合并到上一个版本上去保存退出,进入提交信息修改界面,保存退出
7.1.2.备注
已经push到仓库的,不建议合并,否则会很麻烦
7.2.应用场景二
开发过程中的dev分叉,也是可以合并的
git log --graph
以分支的形式显示
git log --graph --pretty=format:"%h %s"
更加简洁的显示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22Administrator@IT-20191111ZDGI MINGW64 /d/hh/workspace/git/code_sai (dev|REBASE 3/3)
$ git log --graph --pretty=format:"%h %s"
* fbb73dc dev_rebase
* 8b5dd1e # This is a combination of 2 commits. # This is the 1st commit message:
* c030879 Merge branch 'dev'
|\
| * d5b6ad2 a4
| * a33a827 Merge branch 'dev' of https://gitee.com/mindcons/code_sai into dev
| |\
| | * 751e26e 家里加班写了a2的功能
* | | 0b34eb4 up
|/ /
* / 6e21f86 a3功能开发完毕,即将上线
|/
* 6d93e2a 公司开发的第一天
* 2c33bf8 Merge branch 'master' into dev the commit.
|\
| * eacc6df c7
* | 193819f dev
|/
* 74b14f4 first commit现在
dev
中开发,commit然后在
dev
中,执行git rebase master
接着切换到
master
,再执行git merge dev
最后显示
git log --graph --pretty=format:"%h %s"
的时候,就没有分叉了
7.3.应用场景三
之前忘记提交代码的案例中,v1和v2的合并,会产生分叉
不要直接git pull
git pull
git fetch
git merge
直接git pull
,拉到本地后,回执行git merge
的操作,
我们直接git fetch origin dev
,再执行git rebase origin/dev
这样子合并的话,提交记录就不会产生分叉。
git rebase
的时候,上述都是默认没有冲突的。
出现冲突后,按照提示解决冲突后,最后可以执行git rebase --continue
7.4.beyond compare快速解决冲突
安装软件
在git中配置,
--local
表示只在当前项目有效1
2
3git config --local merge.tool bc3
git config --local mergetool.path '/usr/local/bin/bcomp'
git config --local mergetool.keepBackup false应用
beyond compare
解决冲突1
git mergetool
7.5.命令总结
8.git flow工作流
协同开发:
- 邀请成员
- 创建组织
8.1.git tag
多次commit
之后,可以
1 | git tag -a v1 -m '第一版' |
在git远程,就可以看到tag的版本了:
8.2.邀请成员
邀请成员进入组织
再邀请成员进入仓库
然后成员创建分支,进行开发
git checkout -b dev
创建,并切换分支
邀请,并设置开发权限
小弟操作:
1 | // 先从主分支拆分 |
8.3.代码review
成员开发完后,需要做代码review
可以用pull request
实现,在此之前,需要做一下branch的配置:
git中设置:
成员创建pull request
提交后
管理人员:
8.4.测试上线
从dev分支,切除release版本
1 | git checkout -b release |
测试完成,把release
版本pull request
到master
中
还要将release
合并到dev
,也可以直接merge
(代码review的时候,不能直接merge)
最后删除release
然后把代码拉下来,打tag标识版本,并推送
最后上线的,可以上线tag的v2版本
1 | git branch -d release |
9.给开源项目贡献代码
将别人的源代码,拷贝到自己的仓库
在自己的仓库修改
给源代码的作者,提交修复bug的申请(pull reqeust)
- 把自己的
master
,申请合并到对方的master
- 把自己的
10.补充
10.1.配置文件存放的三个位置
项目配置文件:
.git/config
1
2git config --local user.name 'aaa'
git config --local user.email 'aaa@aa.com'全局配置文件:
~/.gitconfig
1
2git config --global user.name 'aaa'
git config --global user.email 'aaa@aa.com'系统配置文件:
/etc/.gitconfig
1
2
3
4git config --system user.name 'aaa'
git config --system user.email 'aaa@aa.com'
需要有root权限
优先级:现在项目找,再在全局找,最后在系统找
应用场景:
1 | git config --local user.name 'aaa' |
10.2.git免密登陆
url中体现
1
2
3
4
5
6原来的地址:https://gitee.com/mindcons/code_total.git
修改的地址:https://用户名:密码@gitee.com/mindcons/code_total.git
git remote add https://用户名:密码@gitee.com/mindcons/code_total.git
git push origin masterssh实现
1
2
3
4
5
6
7
8
9
10
11
121.生成公钥和私钥
git 终端:
ssh-keygen
2.存储位置
默认放在(~/.ssh)
id_isa.pub 公钥
id_isa 私钥
3.拷贝公钥的内容,并设置到github中
4.在git本地配置ssh地址
git remote add origin git@gitee.com:mindcons-g/python.git
5.以后使用
git push origin mastergit自动管理凭证
10.3.git忽略文件
创建.gitignore
文件
让git不再管理当前目录下的某些文件
1 | *.h |
10.4.任务管理相关
issues
wiki
- 记录文档