Git 使用指南
本文参考《廖雪峰Git教程》,本人概括整理后用typora记录,作为个人备忘录。
本着互助共享的开源精神,现发布于CSDN。若需要.md原文档,请私信获取。
仅供大家个人使用,请勿用于任何商业用途。
第一次发布文章,如有错误,欢迎交流!
-
创建版本库
$ mkdir learngit $ cd learngit $ cd learngit $ pwd $ git init
pwd
:显示当前目录
git init
:将当前目录变成 Git 管理仓库 -
把文件添加到版本库
- 在
learngit
目录或其子目录下,新建readme.txt文件 -
$ git add readme.txt $ git commit -m "wrote a readme file"
-m
后输入本次提交的备注- 可以多次
add
不同文件,最后一次commit
- 在
-
查看仓库当前状态
$ git status
:查看仓库当前状态Changes not staged for commit
:文档被修改过,但未准备提交$ git diff readme.txt
:查看具体修改内容-
$ git add readme.txt $ git status $ git commit -m "add distributed" $ git status
-
版本查询与版本回退
- 每次
commit
都等于生成一张快照 $ git log
:查看提交日志,由近及远$ git log --pretty=oneline
:每次提交以单独一行显示HEAD
表示当前版本,HEAD^
表示上一个版本,HEAD^^
表示上上一个版本,HEAD~100
表示往上100个版本- 版本回退:
$ git reset --hard HEAD^
$ git log
不再保存刚才被替换掉的版本,命令行找到版本号(commit id)的前几位再回退:$ git reset --hard c9636b
$ git reflog
:查询提交的每一次版本号及命令历史
- 每次
-
工作区和暂存区
- 工作区 Working Directory:
learngit
文件夹 - 版本库 Repository:工作区中的隐藏目录
.git
- 版本库中有暂存区 stage/index
- 还有自动创建的第一个分支
master
和指向master
的指针HEAD
$ git add
把修改从工作区复制到版本库暂存区$ git commit
将版本库暂存区的所有待提交修改一次性提交到版本库分支
- 工作区 Working Directory:
-
管理修改:所有修改如果不用
$ git add
到暂存区,就无法加入到commit
中- 第一次修改 -> git add -> 第二次修改 -> git commit
- 上述操作后,第二次修改不会被提交
-
撤销修改
$ git checkout -- readme.txt
:撤销该文件的修改,回到$ git add
或者$ git commit
时的状态- 修改后还未添加到暂存区,撤销工作区修改就回到版本库状态
- 加到暂存区后又做了修改,撤销修改就回到添加到暂存区后的状态
$ git checkout -- file
命令中的--
不能省略,否则会变成“切换到另一个分支”命令
- 修改文件后已经添加到暂存区
$ git reset HEAD <file>
:撤销暂存区的修改,重新放回工作区$ git checkout -- <file>
:撤销工作区的修改
- 修改文件后,已添加到暂存区,已提交
- 版本回退:$
git reset --hard HEAD^
- 版本回退:$
-
删除文件
- 首先
$ rm readme.txt
,然后$ git commit
- 误删:
$ git checkout -- readme.txt
,用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以一键还原 - 注:未被添加到版本库的文件,误删后无法回复
- 首先
-
添加远程库
- Github中添加本机 SSH Key,新建代码仓库
RepositoryName
- 关联远程库:
git remote add origin git@github.com:GithubUserName/RepositoryName.git
- 第一次推送master分支的所有内容:
git push -u origin master
- 此后每次本地提交,使用命令
git push origin master
推送最新修改 - 有网络连接时,本地提交推送完成同步
- Github中添加本机 SSH Key,新建代码仓库
-
从远程库克隆
- Github创建
RepositoryName
$ git clone git@github.com:GithubUserName/RepositoryName.git
- 也可用https协议,但速度慢且每次推送都必须输入口令,地址用
https://github.com/GithubUserName/RepositoryName.git
- Github创建
-
分支管理
- 创建分支:
$ git branch <name>
- 查看分支:
$ git branch
- 切换分支:
$ git switch <name>
- 创建+切换分支:
$ git switch -c <name>
- 合并name分支到当前分支:
$ git merge <name>
- 删除分支:
$ git branch -d <name>
- 创建分支:
-
解决冲突:Git无法自动合并分支时,必须先解决冲突再提交完成合并
- Git用
<<<<<<<
,=======
,>>>>>>>
标记不同分支的内容 - 打开文件修改冲突内容,保存文件
- add + commit:完成分支合并
- 删除不需要的分支
$ git log --graph --pretty=oneline --abbrev-commit
:查看分支合并图
- Git用
-
分支管理策略
Fast Forward
模式:删除分支后会丢掉分支信息- 禁用
Fast Forward
模式,合并时则生成新的commit,从分支历史上可以看到分支信息 - 强制禁用
Fast Forward
模式:$ git merge --no-ff -m "message" <name>
-
分支策略
master
为稳定分支,仅用来发布新版本,不能用来工作dev
为工作分支,团队每人都有自己的分支,按时合并到dev
- 分支合并时,采用
--no-ff
普通模式合并(保留合并历史)
-
Bug分支
dev
分支上的工作暂未完成,无法提交;但需要紧急修复其他bug:stash
,保存工作现场,以后可恢复后继续工作- 修复bug步骤
- a.
$ git stash
:保存当前工作现场 - b. 确定在哪个分支上修复bug,就从该分支
initial
上创建临时分支issue
- c. 在临时分支
issue
上修复bug,commit提交 - d. 切换到原分支
initial
,merge合并,删除临时分支issue
- e. 回到
dev
分支,恢复工作区
- a.
- 恢复工作区:
$ git stash apply
命令查看stash内容- 方法一:
$ git stash apply
,恢复后stash内容并不删除,需要用$ git stash drop
手动删除stash内容 - 方法二:
$ git stash pop
,恢复的同时删除stash内容 - 可以多次stash,
$ git stash apply
查看stash内容,恢复指定内容:$ git stash apply stash@{0}
- 方法一:
initial
分支上修复的bug,需要合并到当前dev
分支,可以用$ git cherry-pick <版本号CommitID>
命令,把提交的bug修改“复制”到当前分支
-
Feature
分支:用于开发新功能,完成后合并到主分支- 新建分支:
$ git switch -c feature-name
- 丢弃未被合并过的分支,强制丢弃
$ git branch -D <name>
- 新建分支:
-
多人协作:远程仓库默认名称为
origin
- 查看远程库信息:精简版
$ git remote
,详细版$ git remote -v
- 推送分支:
$ git push origin <master/dev>
,指定本地分支,推送到远程库对应的远程分支上master
主分支要时刻与远程同步dev
开发分支要与远程同步bug
分支一般只用于本地修复feature
分支视情况而定
- 多人协作工作模式
- a. 首先用
$ git push origin <branch-name>
推送自己的修改 - b. 如果推送失败,是因为远程分支比本地更加新,需要先用
git pull
试图合并- 如果
git pull
提示no tracking information
,说明未创建本地分支和远程分支的链接关系 - 本地创建和远程分支对应的分支
git switch -c branch-name origin/branch-name
- 建立本地分支和远程分支的关联
git branch --set-upstream-to <branch-name> origin/<branch-name>
- 如果
- c. 如果合并时没有冲突,
$ git push origin <branch-name>
推送;如果合并时有冲突,则本地解决冲突,再本地提交,最后推送
- a. 首先用
- 查看远程库信息:精简版
-
标签管理
- 切换到需要打标签的分支上:
$ git switch <dev>
- 创建当前提交的标签:
$ git tag V1.0
- 创建带说明的标签:
$ git tag -a <tagname> -m "message" <commit id>
- 补打指定标签:
$ git tag V0.9 <commit id>
- 查看所有标签:
$ git tag
- 查看某个标签详细信息:
$ git show <tagname>
- 删除本地标签:
$ git tag -d <tagname>
,标签存储在本地,不会自动推送到远程 - 删除远程标签:先本地删除,后远程删除
$ git push origin :refs/tags/<tagname>
- 将所有标签推送到远程:
$ git push origin --tags
- 将指定标签推送到远程:
$ git push origin <tagname>
- 切换到需要打标签的分支上:
-
忽略特殊文件
- 忽略操作系统自动生成的文件,如缩略图等
- 忽略编译生成的中间文件、可执行文件等,如
.class
文件 - 忽略带有敏感信息的配置文件,如存放口令的配置文件
- 忽略上述文件时,需要编写
.gitignore
.gitignore
文件本身要放到版本库里,并且可对.gitignore
做版本管理
-
配置别名
$ git config --global alias.<别名> <原始命令>
- 如
$ git config --global alias.st status
,以后只需要键入$ git st
即可 -global
代表全局参数,针对该电脑所有Git仓库适用- 无
-global
表示只对当前仓库适用