git 简单使用
-
git clone
git@github.com:Break0504/git-test.git
-
强制覆盖本地
git fetch --all && git reset --hard origin/master
-
提交到主干
git add . && git status && git commit -a -m "提交的一些说明" && git push --all origin
git add . && git status && git commit -a -m "update" && git push --all origin
git push --all origin && git push --tags
- 添加多个远程仓库地址
比如我有2个地址
git@github.com:Break0504/start.git
git@gitee.com:Break0504/doc.git
先添第一个地址
git remote add origin git@github.com:Break0504/start.git
再添第二个地址,更多地址也类似
git remote set-url --add origin git@gitee.com:Break0504/doc.git
提交所有
git push origin --all
-
查看、创建分支 test
git branch
git branch develop
git branch release
git branch hotfix -
提交分支
git push origin develop
-
切换分支
git checkout test
git checkout master -
合并分支
把 development 合并到 mastergit checkout master
git merge develop -
删除分支
git branch -a
git branch -d test/3.0.1 && git push origin --delete test/3.0.1
git branch -D hotfix/3.0.5 -
删除tag
git tag -d 3.0.1 && git push origin --delete tag 3.0.1
git tag
git lib
-
新项目
git clone http://ip地址/test.git
cd test
touch README.md
git add README.md
git commit -m "add README"
git push -u origin master -
老项目提交到远程的空仓库
cd existing_folder
git init
git remote add origin http://ip地址/test.git
git add .
git commit -m "Initial commit"
git push -u origin master -
切换远程仓库
cd existing_repo
git remote rename origin old-origin
或者 git remote remove old-origin
git remote add origin http://ip地址/ds/test.git
git push -u origin --all
git push -u origin --tags
配置
-
查看配置,系统、用户、某项目本地仓库
git config --system --list
git config --global --list
git config --local --list -
设置本地用户
git config --global user.name "用户名"
git config --global user.email "用户邮箱" -
.gitignore 配置参考
请特别注意,一定要配置 .gitignore文件(git 提交过滤一些无用的文件)
## --------------------------------------------------------------------
## Refresh .gitignore file
## git rm -r --cached . && git add . && git commit -m 'update .gitignore'
## --------------------------------------------------------------------
.svn/
*.svn
## Java
*.class
*.war
## Dubbo
.dubbo-registry/
## Python
*.py[cod]
*.egg
*.egg-info
## *.so
dist
build
## Logs File
*.log
logs/
*/logs/
## Gradle
.gradle/
gradle/
gradlew
gradlew.bat
build/
*/build/
bin/
*/bin/
/data/release/
*/data/release/
## Maven
target/
*/target/
## Eclipse Project files
.project
.classpath
.settings/
## IntelliJ IDEA Project files
.idea
.idea/
*.iml
*.ipr
*.iws
out/
*/out/
## NodeJs
node_modules/
public/
## Vue
_vux*/
## MacOS
.DS_Store
## Windows
Thumbs.db
ehthumbs.db
Desktop.ini
*.bak
*.temp
*.tmp
- 换行符
团队统一规范代码的换行符为类 UNIX 格式,即 LF
windows、ma c系统都请配置
## 提交时转换为LF,检出时不转换
## 拒绝提交包含混合换行符的文件
git config --global core.autocrlf input
git config --global core.safecrlf true
eclipse、idea 等 ide 开发工具配置换行符为 LF,请自行百度谷歌,谢谢
mac 下可以使用 dos2unix 批量转换某目录下的文件换行符为 LF
brew install dos2unix
cd /target
find . -name '*' -exec dos2unix {} ;
或者只是转换指定的后缀文件
find . -name '*.java' -exec dos2unix {} ;
find . -name '*.xml' -exec dos2unix {} ;
find . -name '*.pro*ies' -exec dos2unix {} ;
windows 的 git 命令行工具也自带 dos2unix,同样可以使用上面(或下面)命令,来转换当前目录下的所有文件,换行符改为 LF
find . -type f -exec dos2unix {} ;
git flow 开发流
1. 简单介绍
https://www.cnblogs.com/cnblogsfans/p/5075073.html
https://www.git-tower.com/learn/git/ebook/cn/command-line/advanced-topics/git-flow
工具
mac 或者 linux 推荐终端命令使用 git flow
macOS 安装:brew install git-flow
windows 推荐使用图形工具
-
source tree 图形工具 https://www.sourcetreeapp.com
-
eclipse 原生支持,但需要开启:
help,install new software
选择对应版本的地址,比如目前2018.4月的最新版 oxygen 对应的是 http://download.eclipse.org/releases/oxygen
然后搜索 git flow,勾选 GitFlow support,安装重启即可 -
git messege 格式 git-message.md
git commit -m 'init:初始化'
git commit -m 'feat(#user):添加登录功能'
git commit -m 'opt(#user):优化登录提示功能'
git commit -m 'fix(#user):修复登录异常功能'
git commit -m 'test(#user):添加测试用户逻辑,记得删除,不推荐'
git commit -m 'test(#user):删除测试用户逻辑'
git commit -m 'refactor(#ALL):重构成dubbo项目'
git commit -m 'docs:添加前端调用文档'
git commit -m 'docs(#user):添加登录接口文档'
master 分支
项目负责人、admin 才能修改该远程分支。其他人只有查看、下载权,不能提交
develop 分支
开发人员可以修改该远程分支
其他
feature 分支
开发人员可以修改,不推荐提交发布到远程仓库
release 分支
项目负责人创建,push 到远程仓库以方便下载测试、修改
测试人员下载测试
开发人员下载修改、提交
项目负责人创建结束、删除本地和远程仓库
注意
- master 跟 develop 分支是长期存在 origin 远程仓库里的
- 其他类似 feature、release 分支,不推荐 push 到 origin 远程仓库里
- 即使 release 分支测试的时候要 push 到远程 origin 里,也请在测试完成后删掉远程仓库里的分支
权限
这里是指远程仓库 gitlab 的权限(guest、reporter、developer、master)
其实还有 admin 和 owner (项目的创建人)
在 gitlab 创建项目,master 分支默认是受保护的
developer 权限
开发人员配置该角色
master 权限
项目负责人配置该角色
git merge 合并与冲突解决
中断合并
git merge feature/test1
Auto-merging hello.java
CONFLICT (content): Merge conflict in hello.java
Automatic merge failed; fix conflicts and then commit the result.
...
有时冲突文件太多,没办法(或不想立即)一个个手动解决。完全可以通过 git merge --abort 来简单地退出合并
git status -sb
git merge --abort
git status -sb
当然,也可以使用回退来处理,参考 简单回退
单边合并
git merge -Xtheirs 或者 git merge -Xours
若有冲突,使用对方文件覆盖本地文件
feature/test1 合并到 develop。使用 feature/test1 分支 覆盖 合并到 develop
git checkout develop
git merge -Xtheirs feature/test1
误删文件夹,还原到某个提交点,相当于创建新文件,不会冲突
git checkout 3e48555
强制合并
如果分支合并时出现了冲突,而你的 remote 仓库是 github 或者 bitbucket,那么只能强上了
git branch -m master old-master
git branch -m develop master
git checkout master
git push -f origin master
简单回退
参考 http://gitbook.liuhui998.com/4_9.html
develop 分支,回退到本地仓库的某个历史提交版本,比如 commit id 为 d373d3c
git checkout develop
git reset --hard d373d3c
若同时需要覆盖远程仓库,则强制提交
git push origin develop –-force
撤销
撤销最近一次提交
git revert HEAD
撤销上上次提交
git revert HEAD^
修改最近的提交 message
git commit --amend
删除历史文件
参考 https://help.github.com/articles/removing-sensitive-data-from-a-repository/
https://gitlab.com/gitlab-org/gitlab-ce/issues/30093
https://gitlab.com/gitlab-org/gitlab-ce/issues/19376
https://www.cnblogs.com/shines77/p/3460274.html
使用 git filter-branch,比较慢,推荐下面的bfg
获取所有远程分支
git branch -r | grep -v '->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
git pull --all
删除历史文件或文件夹 data/release,注意文件路径前面不能有/
git filter-branch --force --index-filter 'git rm --cached -r --ignore-unmatch data/release' --prune-empty --tag-name-filter cat -- --all
推到远程仓库
git push origin --force --all
git push origin --force --tags
清理和回收空间
du -h .git
git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
git reflog expire --expire=now --all
git gc --prune=now
du -h .git
更快更强的方法,推荐 bfg
https://rtyley.github.io/bfg-repo-cleaner/
下载bfg-1.13.0.jar
cd /tmp
git clone --mirror git@ip地址:test/test.git
java -jar /data/app/bfg-1.13.0.jar --strip-blobs-bigger-than 2M ds-wbp.git
或者 java -jar /data/app/bfg-1.13.0.jar --delete-files *.war ds-wbp.git
注意运行中的提示,可以看到类似如下日志,gitlab 会用到里面的文件进行清理
In total, 100 object ids were changed. Full details are logged here:
/private/tmp/test.git.bfg-report/2019-01-07/10-09-47
cd test.git
du -hs
git reflog expire --expire=now --all && git gc --prune=now --aggressive
git push
du -hs
进入 gitlab,设置,仓库,cleanup,上传上文提到的目录中的 object-id-map.old-new.txt 文件,清理
最后,删除临时文件,rm -rf /tmp/test.git