配置 git config (tsejx.github.io)

图解git原理与日常实用指南 - 掘金 (juejin.cn)

合并-git merge

空操作

当master分支的提交领先于dev分支时,合并dev分支啥都不会发生,因为此时HEAD在master分支上。

快速向前合并(fast-forward)

这个模式是说开发功能分支后,master分支上并没有新的提交,那么切到master分支指向merge时,Git 首先尝试执行最简单的选择 Fast-forward 模式合并不会创建新的提交,而是直接合并dev分支上的提交。

merge-foast-forward

非快速向前合并

master分支有了额外的提交,这个时候就会执行non-fast-forward了。如果master分支和dev分支没有冲突,那是最好的,就直接合并了。

merge-no-foast-forward

如果master和dev分支中有冲突,则需要手动解决冲突。解决完冲突后,需要执行一次add和commit操作

MR-PR发生冲突

Pull Request / Merge Request 发生冲突时的解决方法:

  1. 本地 checkout 检出并切换到 A 分支,pull 拉取更新到最新代码
  2. 在本地 A 分支上,merge 合并远程分支 master
  3. 会提示无法合并,手动解决完冲突提交到 A 分支
  4. 回到 PR,会发现 PR 已经无冲突
  5. 让有 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)
  1. 这次属于临时提交,因此随便添加一个临时注释即可
  2. 这次 reset 删除了 WIP commit,并且把工作区设置成提交 WIP 快照之前的状态。
  3. 此时,在索引中依然遗留着“snapshot WIP”提交时所做的未提交变化,git reset 将会清理索引成为尚未提交”snapshot WIP“时的状态便于接下来继续工作。

变基-git rebase

变基的作用其实和merge一样,只是过程不一样。rebase是把一个分支上所有的提交在基底上重新执行一遍。执行完了之后再快速merge。

不要对远程仓库的commit进行rebase,或者是自己本地开发某个功能后commit,然后别人基于你这个commit开发,结果你直接rebase了,导致别人直接失效…

Rebase01

# 变基 rebase 与合并 merge 不同,是基于被 rebase 的 commit 上操作的
# 切换至次分支
git checkout bugfix
# 变基至主分支
git rebase master
# 切换到主分支
git checkout master
# 再合并已经变基的 bugfix
git merge bugfix

整个 bugfix 分支上的提交会移动到 master 分支的后面,有效地把所有 master 分支上新的提交并入过来。

执行 rebase 命令将导致分支历史记录看起来类似于下面的图示。

Rebase01

子模块-git submodule

git clone –recursive能把子模块也下载下来

git submodule update –init 如果下载的时候忘记下载模块了

配置-git config

配置信息分为局部的和全局的。

  • –local:局部配置信息(当前目录)(默认值)
  • –global:全局配置信息
  1. 查看当前配置 git config --list
  2. 添加用户名和密码
    1. git config –global user.name “Holo_wo”
    2. git config –global user.email “1282424466@qq.com

git拉取远程分支到本地

  1. 查看远程分支有哪些git branch -r

  2. 拉取远程分支

    1. git fetch origin 远程分支名字:本地分支名。需要手动切换分支,并且本地分支不会和远程分支建立映射关系
    2. git checkout -b 本地分支名 origin/远程分支名。自动切换分支,本地分支和远程分支自动建立映射关系
  3. 手动建立映射关系

    • 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