git基础及协同开发
教程来源:https://www.bilibili.com/video/BV1tz411i7t1?p=1
2.使用git
2.1.初始化
进入需要被管理的文件夹,右键点击Git Bash Here
git init1
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 status1
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 initgit statusgit addgit commitgit 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 bug1
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 devgit 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 pullgit fetchgit 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/config1
2git config --local user.name 'aaa'
git config --local user.email 'aaa@aa.com'全局配置文件:
~/.gitconfig1
2git config --global user.name 'aaa'
git config --global user.email 'aaa@aa.com'系统配置文件:
/etc/.gitconfig1
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
- 记录文档



