# Git实战笔记

# Git配置

  1. git config --system (基本不用,给整个计算机一次性设置)
  2. git config --global (推荐,给当前用户一次性设置) ~/.gitconfig
  3. 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,仍然会保存。

  1. 两个分支 fast forward 归于一点commit

  2. 没有分支信息(丢失分支信息)

git merge 时,默认使用fast forward 合并;也可以使用git merge --no-ff禁止fast forward的方式 ;

  1. 两个分支 fast forward ,不会归于一点commit (主动合并的分支 会前进一步)
  2. 分支信息完整(不丢失分支信息)

合并分支有两种方式: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,操作步骤如下:

  1. 在feature分支操作git rebase dev,如果是有多个提交且有冲突,那么几个提交冲突就会几次冲突解决处理。
  2. 操作git checkout dev进入dev分支,然后执行git merge feature 进行使用fast forward 合并。
  3. 删除feature分支

rebase可能会冲突:可以选择如下操作

  • 解决冲突 git add . git rebase --continue
  • 忽略冲突(放弃rebase所在分支的修改,直接使用其他分支git rebase --skip
  • 可以使用--abort终止,还原操作之前的场景

# 转移提交

转移提交有两种操作方式

  1. git rebase 转移提交,和使用git rebase 合并分支一样

    rebase可能会冲突:可以选择如下操作

    • 解决冲突 git add . git rebase --continue
    • 忽略冲突(放弃rebase所在分支的修改,直接使用其他分支git rebase --skip
    • 可以使用--abort终止,还原操作之前的场景
  2. 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

操作步骤:

  1. 找到需要修改的[commit]的前一个[commit-id]
  2. 执行git rebase -i commit-id
  3. 设置需要修改的commit为edit,保存
  4. 修改代码
  5. 执行git add . git commit --amend git rebase continue
  6. 如果有冲突,解决冲突,然后在执行git add . git rebase continue ,修改完成

rebase可能会冲突:可以选择如下操作

  • 解决冲突 git add . git rebase --continue
  • 忽略冲突(放弃rebase所在分支的修改,直接使用其他分支git rebase --skip
  • 可以使用--abort终止,还原操作之前的场景
Last Updated: 6/16/2020, 2:18:40 PM