参考: 廖雪峰的Git教程
1. 版本库
1.1 创建版本库
1 | git init # 将目录初始化为版本库(路径不要有中文名),会生成`.git`目录 |
- 所有版本控制系统只能追踪文本文件的改动,无法追踪二进制文件(如图片、视频、word)的改动
- 不要用windows自带的记事本编辑文件,他会在保存UTF-8编码的文件时在开头加上0xefbbbf(十六进制)的字符
1.2 查看版本库
1 | git status #查看仓库状态,是否有文件被修改 |
1.3 版本回退
1 | # 显示提交历史,可加上`--pretty=oneline`精简显示 |
1.4 撤销修改
1 | # 放弃对工作区fileName文件的修改。 |
1.5 删除文件
1 | git rm <fileName> # 从版本库中删除fileName文件 |
2. 远程库
2.1 添加远程库
1 | git remote add <repository_name> <URL> # 关联远程库,名字起做repository_name,一般都会使用origin |
若本地库以及关联一个远程库,会导致添加失败:
1 | git remote -v # 查看远程库 |
2.2 推送到远程库
1 | # 把本地分支推送到origin库的master分支。 |
2.3 从远程库克隆
1 | git clone <URL> # 从URL地址下载文件到本地。 |
3. 分支管理
3.1 创建与合并分支
在只有一个分支的仓库中,HEAD指向master,master指向提交。每次提交时,master向前移动一步。
创建新分支时,新分支指向master的指向位置;切换分支时,改变的是HEAD的指向。
1 | git branch <branch_name> # 创建指定分支 |
因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。
3.2 解决冲突
若两个分支均对同一个文件进行修改,在提交时则会产生冲突。
1 | git status # 查看冲突的文件。 |
3.3 分支管理模式
Fast Forward
模式:默认模式,直接修改分支指针指向的位置;但在删除分支后会丢失分支信息,看不出之前进行过合并。
1 | # 不使用FF模式合并分支。 |
- master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活。
- 在新的分支上干活(例如dev分支),发布时,再将dev合并到master上。
- 每个成员在自己的分支上干活,不时地合并到dev分支即可。
3.4 BUG分支
当前正在dev分支工作的时候,在master分支上有个紧急BUG(代号101)需要修复。
- 此时先“储藏”dev分支:
git stash
。 - 然后从master分支创建临时分支,修改BUG,提交修改,合并分支,删除临时分支。
- 将修改应用到dev分支:切换到dev分支,
git cherry-pick <commit_ID>
,会在dev分支上创建一个新的提交。 - 查看“储藏列表”:
git stash list
。 - 恢复之前工作现场:
git stash pop
或者git stash apply <stash_ID>
+git stash drop <stash_ID>
。3.5 Feature分支
开发一个新feature,最好新建一个分支,在新分支上开发:git switch -c feature-XXXX
。
如果要丢弃一个没有被合并过的分支:git branch -D feature-XXXX
强行删除。3.6 多人协作
远程仓库名称默认为origin
多人协作的工作模式:1
2
3
4git origin # 查看远程库
git origin -v # 查看远程库
git checkout -b <local_branch> origin/<remote_branch> # 创建远程库的分支到本地库 - 首先,可以试图用
git push origin <local_branch>
推送自己的修改; - 如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并; - 如果合并有冲突,则解决冲突,并在本地提交;
- 没有冲突或者解决掉冲突后,再推送就能成功!
如果
git pull
提示no tracking information
,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <remote_branch> origin/<local_branch>
。
3.7 Rebase
1 | git rebase # 可以把本地未push的分叉提交历史整理成直线 |
由3.6可知,在我们推送之前,若有同伴对远程库先push了,我们需要先pull再push。
但是通过git log可知,在我们pull之后,本地的提交历史会分叉。
分叉的提交需要进行三方对比,浪费时间精力,此时可以通过rebase将分叉的提交历史变为直线。
4. 标签管理
Git的标签是版本库的快照,指向某个commit的指针,但是与分支不同的是他不能移动。
因此通过标签可以取出某个提交版本。
4.1 创建标签
1 | git tag <tag_name> # 先切换到要打标签的分支,然后用此命令,默认打在最新的commit上。 |
4.2 查看标签
1 | git tag # 列出所有标签,按字母排序 |
标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签。
4.3 操作标签
1 | git tag -d <tag_name> # 删除本地标签 |
5. Git设置
5.1 设置用户名和邮箱
1 | git config --global user.name "Your Name" |
5.2 忽略文件
在Git根目录创建.gitignore
文件。
GitHub为我们准备的配置文件
语法规则:
符号 | 说明 | ||
---|---|---|---|
# |
注释 | ||
/a.txt |
忽视当前目录下的a.txt | ||
build/ |
忽视所有的build文件夹 | ||
/build/ |
忽视当前目录下的build文件夹 | ||
* |
通配多字符 | ||
? |
通配单字符 | ||
!a.txt |
不忽视a.txt | ||
[] |
匹配括号内的任一字符 | ||
## 5.3 为指令配置别名 | |||
|
|||
配置文件:本地仓库目录下的.git/config 或用户目录下的.gitconfig |