文章目录
本文记录笔者在工作学习过程中,遇见git的问题,并列出解决办法,持续更新!!!
批量修改文件权限
find . -name `*.go` -executable | xargs chmod -x #查找有可执行权限的文件,然后把所有文件都进行chmod -x操作
简单小结
基本操作
git init 初始化仓库
git add ~ 加入到stage中
git rm 删除,并且git commit
git commit -m "" 提交
git status 查看提交的状态
git diff 查看修改的内容
git clone 克隆
git clean -xdf 清除本地所有的修改
历史版本
git log 查看日志
git log --pretty=oneline 简化版日志
git reset --hard HEAD^ 版本回退
git reset --hard id 版本回退
git reflog 记录你的每一次命令
git checkout -- file 命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令
在commit之前用命令git reset HEAD <file>可以把暂存区的修改撤销掉(unstage),重新放回工作区
远端分支
git push -u origin master 第一次推送master分支的所有内容
git push origin master 非第一次推送最新修改
若有冲突:先git pull,本地合并解决冲突,再推送
git branch --set-upstream-to=origin/dev dev 设置dev和origin/dev的链接
git remote -v 查看远端分支数据
git checkout -b dev origin/dev 拉取远端分支到本地
分支管理
git checkout -b dev 建立新分支并且切换过去
git checkout dev 切换分支
git branch [-a]|[-r] 查看分支
git branch -d 删除分支,-D 强行删除
git merge <name> 合并某分支到当前分支
git log --graph 查看分支合并图
git log --graph --pretty=oneline --abbrev-commit
git stash 暂存数据,用在工作一半时切分支,并且新代码不会在新分支里面
git stash apply git stash drop 弹出暂存,使用特定的命令删除暂存
git stash pop pop
git stash list 跟下一条命令配套使用,指定使用某一个暂存的数据
git stash apply stash@{0}
冲突管理
git merge <name>无法快速的进行合并的时候,可以使用git status看到系统给我们的冲突文件,修改后再提交即可
commit若有冲突:先git pull,本地合并解决冲突,再推送
git branch --set-upstream-to=origin/dev dev 设置dev和origin/dev的链接
git pull origin [分支名] --rebase
git status
解决冲突
git add .
git status 后提示 git rebase --continue
打标签
命令git tag <tagname>用于新建一个标签,默认为HEAD,也可以指定一个commit id;
命令git tag -a <tagname> -m "blablabla..."可以指定标签信息;
命令git tag可以查看所有标签。
命令git push origin <tagname>可以推送一个本地标签;
命令git push origin --tags可以推送全部未推送过的本地标签;
命令git tag -d <tagname>可以删除一个本地标签;
命令git push origin :refs/tags/<tagname>可以删除一个远程标签。
忽略文件
https://github.com/github/gitignore
切换、推送到远程分支
使用如下方法可以避免出现一些意外,精确的指定分支名字,可以避免出现游离状态
$ git checkout -b local_name origin/origin_name
$ git push origin local_name : origin_name
游离状态
什么是游离状态:HEAD 不指向任何分支,利用tree命令可以仔细看到HEAD的指向
当出现游离状态的时候,需要自己建立对应的本地分支即可
# 如果没有同步远程分支名
$ git checkout -b localBranch origin/branch
# 如果没有我们所需分支
$ git checkout -b newBranch
暂存而不提交
$ git stash #暂存工作状态,可以切换分支先做其他的工作
$ git stash pop #弹出暂存的工作状态,继续工作
删除没有跟踪的文件
$ git clean -f #删除没有跟踪的文件
$ git clean -fd #删除没有跟踪的文件夹
改名字
改本地的分支名
$ git branch -m oldname newname
改上一次commit信息,reset其中单个文件
#修改上一次提交的commit信息,运行命令后有提示说明,按照说明操作
$ git commit --amend
$ git reset <commit-id> <fileName> #reset commit中某一个文件
如果希望改多个commit信息,可以利用下面的命令,运行命令按照里面的提示操作即可
合并(修改)多个commit信息
#合并(修改)前面n个commit,运行命令后有提示说明,按照说明操作
$ git rebase -i HEAD~n
忽略换行符,文件权限带来的冲突
# 显示乱码
git config --global core.quotepath false
#Linux的换行符和window的换行符不同导致的冲突
$ git config --global core.autocrlf false
#修改文件权限导致的冲突
$ git config --global core.filemode false
#自动启动rebase,这样pull的时候就不会出现一些警告或者错误
$ git config --global branch.autosetuprebase always
Git 清除远端已删除的分支
可以直接使用命令
$ git fetch -p
#可以查看remote地址,远程分支,还有本地分支与之相对应关系等信息
git remote show origin
根据提示,使用命令删除即可
$ git remote prune origin
拉去远程分支
git checkout -b ac_branch origin/ac_branch 拉取远程分支到本地(方式一)
1、拉取远程分支到本地
2、在本地创建一个分支与远程分支对应
3、自动切换到刚创建好的分支
git fetch origin ac_branch:ac_branch 拉取远程分支到本地(方式二)
1、同步远程仓库(git fetch origin)
2、拉取远程分支到本地
3、在本地创建一个分支与远程分支对应
远程分支有多余的commit
远程分支A C1 -- C2 -- C3 -- C4 (远程分支多了C3 、C4两个commit)
本地分支A C1 -- C2 -- C3 -- C4 -- C5 -- C6 -- C7 (并且把C6、C7推上去)
创建新本地分支B(基于远程分支A)
git checkout -b B origin/A
通过git reset 方式回退到
本地分支B C1 -- C2
此时分支情况:
远程分支A C1 -- C2 -- C3 -- C4
本地分支A C1 -- C2 -- C3 -- C4 -- C5 -- C6 -- C7
本地分支B (新分支) C1 -- C2
在本地分支B上选择你想要的A本地分支的commit号
git cherry-pick C6
git cherry-pick C7
此时
本地分支B (新分支) :
C1 -- C2 -- C6 -- C7
再强推到远程分支A
此时远程A跟本地B就一样的了
把a分支某几个commit转移到b分支上
git cherry-pick <commit id>:单独合并一个提交
git cherry-pick -x <commit id>:同上,不同点:保留原提交者信息。
Git从1.7.2版本开始支持批量cherry-pick,就是一次可以cherry-pick一个区间的commit。
git cherry-pick <start-commit-id>..<end-commit-id>
git cherry-pick <start-commit-id>^..<end-commit-id>
前者表示把到之间(左开右闭,不包含start-commit-id)的提交cherry-pick到当前分支;
后者有"^"标志的表示把到之间(闭区间,包含start-commit-id)的提交cherry-pick到当前分支。
其中,到只需要commit-id的前6位即可,并且在时间上必须早于
注:以上合并,需要手动push代码。