配置 git config (tsejx.github.io)
图解git原理与日常实用指南 - 掘金 (juejin.cn)
合并-git merge
空操作
当master分支的提交领先于dev分支时,合并dev分支啥都不会发生,因为此时HEAD在master分支上。
快速向前合并(fast-forward)
这个模式是说开发功能分支后,master分支上并没有新的提交,那么切到master分支指向merge时,Git 首先尝试执行最简单的选择 Fast-forward 模式合并不会创建新的提交,而是直接合并dev分支上的提交。
非快速向前合并
master分支有了额外的提交,这个时候就会执行non-fast-forward了。如果master分支和dev分支没有冲突,那是最好的,就直接合并了。
如果master和dev分支中有冲突,则需要手动解决冲突。解决完冲突后,需要执行一次add和commit操作!
MR-PR发生冲突
Pull Request / Merge Request 发生冲突时的解决方法:
- 本地
checkout
检出并切换到 A 分支,pull
拉取更新到最新代码 - 在本地 A 分支上,
merge
合并远程分支master
- 会提示无法合并,手动解决完冲突提交到 A 分支
- 回到 PR,会发现 PR 已经无冲突
- 让有
merge
权限的人进行merge
即可
撤销-git reset
用于将当前HEAD复位到指定状态(一般用于撤销之前的一些操作)
撤销暂存
相当于git add的反向操作
# 撤销暂存区的修改,重新放回工作区(vscode里面看就是从 暂存的更改 --> 更改)
git reset <file-name>
# 回退 add 到暂存区里的文件,还原为(HEAD commit 里面该文件的状态)
# 会撤销从上次提交之后的一些操作
git reset HEAD
git reset HEAD -- <file-name>
# 回滚当前分支的指针到指定提交版本,同时重置暂存区,但工作区不变(默认就是-mixed参数)
git reset <commit-id>
已提交本地需要撤回
已经commit到本地了,需要撤回这个提交。
#语法
git reset --soft <commit-id>
git reset --soft <HEAD~n>
#例子
#回退上次提交的修改记录,放回到暂存区
git reset --soft HEAD~1
中断工作流程处理
实际开发中,处于某一个分支,此时来了一个紧急问题要修复,但是目前工作区的内容还没成型,还不足以提交,但是又必须得切分支去修bug。
# you were working in 'feature' branch
git checkout feature
# develop new feature
git commit -a -m "snapshot WIP" # (1)
git checkout master
# fix bug
git commit # commit with real log
git checkout feature
git reset --soft HEAD^ # go back to WIP state # (2)
git reset # (3)
- 这次属于临时提交,因此随便添加一个临时注释即可
- 这次 reset 删除了 WIP commit,并且把工作区设置成提交 WIP 快照之前的状态。
- 此时,在索引中依然遗留着“snapshot WIP”提交时所做的未提交变化,
git reset
将会清理索引成为尚未提交”snapshot WIP“时的状态便于接下来继续工作。
变基-git rebase
变基的作用其实和merge一样,只是过程不一样。rebase是把一个分支上所有的提交在基底上重新执行一遍。执行完了之后再快速merge。
不要对远程仓库的commit进行rebase,或者是自己本地开发某个功能后commit,然后别人基于你这个commit开发,结果你直接rebase了,导致别人直接失效…
# 变基 rebase 与合并 merge 不同,是基于被 rebase 的 commit 上操作的
# 切换至次分支
git checkout bugfix
# 变基至主分支
git rebase master
# 切换到主分支
git checkout master
# 再合并已经变基的 bugfix
git merge bugfix
整个 bugfix
分支上的提交会移动到 master 分支的后面,有效地把所有 master 分支上新的提交并入过来。
执行 rebase
命令将导致分支历史记录看起来类似于下面的图示。
子模块-git submodule
git clone –recursive能把子模块也下载下来
git submodule update –init 如果下载的时候忘记下载模块了
配置-git config
配置信息分为局部的和全局的。
- –local:局部配置信息(当前目录)(默认值)
- –global:全局配置信息
- 查看当前配置
git config --list
- 添加用户名和密码
- git config –global user.name “Holo_wo”
- git config –global user.email “1282424466@qq.com”
git拉取远程分支到本地
-
查看远程分支有哪些
git branch -r
-
拉取远程分支
- git fetch origin 远程分支名字:本地分支名。需要手动切换分支,并且本地分支不会和远程分支建立映射关系
- git checkout -b 本地分支名 origin/远程分支名。自动切换分支,本地分支和远程分支自动建立映射关系
-
手动建立映射关系
-
git branch --set-upstream-to origin/远程分支名 本地分支名
-
git删除分支
git branch -d xxxx
git删除本地修改
git checkout -- .
:将当前目录下所有修改撤销git checkout -- filename
:撤销某个具体文件的修改
git切出某个tag
git checkout tag_name
git状态简览
$ git status -s ##git status --short
M README
MM Rakefile
A lib/git.rb
M lib/simplegit.rb
?? LICENSE.txt
两栏:左边暂存区,右边工作区
git修改分支名称
修改本地分支
git branch -m oldname newname
...