Git操作指南:版本控制与分支管理
一、版本进退
每commit一次就产生一个版本(一个“存档”)
HEAD 表示当前版本
HEAD^ 表示上个版本
HEAD^^ 表示上上个版本
HEAD^^^ 表示上上上个版本
HEAD~100 表示上一百个版本
HEAD相当于一个指针,指向当前版本
用 git log 来列出目前版本(也就是HEAD指向的版本)以及之前的版本。
从现在穿梭回过去:
# 回到之前 commit id 以 “xxx” 开头的版本 $ git reset --hard xxx 12
这个操作实际上是改变HEAD指针的指向,并没有丢失当前的几个版本
此时用 git log 显示出来的是回退到的那个版本以及那个版本之前的版本
从过去穿梭回到现在:如果后悔,想要去到最新的几个版本,但又无法用 git log 找到他们的 commit id,那么:
git reflog 可以帮你找到
二、工作区和版本库
2.1 工作区 Working Directory
工作区就是当前文件夹里的源文件源代码们
2.2 版本库 Repository
版本库是当前文件夹里的 .git 文件夹,它包含着项目的版本
版本库包含:
暂存区(stage):
# 将工作区(working directory)的文件xxx的修改,添加到暂存区(stage) $ git add xxx 12
master 分支:
HEAD指向这个master分支
# 将暂存区(stage)的文件提交到当前HEAD分支 $ git commit -m "xxx" 12
2.3 工作区和版本库穿梭
git add:工作区 (working directory) --> 暂存区 (stage)
git commit:stage --> HEAD 分支
git diff:用来比较工作区和暂存区一个文件的差异
2.3.1 撤销本地修改撤销本地修改,等同于:重回暂存区 (stage),撤销工作区 (working directory)
# 丢弃在工作区的xxx文件的改变 $ git checkout -- <file> # 把 README.txt 在工作区 (working directory) 的修改全部撤销 $ git checkout -- README.md git checkout . #本地所有修改的。没有的提交的,都返回到原来的状态 git stash #把所有没有提交的修改暂存到stash里面。可用git stash pop回复。 git reset --hard HASH #返回到某个节点,不保留修改,已有的改动会丢失。 git reset --soft HASH #返回到某个节点, 保留修改,已有的改动会保留,在未提交中,git status或git diff可看。 git clean -df #返回到某个节点,(未跟踪文件的删除) git clean 参数 -n 不实际删除,只是进行演练,展示将要进行的操作,有哪些文件将要被删除。(可先使用该命令参数,然后再决定是否执行) -f 删除文件 -i 显示将要删除的文件 -d 递归删除目录及文件(未跟踪的) -q 仅显示错误,成功删除的文件不显示 注: git reset 删除的是已跟踪的文件,将已commit的回退。 git clean 删除的是未跟踪的文件
1234567891011121314151617181920212223 情况一: README.txt 已经在暂存区(stage),但是在工作区(working directory)又被修改。 t = 0:git add README.txtt = 1:修改 README.txt使用 git checkout -- README.md 可以让 README.md 变成 t = 0 的样子 情况二:README.txt 还没有被添加到版本库(stage或master分支)。 使用 git checkout -- README.md 会让README.md 变成当前版本库的样子 2.3.2 撤销 add 操作撤销add,等同于:重回工作区 (working directory) ,撤销暂存区 (stage)```
$ git reset HEAD xxx # 将已经在暂存区的README.md撤销,换句话说,把已经 git add 的文件撤销 $ git reset HEAD README.md 1234 2.3.3 撤销 commit 操作
# --soft # 不删除工作空间改动代码,撤销commit,不撤销git add . ==> 撤销了commit,代码仍然保留。 git reset --soft HEAD^ # --hard 删除工作空间改动代码,撤销commit,撤销git add . ==> 代码不保留,恢复到上一次的commit状态。 git reset --soft HEAD^ 1234567
HEAD^的意思是上一个版本,也可以写成HEAD~1
如果你进行了2次commit,想都撤回,可以使用HEAD~2
2.4 删除文件
在 git add 和 git commit 之后,又删除了工作区 (working directory) 一个文件,例如 rm test.txt:
这时候工作区就和版本库不一致了
情况一:确实想删除
要用 git rm 将本地删除的文件在版本库里也删除。然后再 git commit 提交这个情景情况二:手误将本地test.txt删除
使用 git checkout – test.txt 重回暂存区,撤销本地操作。三、分支
3.1 HEAD 和 master
HEAD 和 master
HEAD 指向当前分支
例如:在 master 分支上,创建一个 dev 分支,那么 dev 指针和 master 指针指向同一个提交结点。在提交的话,就是提交到 dev 分支,此时 master 停滞不动,dev 往前走一步。由于 HEAD 指向 当前分支,则:HEAD 现在指向 dev 的最新提交结点master 指向提交
合并 dev 到 master 时,master 指针指向 dev 指针所指向的提交结点。3.2 关联一个远程库
$ git remote add origin https://github.com/GavinHU66/xxx.git 1
3.3 查看分支与当前位置
$ git branch * dev master # -a: List both remote-tracking branches and local branches. Combine with --list to match optional pattern(s). $ git branch -a * gavinqyhu/dev master remotes/origin/HEAD -> origin/master remotes/origin/channel/master remotes/origin/develop remotes/origin/gavinqyhu/dev remotes/origin/master remotes/origin/message/master # -r # --remotes # List or delete (if used with -d) the remote-tracking branches. Combine with --list to match the optional pattern(s). $ git branch -r origin/HEAD -> origin/master origin/channel/master origin/develop origin/gavinqyhu/dev origin/master origin/message/master # -v, -vv, --verbose # -v: show sha1 and commit subject line for each head, #show relationship to upstream branch (if any). # -vv: #print the path of the linked worktree (if any) and the name of the upstream branch $ git branch -v * gavinqyhu/dev b74ddd6 chore: 修改渠道搜索url master f42003a docs: update readme $ git branch -vv * gavinqyhu/dev b74ddd6 [origin/gavinqyhu/dev] chore: 修改渠道搜索url master f42003a [origin/master] docs: update readme
123456789101112131415161718192021222324252627282930313233343536373.4 从已有的本地分支切出新分支
从已有分支拉出新分支创建 dev 分支
$ git branch dev 1
从已有分支切换到 dev 分支
$ git checkout dev 1
二合一:从已有分支创建并切换到 dev 分支
$ git checkout -b dev 1
3.5 合并流程
工作流程(快速合并,原master没有什么提交或修改):
创建 dev 分支,并切换工作区到 dev 分支$ git checkout -b dev 或者 $ git switch -c dev 123 在 dev 分支上进行开发
$ // modify some files... 1 在 dev 分支上提交
$ git add . $ git commit -m "dev branch test" 12 切换回master分支
$ git checkout master 或者 $ git switch master 123 把dev分支的工作成果合并到master分支上
$ git merge dev 1 删除dev分支
$ git branch -d dev 1
快速合并
Fast forword,即为,可以的时候,合并时只改变指针。
如果想要禁用 Fast forward,加上 --no-ff 参数:
$ git merge --no-ff -m "merge with no-ff" dev 1
发生合并冲突:
与上文相反,无法快速合并:原master已经有它自己的修改或提交。
master 分支出 devmaster 开发并提交 feature1dev 开发并提交 feature2现在在master,将 dev 合入 master:git merge dev此时由于feature1 和 feature2 产生了冲突,合并失败,需要手动合并在master上,对冲突文件进行修改,在 git add / git commit查看分支合并图:
$ git log --graph $ git log --graph --pretty=oneline --abbrev-commit 12
3.6 删除分支
分支没有改动没commit:-d$ git branch -d <branch_name> 1 分支还有改动没commit:-D
$ git branch -D <branch_name> 1
3.7 git stash
手头工作没有完成时,有新的快速需求/bug修复需求,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。
将现场工作“储存”起来$ git stash 1 恢复
## 恢复后,stash内容并不删除 $ git stash apply ## 删除 $ git stash drop ## 恢复的同时把stash内容也删除 $ git stash pop ## 多次stash,查看情况 $ git stash list ## 然后恢复指定的stash $ git stash apply stash@{0} 1234567891011121314
3.8 cherry-pick
复制一个特定的提交到当前分支
$ git cherry-pick <commit id> # 例子 $ git branch * dev master $ git cherry-pick 4c805e2 [master 1d4b803] fix bug 101 1 file changed, 1 insertion(+), 1 deletion(-) 123456789
四、远程
4.1 查看远程库信息
$ git remote origin ## 更详细信息 $ git remote -v origin http://git.code.oa.com/map-h5/couponCMS.git (fetch) origin http://git.code.oa.com/map-h5/couponCMS.git (push) 1234567
4.2 克隆某个分支或所有分支
克隆某个指定分支:
$ git clone -b <branch_name> https://... 1
克隆某个所有分支:
$ git clone https://... 1
4.3 设置本地远程分支映射
# 将本地分支关联到远程分支 $ git branch --set-upstream-to=origin/<remote_branch_name> <local_branch_name> # 例如,将本地 dev 分支关联到远程 dev 分支,origin通常指远程库 $ git branch --set-upstream-to=origin/dev dev # 在这之前,如果没有很久没有更新,即本地并不知道远程 dev 分支,可以用 git fetch 来获取远程分支信息 1234567
4.4 查看本地分支和远程分支的映射
$ git branch -vv * gavinqyhu/dev e7cd1f8 [origin/gavinqyhu/dev: ahead 1] fix: 渠道按位或搜索 master f42003a [origin/master] docs: update readme 1234
4.5 push 到远程分支
$ git push origin <branch_name> # 例如 $ git push origin master $ git push origin dev 12345
4.6 pull 指定远程分支
如果当前提交版本慢于远程版本,则需要先pull,再push
$ git pull # 再 commit 和 push $ git commit -m "fix conflict" $ git push origin dev 12345
4.7 pull 指定远程分支并创建本地分支
# 在本地新建分支x,并自动切换到该本地分支x # 采用此种方法建立的本地分支会自动和远程分支建立映射关系 git checkout -b 本地分支名x origin/远程分支名x # 例如: 将远程gavinqyhu/dev分支拉下来到新创建的本地gavinqyhu/dev分支 git checkout -b gavinqyhu/dev origin/gavinqyhu/dev # 在本地新建分支x,但是不会自动切换到该本地分支x,需要手动checkout # 采用此种方法建立的本地分支会自动和远程分支建立映射关系 git fetch origin 远程分支名x:本地分支名x 12345678910
五、配置 config
5.1 作用域
--system: /etc/gitconfig:系统范围内的配置文件,适用于系统所有的用户; 使用 git config 时, 加 --system 选项,Git将读写这个文件。 --global: ${HOME}/.gitconfig:用户级的配置文件,只适用于当前用户; 使用 git config 时, 加 --global 选项,Git将读写这个文件。 --local: .git/config:Git项目级的配置文件,位于当前Git工作目录下,只适用于当前Git项目; 使用 git config 时,不加选项( --system 和 --global ),Git将读写这个文件。优先级是: local > global > system, 而global存储的是提交用户的email和用户名,所以可手动设置config
5.2 增删改查
增:
$ git config --global --add configName configValue 1
删:
$ git config --global --unset configName (只针对存在唯一值的情况) 1
改:
$ git config --global configName configValue 1
查:
$ git config --global configName 1
查看配置
$ git config -l 1
设置用户名和邮箱
$ git config --global user.name [username] $ git config --global user.email [email] 12
5.3 配置别名
$ git config --global alias.co checkout $ git config --global alias.ci commit $ git config --global alias.br branch 123
六、commit讲解
6.1 修改当前commit
commit之后手误打错字并且不小心提交了,修改当前commit:
$ git commit --amend 1
6.2 -a 标志
-a, --all:表示告诉git,将所有new files和modified files 自动加进暂存区(stage),相当于一步 git add .操作
相关知识
智能移动应用开发完整指南
git上的分支命名规范
Cursor零基础小白教程系列「技巧」
基于自然语言处理的智能医疗诊断系统设计与实现
智能养花机
前端开发综合指南:HTML、CSS和JavaScript详解
基于PHP的在线购物系统开发实战指南:从零构建电商平台
如何学习前端开发:从入门到精通的指南
零起飞
老树新花:旧有项目的简易前端资源缓存处理
网址: Git操作指南:版本控制与分支管理 https://www.huajiangbk.com/newsview1462229.html
上一篇: 2020NCCN软组织肉瘤指南中 |
下一篇: Android ANR日志分析指 |
推荐分享

- 1君子兰什么品种最名贵 十大名 4012
- 2世界上最名贵的10种兰花图片 3364
- 3花圈挽联怎么写? 3286
- 4迷信说家里不能放假花 家里摆 1878
- 5香山红叶什么时候红 1493
- 6花的意思,花的解释,花的拼音 1210
- 7教师节送什么花最合适 1167
- 8勿忘我花图片 1103
- 9橄榄枝的象征意义 1093
- 10洛阳的市花 1039