常用客户端:Gitkraken, Fork, Github 客户端
(一) Git 命令
1. 初始化 Git
进入到自己想创建版本库的目录
-
输入指令:
git init
的目录,这个目录就是Git用来跟踪管理版本库的。
3. 文件添加进远程代码库
-
git add <文件名>
将文件名为filename
的文件添加进仓库,可以多个文件名并列,用空格隔开 - 初次提交可以直接使用
git add .
将当前所有文件添加进仓库 -
git commit -m "describe it"
将文件提交到本地分支仓库的操作,后面加的是日志。 -
git add remote origin <远程仓库地址>
添加远程仓库地址 -
git pull --rebase origin master
如果在远程仓库中创建了诸如 README.md 等文件,需要先进行这不操作,保证本地也同步到远程的文件 -
git push -u origin master
将本地代码推送到远程代码库
4. 提交和更新代码操作
-
git add <文件名>
先把要更新的文件加入暂存区,,相应还有git add .
(提交新文件和被修改文件,不包括被删除文件)、git add --all
(提交所有变化) 和git add -u
(提交被修改和被删除文件,不包括新文件) -
git commit -m "describe it"
提交到本地分支仓库 -
git push -u <分支名>
推送到远程代码仓库 -
git pull <远程主机名> <远程分支名>:<本地分支名>
更新代码,如果有冲突需要在本地提交
5. 日常模式总结
- 首先,用
git push origin branch-name
推送自己的修改; - 如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并; - 如果合并有冲突,则解决冲突,并在本地提交;
- 没有冲突或者解决掉冲突后,再用
git push origin branch-name
再次推送 - 如果
git pull
提示 “no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name
。
6. 常用指令
-
git status
可以随时仓库当前状态,查看已经命令过但还未经提交到仓库的所有操作,可以看成是待处理事项列表 -
git diff
可以看到具体修改了哪些内容 -
git log
查看对仓库的操作记录 -
git rm <filename>
删除文件,如果确认删除,删除后需要进行git commit -m "describe it"
操作,保证本地分支同步;如果需要回复删除文件需要用git checkout --<filename>
操作,从分支仓库中回复文件到暂存区 -
git clone git@server-name:path/repo-name.git
从远程代码仓库克隆代码 -
git branch
查看本地分支 -
git branch -r
查看远程分支 -
git branch <本地分支名>
创建本地分支 -
git checkout <本地分支名>
切换到相应本地分支 -
git branch -d <本地分支名>
删除分支 -
git merge <本地分支名>
与当前分支进行合并 -
git reset HEAD
取消缓存在暂存区的文件 -
git tag
查看版本 -
git tag <版本号>
创建新版本 -
git tag -d <版本号>
删除版本
(二) Git 基本概念
1. 版本回退: git reset
- 每一次
commit
都是对应一个版本 -
commit id
是对版本的具体标识 -
HEAD
表示当前版本 -
HEAD^
表示上一个版本 -
HEAD^^
表示上上版本 -
HEAD~100
表示前100个版本 -
git reset --hard commitId
回退到版本号为commitId
的地方,也可以用HEAD
的形式表示。 - 穿梭前,用
git log
查看提交历史,以便确定要回退到哪个版本。 - 重返未来,用
git reflog
查看命令历史,以便确定要回到未来的哪个版本。
2. 工作区和暂存区
-
先上一张很经典的图
工作区:就是我们在电脑中实际看到的;
版本库:工作区中的隐藏目录
.git
,就是版本库;暂存区:暂存区的概念很重要,理解暂存区之后对于Git的版本管理会有一个比较清晰的思路。
master: 这是Git为我们自动创建的第一个分支。
我觉得如果把工作区看成是键盘终端输入,版本库中的
master
可以看成是电脑硬盘,我们输入的内容首先是到缓存中的,并不是直接存入硬盘。当缓存区满或者人为发送指令时才会将缓存区的内容写入硬盘。-
以添加和文件修改为例,
git add
指令只是选中文件或者其他要提交的修改,将它们添加进暂存区。只有使用git commit
指令的时候,才将暂存区的所有内容提交到当前分支。
(三) 分支管理
1. 分支需求描述
- 不完整的改动可以先放到分支上,这样别人看不到分支的内容,不会相互影响。可以直到开发完毕后,再一次性合并到原来的分支上.
- 一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:
只有一条master时间线
2. 创建、合并和删除分支
2.1 原理
-
创建新的分支:
当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:
创建新的分支dev
-
Git创建一个分支很快,增加一个dev指针,改改HEAD的指向. 从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:
对工作区的修改和提交
-
合并分支:
把dev合并到master上, 最简单的方法就是直接把master指向dev的当前提交,就完成了合并:
合并分支
-
删除分支:
删除dev分支就是把dev指针给删掉,删掉后就剩下了一条master分支:
删除分支
2.2 实战
- take
dev
as an example - 创建分支:
git branch dev
- 切换到分支:
git checkout dev
- 创建+切换分支:
git checkout -b dev
- 查看当前分支:
git branch
- 切换到master分支:
git checkout master
- 合并指定分支到当前分支:
git merge dev
- 删除分支:
git branch -d dev
-
git log --graph
命令可以看到分支合并图。
3. 分支策略
在实际开发中,我们应该按照几个基本原则进行分支管理:
master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
-
你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
4.所以,团队合作的分支看起来就像这样:
团队合作分支
4. Bug分支
- 修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
- 当工作没有完成时,先把工作现场
git stash
一下,然后去修复bug. - 修复后,再
git stash pop
,回到工作现场。 - 要丢弃一个没有被合并过的分支,可以通过
git branch -D <name>
强行删除。
5. 多人协作
5.1 基本命令
当从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin。
要查看远程库的信息,用
git remote
显示更详细的信息, 用
git remote -v
-
推送分支: 就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上:
git push origin master git push origin dev
并不是一定要把本地分支往远程推送,master分支是主分支,因此要时刻与远程同步, 其他视情况而定.
git pull
抓取远程的新提交.在本地创建和远程分支对应的分支,使用
git checkout -b branch-name origin/branch-name
,本地和远程分支的名称最好一致;建立本地分支和远程分支的关联,使用
git branch --set-upstream branch-name origin/branch-name
;