# Git实战笔记
# Git配置
- git config --system (基本不用,给整个计算机一次性设置)
- git config --global (推荐,给当前用户一次性设置)
~/.gitconfig
- git config --local (给当前项目一次性设置)
.git/config
优先级3>2>1
设置邮箱、用户名
git config --global user.name 'tanshion'
git config --global user.email '405781027@qq.com'
git config --global user.password 'xxxx'
git config --local user.name 'tanshion'
git config --local user.email '405781027@qq.com'
用户全局级别的配置文件:~/.gitconfig
[user]
email = 405781027@qq.com
name = tanshion
[alias]
# dfd = difftool --dir-diff --no-symlinks
dfd = difftool --dir-diff
df = difftool
mt = mergetool
[diff]
tool = bc3
[difftool]
prompt = true
[difftool "bc3"]
path = "/usr/local/bin/bcomp"
[merge]
tool = bc3
[mergetool]
prompt = true
[mergetool "bc3"]
path = "/usr/local/bin/bcomp"
[mergetool "tool"]
trustExitCode = true
[core]
excludesfile = /Users/i/.gitignore_global
autocrlf = input
[difftool "sourcetree"]
cmd = opendiff \"$LOCAL\" \"$REMOTE\"
path =
[mergetool "sourcetree"]
cmd = /Applications/Sourcetree.app/Contents/Resources/opendiff-w.sh \"$LOCAL\" \"$REMOTE\" -ancestor \"$BASE\" -merge \"$MERGED\"
trustExitCode = true
[commit]
template = /Users/i/.stCommitMsg
[credential]
helper = osxkeychain
[user]
email = 405781027@qq.com
name = tanshion
[alias]
# dfd = difftool --dir-diff --no-symlinks
dfd = difftool --dir-diff
df = difftool
mt = mergetool
[diff]
tool = bc3
[difftool]
prompt = true
[difftool "bc3"]
path = "/usr/local/bin/bcomp"
[merge]
tool = bc3
[mergetool]
prompt = true
[mergetool "bc3"]
path = "/usr/local/bin/bcomp"
项目级别的配置文件:.git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[remote "origin"]
url = https://gitee.com/chentengxiang/micro-plus.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
# 初始化
初始化仓库
git init
指定仓库地址
git remote add origin https://github.com:aaaa/bbbb.git
再指定分支
git push -u origin master
后续推送/拉取只需要 git push
/ git pull
# 忽略文件 (.gitignore)
通配符 :
#任意字符
*
#忽略.properties结尾文件
*.properties
#排除忽略,配合`*.properties` 一起使用
!b.properties
#忽略dir目录中的所有文件
dir/
#忽略dir目录的.txt结尾文件
dir/*.txt
#能够忽略 dir/abc/a.txt dir/xyz/a.txt ,不能 dir/xyz/123/a.txt
dir/*/*.txt
#任意级别目录
dir/**/*.txt
#默认会自动忽略空目录
# 解决冲突
解决冲突:git add xxxx(告知git,冲突已解决)
git add xxxx
git commit -m "xx"
注意:master在merge时 如果遇到冲突 并解决,则解决冲突 会进行加1次提交: 1次是最终提交,另外将对方dev的提交信息commit也拿来了
# 撤销reset和revert
冲突可以使用--abort终止,还原操作之前的场景,也可以解决冲突
# 使用git revert撤销
git revert
的原理是,在当前提交后面,新增一次提交,抵消掉上一次提交导致的所有变化。它不会改变过去的历史,所以是首选方式,没有任何丢失代码的风险。但是很容易会有冲突。
# 使用git reset撤销
git reset
的原理是,让最新提交的指针回到以前某个时点,该时点之后的提交都从历史中消失。
git reset
有三种模式:soft、mixed、hard
- reset --hard:重置stage区和工作目录
- reset --soft:保留工作目录,并把重置 HEAD 所带来的新的差异放进暂存区
- reset --mixed:默认方式,保留工作目录,并清空暂存区,把所有差异都混合(mixed)放在工作目录中
# 合并分支
注意:master在merge时 如果遇到冲突 并解决,则解决冲突 会进行加1次提交: 1次是最终提交,另外将对方dev的提交信息commit也拿来了
如果一个分支靠前(dev),另一个落后(master)。则如果不冲突, master可以通过 merge 直接追赶上dev,称为 fast forward。
fast forward:本质就是 分支指针的移动.注意:跳过的中间commit,仍然会保存。
两个分支 fast forward 归于一点commit
没有分支信息(丢失分支信息)
git merge 时,默认使用fast forward 合并;也可以使用git merge --no-ff
禁止fast forward的方式 ;
- 两个分支 fast forward ,不会归于一点commit (主动合并的分支 会前进一步)
- 分支信息完整(不丢失分支信息)
合并分支有两种方式:git merge 和 git rebase
在开发过程中建议使用git merge,如果没有冲突使用fast forward 合并,如果冲突不能fast forward 合并。
在一个功能分支开发完成审核通过准备提交到主分支后删除的情况,建议使用geit rebase合并。
# 使用git merge 合并分支
如果dev要合并到master则需要在master分支上操作git merge dev
可以使用--abort终止,还原操作之前的场景
# 使用git rebase 合并分支
如果feature要合并到dev则需要在feature分支上操作git rebase dev
,操作步骤如下:
- 在feature分支操作
git rebase dev
,如果是有多个提交且有冲突,那么几个提交冲突就会几次冲突解决处理。 - 操作
git checkout dev
进入dev分支,然后执行git merge feature
进行使用fast forward 合并。 - 删除feature分支
rebase可能会冲突:可以选择如下操作
- 解决冲突
git add .
git rebase --continue
- 忽略冲突(放弃rebase所在分支的修改,直接使用其他分支
git rebase --skip
- 可以使用--abort终止,还原操作之前的场景
# 转移提交
转移提交有两种操作方式
git rebase 转移提交,和使用git rebase 合并分支一样
rebase可能会冲突:可以选择如下操作
- 解决冲突
git add .
git rebase --continue
- 忽略冲突(放弃rebase所在分支的修改,直接使用其他分支
git rebase --skip
- 可以使用--abort终止,还原操作之前的场景
- 解决冲突
cherry-pick 转移提交,只能一次转移一个提交,先提交的应该要先转移方法如下:
如果master分支转到feat分支,cherry-pick:在feat中操作,如果有冲突解决后提交
checkout master回到master使用git reset --hard撤销无提交的记录
# 合并多次提交
git rebase -i [commit-id]
根据情况使用 squash 或 fixup合并多次提交
pick:保留该commit(缩写:p)
reword:保留该commit,但我需要修改该commit的注释(缩写:r)
edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
squash:将该commit和前一个commit合并(缩写:s)
fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
exec:执行shell命令(缩写:x)
drop:我要丢弃该commit(缩写:d)
rebase可能会冲突:可以选择如下操作
- 解决冲突
git add .
git rebase --continue
- 忽略冲突(放弃rebase所在分支的修改,直接使用其他分支
git rebase --skip
- 可以使用--abort终止,还原操作之前的场景
# 修改指定提交
注意慎用,修改指定提交,会在指定提交之后的提交重新提交产生新的commit-id,有可能会产生多个冲突,需要一一 解决后
git add .
git rebase --continue
操作步骤:
- 找到需要修改的[commit]的前一个[commit-id]
- 执行git rebase -i commit-id
- 设置需要修改的commit为edit,保存
- 修改代码
- 执行
git add .
git commit --amend
git rebase continue
- 如果有冲突,解决冲突,然后在执行
git add .
git rebase continue
,修改完成
rebase可能会冲突:可以选择如下操作
- 解决冲突
git add .
git rebase --continue
- 忽略冲突(放弃rebase所在分支的修改,直接使用其他分支
git rebase --skip
- 可以使用--abort终止,还原操作之前的场景