Git 使用笔记
Git命令
Git命令解释
- pull: 合并远程代码
- fetch: 从远程下载最新代码,但不会merge或rebase
- -all: 下载所有分支
- reset: 重置master到fetch的最新代码
- –hard: 改变本地工作树以匹配origin/master
基本配置
# 列出当前项目主要配置
git config --list
# 编辑当前项目配置文件
vi .git/config
# 修改全局配置
vi ~/.gitconfig
常用命令
# 同步远程分支
git fetch
# 列出所有分支
git branch -a
# 切换分支
git checkout new_branch
# push到远程
git push --set-upstream origin new_branch
# 删除分支
git push -d <remote_name> <branch_name>
git branch -d <branch_name>
# merge某commit, 使用cherry-pick
git cherry-pick 0d31
用户信息
git config user.name 'xulizhao'
git config user.email xulizhao@email.com
# 全局设置
git config --global user.name 'xulizhao'
git config --global user.email xulz@users.noreply.github.com
# 修改最后一次提交
git commit --amend --reset-author
vi ./git/config
# 增加
[user]
name = xulz
email = xulz@users.noreply.github.com
Stash
# 基本命令
git stash save 'your_stash_name WIP'
git stash apply stash^{/keyword}
git stash show stash ^{/keyword} -p
# 从stash创建新分支
git stash branch <new-branch-name> [stash-id]
其他命令
# 避免本地的修改提交到仓库
git update-index --assume-unchanged <file>
# 重新提交
git update-index --no-assume-unchanged <file>
Git常见场景用法
新建项目仓库
# 把当前项目加入git版本管理
git init
# 提交文件变更
echo "xulz" >> contributors.txt
git add contributors.txt
git commit -m 'Initial commit with contributors'
推送变更
# 关联远程仓库
git remote add origin git@github.com:xulz/test.git
# 推送本地变更到远程仓库
git push -u origin master
# 以上简写为$ git push
git push -u origin --all # pushes up the repo and its refs for the first time
git push -u origin --tags # pushes up any tags
# push遇到错误 ! [rejected] master -> master (non-fast-forward)
# 风险: 可能会造成remote丢失提交
git push --force --set-upstream origin master
Fork同步上游仓库
# 查看当前远程仓库
git remote -v
git remote add upstream https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY.git
# 获取更新
git fetch upstream
git checkout master
git rebase upstream/master
# rebase 优于 merge
~~git merge upstream/master~~
强制pull/处理本地冲突
如果需要保存
- 本地提交: git branch new-branch-to-save-current-commits
- 未提交变更: git stash 然后 git stash pop
# git force pull
git fetch origin master
# 删除本地commits
git reset --hard origin/master
# 删除本地untracked文件
git clean -f -d
从git删除而保留本地文件
# untrack/从git删除而保留本地文件
git rm -r --cached folder
git rm --cached file1 file2
git commit -m 'chore: remove file'
git push
删除大文件或敏感数据
java -jar bfg.jar --strip-blobs-bigger-than 100M some-big-repo.git
cd some-big-repo.git
# 清除脏数据
git reflog expire --expire=now --all && git gc --prune=now --aggressive
git push --all
部分合并分支
git checkout dev -- FILE_YOU_WANT
git cherry-pick $COMMIT_ID_YOU_WANT
撤销上次提交
# 删除提交和文件的修改
git reset --hard
# 删除提交,但保留文件修改
git reset --soft HEAD^1
# 删除文件修改后再次找回
git reflog
实践
Branch 分支使用
分支的习惯用法:
origin/master 应该始终保持生产环境可用的状态,即可部署. origin/develop 代表最新的code, 是nightly测试的重点. 如果稳定到可以release,需要为新发布创建新tag,并merge回 master.
提交规范
feat
增加新功能fix
修复问题/BUGstyle
代码风格相关无影响运行结果的perf
优化/性能提升refactor
重构revert
撤销修改test
测试相关docs
文档/注释chore
依赖更新/脚手架配置修改等workflow
工作流改进ci
持续集成mod
不确定分类的修改wip
开发中types
类型修改
Tag 标签
推荐为每次软件发布创建标签.
# 为当前版本创建tag
git tag v1.0.0
Git工作流
追踪二进制文件
git lfs install
git lfs track "*.mp3"
# uninstall
git lfs uninstall
touch **/*.mp3
git commit -a
扩展阅读
学习资源
如果是新手,强烈推荐阅读Git简明教程, 进阶必读 Pro Git中文版
- Bitbucket Git Tutorials
- how-to-merge-specific-files-from-another-branch
- Removing sensitive data from a repository
- 解决不同系统间换行符的问题
学习
GitHub
安全
- blackbox:加密存储敏感信息