git 常用配置 https://blog.csdn.net/I_am_Yong_Ge/article/details/95469621
一、 分支操作
新建分支
git branch 新分支名
切换分支
git checkout 新分支名
新建并切换分支
git checkout -b 新分支名
删除本地分支
git branch -D 分支名
删除远程分支:
git push origin --delete 分支名
重命名分支
git branch -m oldBranchName newBranchName
将重命名过的分支提交
git push origin newBranchName
查看已有的本地及远程分支
git branch -a
二、合并多次commit
git rebase -i HEAD~3
或者
指定commitid ( 需要合并的3个的前一次提交的id )
比如:
执行
git rebase -i 63e994851b22a96edfcbe55a58db63f942d57ce0
将除了第一个的pick改成s,
然后执行
git mergetool
git rebase --continue
处理冲突,直到合并
三、 忽略掉已经被git管理的文件
git rm --cached path/file
或者
git rm -r --cached path/file
然后在.gitignore文件里添加上该文件,重新提交即可
四、临时保存文件
git stash
保存当前工作进度,会把暂存区和工作区的改动保存起来。执行完这个命令后,在运行git status命令,就会发现当前是一个干净的工作区,没有任何改动。使用git stash save 'message...'可以添加一些注释
git stash list
显示保存进度的列表。也就意味着,git stash命令可以多次执行
git stash pop [–index] [stash_id]
git stash pop 恢复最新的进度到工作区。git默认会把工作区和暂存区的改动都恢复到工作区。
git stash pop --index 恢复最新的进度到工作区和暂存区。(尝试将原来暂存区的改动还恢复到暂存区)
eg .
git stash pop 2
git stash pop stash@{1}恢复指定的进度到工作区。stash_id是通过git stash list命令得到的
通过git stash pop命令恢复进度后,会删除当前进度。
git stash apply [–index] [stash_id]
除了不删除恢复的进度之外,其余和git stash pop 命令一样。
git stash drop [stash_id]
删除一个存储的进度。如果不指定stash_id,则默认删除最新的存储进度。
git stash clear
删除所有存储的进度。
五、配置
遇到文件名提示太长的问题:
git config --system core.longpaths true
解决gitk乱码问题
git config --global gui.encoding utf-8
六、diff
生成diff
进入项目根目录:git diff DEMO > DEMO.diff
则会把DEMO 项目的改动差异导入到DEMO.diff文件中
2个版本差异打包
git diff commit-id-1 commit-id-2 >> diff.txt
打开另一个DEMO项目,把差异文件给同步过来:
git apply --reject DEMO.diff
其中 DEMO.diff是第一步导出的差异文件
七、patch
patch和diff的区别
.diff文件只是记录文件改变的内容,不带有commit记录信息,多个commit可以合并成一个diff文件。
.patch文件带有记录文件改变的内容,也带有commit记录信息,每个commit对应一个patch文件。
生成patch
git format-patch commitId
生成指定commitId之后所有提交的patch
git format-patch commitId-n
生成指定commitId之前的N次提交的patch(n == 1的时候,生成指定commitId的patch)
git format-patch commitId_1..commitId_2
生成commitId_1后面直到commitId_2之间的patch
如下图
使用patch
$ git apply --stat 0001-limit-log-function.patch
# 查看patch的情况
$ git apply --check 0001-limit-log-function.patch
# 检查patch是否能够打上,如果没有任何输出,则说明无冲突,可以打上
(注:git apply是另外一种打patch的命令,其与git am的区别是,git apply并不会将commit message等打上去,打完patch后需要重新git add和git commit,而git am会直接将patch的所有信息打上去,而且不用重新git add和git commit,author也是patch的author而不是打patch的人)
$ git am 0001-limit-log-function.patch
# 将名字为0001-limit-log-function.patch的patch打上 或者git apply 0001-limit-log-function.patch
$ git am --signoff 0001-limit-log-function.patch
# 添加-s或者--signoff,还可以把自己的名字添加为signed off by信息,作用是注明打patch的人是谁,因为有时打patch的人并不是patch的作者
$ git am ./test/*.patch
# 将项目根目录里面的test文件夹中所有的patch文件 按照先后顺序打上
$ git am --abort
# 当git am失败时,用以将已经在am过程中打上的patch废弃掉(比如有三个patch,打到第三个patch时有冲突,那么这条命令会把打上的前两个patch丢弃掉,返回没有打patch的状态)
$ git am --resolved
#当git am失败,解决完冲突后,这条命令会接着打patch
如果打Patch的过程中发生了冲突(conflicts),怎么办?
解决patch冲突的过程是:
如果不想打这一系列patch了,直接:git am --abort。
如果还想打, 进行如下操作
(1) 根据git apply失败的信息,找到发生冲突的具体patch文件,然后用命令git apply --reject <patch_name>,强行打这个patch,发生冲突的部分会保存为.rej文件(例如发生冲突的文件是a.txt,那么运行完这个命令后,发生conflict的部分会保存为a.txt.rej),未发生冲突的部分会成功打上patch
(2) 根据.rej文件内容提示,修改代码,解决冲突,删除该.rej文件,重复此操作解决所有的冲突
(3) 执行 git add *** 命令,把修改部分添加进入缓存(包括:patch没有冲突,自动合并的内容和自己解决冲突的内容,只是不要加上patch文件)
(4) 最后执行 git am --resolved 解决了这条patch的冲突,接着打patch,如果没有patch了,则打patch结束,会自动把patch中的提交加入历史记录