1. 基本设置
设置git用户名、密码、邮箱的配置
$ git config user.name "liangfh8006"
$ git config user.password "123"
$ git config user.email "1372316821@qq.com"
查看git配置信息
$ git config --list
查看或设置全局配置:加上--global参数
$ git config --global user.name "liangfh8006"
删除git用户名、密码、邮箱的配置
$ git config --unset user.name "liangfh8006"
2. 修改代码并compare
查看当前修改和上次commit后的区别
git diff
已经提交过,又想修改某些文件,但是想放到同一次的commit事件中:
git add .
git commit --amend --no-edit
3. 根据已有分支创建新分支(不包含历史commit记录)
# 基于当前分支创建一个独立的分支new_branch
git checkout --orphan new_branch
# 添加所有文件变化至暂存空间
git add -A
# 提交并添加提交记录
git commit -am "commit message"
4. 回到过去和未来
# 回到某个历史commit_id
git reset --hard 77730b6
# 回到前k步
git reset --hard HEAD~k # k为正整数,表示向上走k步
# 显示包括未来的所有commit_id
git reflog
如果在当前分支下的某个commit_id节点重新add & commit后,git会自动使用一个新的commit_id覆盖当前分支该commit_id之后的所有记录。
5. 显示分支图
# 显示当前分支版本图
git log --oneline --graph
# 显示所有分支版本图
git log --oneline --graph --all
6. 显示所有冲突文件
git status
或者
git diff --name-only --diff-filter=U
7. 合并冲突
7.1 merge分支冲突
# 直接merge
git checkout master
git merge dev
# 若想保留merge信息可以使用
git merge --no-ff -m "merge info 1" dev
# 如有冲突要手动解决冲突,然后
git commit -am "merge info 2: solve conflict"
7.2 rebase分支冲突(比较危险,建议少用)
# 将dev分支所有节点接到master后面
git checkout dev
git rebase master
8. stash暂存区
8.1 stash使用
将代码保存至暂存区,然后可以做其他事情
$ git stash
做完其他事情,回来后恢复代码继续happy coding
$ git stash pop
查看现有stash
$ git stash list
移除stash
$ git stash drop stash@{0}
删除所有缓存的stash
$ git stash clear
8.2 从stash创建分支
$ git stash branch testchanges
8.3 只提交部分修改的文件
1) git status -s 查看仓库状态
2) git add src/components/文件名 添加需要提交的文件名(加路径--参考git status 打印出来的文件路径)
3) git stash -u -k 忽略其他文件,把现修改的隐藏起来,这样提交的时候就不会提交未被add的文件
4) git commit -m "哪里做了修改可写入..."
5) git pull 拉取合并
6) git push 推送到远程仓库
7) git stash pop 恢复之前忽略的文件(非常重要的一步)
9. checkout操作
参考链接:https://2fz1.me/2018/02/09/gitmerge/
除了checkout分支外,还可以对文件单独操作:
恢复到最近一次git操作过的状态,比如刚刚add或commit时的状态
$ git checkout --filename
如果修改过但没进行git操作执行该命令后修改会消失
恢复指定分支文件内容
比如此时在dev分支,获取master分支的文件并更新到工作区:
$ git checkout master a.txt b.txt
从其他分支merge个别文件:
### 将develop分支的个别文件merge到master分支 ###
git checkout master // 先切换到master分支
git checkout -b master_temp // 从master切一个新的分支
git merge develop // 在 master_temp 上 merge develop 分支, 如果有冲突,解决下冲突,然后 commit 掉
git checkout master // 切回master
git checkout master_temp function1.js function2.js // 合并临时分支上的 function1.js, function2.js
10. git从远程分支拉取到本地并创建
情况一:目前本地还没拉代码,直接拉分支代码
git clone -b ac_branch origin/ac_branch
情况二:本地已经拉取了代码,想拉取远程某一分支的代码到本地
git checkout -b ac_branch origin/ac_branch 拉取远程分支到本地(方式一)
git fetch origin ac_branch_remote:ac_branch_local 拉取远程分支到本地(方式二)
git pull origin ac_branch_remote:ac_branch_local 拉取远程分支到本地(方式三)
11. git推送本地分支到远程分支
git push origin ac_branch_local:ac_branch_remote
12. 删除远程分支
git push origin :ac_branch
git push origin --delete ac_branch
13. revert、reset、rebase区别
13.1 revert使用
revert会回滚某个commit并在当前节点生成新的commit节点:
撤销第前k次提交
git revert HEAD~k
撤销具体某个提交
git revert commit_id
13.2 reset使用
切换到前k个commit节点:
git reset --soft HEAD^k
git reset --soft HEAD~k
–soft 撤销commit,不撤销add,不删除工作空间的改动代码
–mixed(默认) 撤销commit,撤销add,不删除工作空间的改动代码
–hard 撤销commit,撤销add,删除工作空间的改动代码
13.3 rebase使用
# 将dev分支所有节点接到master后面
$ git checkout dev
$ git rebase master
# 将近k次commit合并为1个新的commit
$ git rebase -i HEAD~k
参数说明:
pick:保留该commit(缩写:p)
reword:保留该commit,但我需要修改该commit的注释(缩写:r)
edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
squash:将该commit和前一个commit合并(缩写:s)
fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
exec:执行shell命令(缩写:x)
drop:我要丢弃该commit(缩写:d)
有冲突时:
用”git add“命令去更新这些内容的索引(index)
继续
$ git rebase --continue
放弃
$ git rebase --abort
13.4 cherry-pick使用
# 将指定的commit_id应用于其他分支,类似于简化版的rebase:
$ git cherry-pick commit_id
# 将0safsd节点复制追加到master分支上:
$ git checkout master
$ git cherry-pick 0safsd
转移从A到B(含B不含A)的多个提交
$ git cherry-pick A..B
# 如果冲突
第一步将修改的文件重新加入暂存区(git add .)
继续
git cherry-pick --continue
放弃
git cherry-pick --abort